php過濾注入
防止SQL注入
opensns
對於WEB應用來說,SQL注入攻擊無疑是首要防範的安全問題,系統底層對於數據安全方面本身進行了很多的處理和相應的防範機制,例如:
$User = M("User"); // 實例化User對象
$User->find($_GET["id"]);
即便用戶輸入了一些惡意的id參數,系統也會強制轉換成整型,避免惡意注入。這是因為,系統會對數據進行強制的數據類型檢測,並且對數據來源進行數據格式轉換。而且,對於字元串類型的數據,ThinkPHP都會進行escape_string處理(real_escape_string,mysql_escape_string)。
通常的安全隱患在於你的查詢條件使用了字元串參數,然後其中一些變數又依賴由客戶端的用戶輸入,要有效的防止SQL注入問題,我們建議:
查詢條件盡量使用數組方式,這是更為安全的方式;
如果不得已必須使用字元串查詢條件,使用預處理機制(3.1版本新增特性);
開啟數據欄位類型驗證,可以對數值數據類型做強制轉換;(3.1版本開始已經強制進行欄位類型驗證了)
使用自動驗證和自動完成機制進行針對應用的自定義過濾;
欄位類型檢查、自動驗證和自動完成機制我們在相關部分已經有詳細的描述。
查詢條件預處理
where方法使用字元串條件的時候,支持預處理(安全過濾),並支持兩種方式傳入預處理參數,例如:
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
或者
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();
模型的query和execute方法 同樣支持預處理機制,例如:
$model->query('select * from user where id=%d and status=%d',$id,$status);
或者
$model->query('select * from user where id=%d and status=%d',array($id,$status));
execute方法用法同query方法。
㈡ php防sql注入漏洞可以用什麼函數
1.函數的構建
function inject_check($sql_str) {
return eregi('select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile', $sql_str); // 進行過濾
}
function verify_id($id=null) {
if (!$id) { exit('沒有提交參數!'); } // 是否為空判斷
elseif (inject_check($id)) { exit('提交的參數非法!'); } // 注射判斷
elseif (!is_numeric($id)) { exit('提交的參數非法!'); } // 數字判斷
$id = intval($id); // 整型化
return $id;
}?
function str_check( $str ) {
if (!get_magic_quotes_gpc()) { // 判斷magic_quotes_gpc是否打開
$str = addslashes($str); // 進行過濾
}
$str = str_replace("_", "\_", $str); // 把 '_'過濾掉
$str = str_replace("%", "\%", $str); // 把 '%'過濾掉
return $str;
}
function post_check($post) {
if (!get_magic_quotes_gpc()) { // 判斷magic_quotes_gpc是否為打開
$post = addslashes($post); // 進行magic_quotes_gpc沒有打開的情況對提交數據的過濾
}
$post = str_replace("_", "\_", $post); // 把 '_'過濾掉
$post = str_replace("%", "\%", $post); // 把 '%'過濾掉
$post = nl2br($post); // 回車轉換
$post = htmlspecialchars($post); // html標記轉換
return $post;
}
2.函數的使用實例
<?php
if (inject_check($_GET['id']))
{
exit('你提交的數據非法,請檢查後重新提交!');
}
else
{
$id = $_GET['id'];
//處理數據………………
}
?>
㈢ php如何防止sql注入
PHP防止sql注入是一個比較低級的問題了,這個問題其實在我大一上學期做第一個個人博客的時候就已經關注過了,不過乎槐簡單的說一下關於PHP防注入的方式吧。
對於現在的防注入技術其實已經成熟虧備了,對於一個站點該關心的不是防注入了,而是大規模高並發如何處理的問題,或者關於各種其他漏洞,比如現在世界上仍然有百分之80使用redis的站點存在redis漏洞,通過redis漏洞可以直接拿到機器的訪問許可權,一般來說都是直接給你種一個挖礦機器人來。
㈣ 誰能給我這一個php防sql注入的函數啊,功能越強大越好
functioninject_check($Sql_Str){//自動過濾Sql的注入語句。
$check=preg_match('/select|insert|update|delete|'|\*|*|../|./|union|into|load_file|outfile/i',$Sql_Str);
if($check){
echo'<scriptlanguage="JavaScript">alert("系統警告: 請不要嘗試在參數中包含非法字元嘗試注入!");</script>';
exit();
}else{
return$Sql_Str;
}
}
我這個是自己寫的,通過正則判斷是否含有危險關鍵字,希望採納。
㈤ php如何防止sql注入
防止SQL注入的關鍵在於避免直接將用戶的輸入插入到SQL查詢字元串中,因為這樣使得攻擊者能夠操縱查詢,從而進行注入攻擊。例如,如果用戶輸入的是 `'); DROP TABLE table;--`,那麼最終的SQL語句將變成 `DROP TABLE table;`,這將導致表被刪除。
要避免這種情況,需要採用准備語句和參數化查詢。這種方法將SQL語句和參數分開發送和解析,攻擊者無法利用注入來執行惡意SQL。以下是兩種實現方式:
首先,可以使用MySQLi擴展。
如果你使用的是非MySQL資料庫,例如PostgreSQL,可以通過使用`pg_prepare()`和`pg_execute()`方法實現類似功能。PDO(PHP Data Objects)則提供了更廣泛的兼容性。
在設置資料庫連接時,確保關閉准備模擬選項,以確保真正的SQL語句准備和參數分離。例如,如下代碼展示了如何正確設置連接:
設置錯誤模式為推薦的,以便在遇到問題時提供有用的錯誤信息。
重點在於設置`PDO`屬性為不模擬准備語句,而是真正准備語句。這樣,PHP不會自行解析SQL,而是將SQL語句發送給MySQL伺服器,防止了攻擊者注入惡意SQL。
值得注意的是,某些老版本的PHP(<5.3.6)會忽略DSN中的字元集參數。
通過參數化查詢,SQL語句與參數分離。這樣,參數和編譯過的語句結合,而不是與SQL字元串結合,避免了混淆參數和語句的攻擊機制。例如,如果`$name`變數是 `'Sarah'; DELETE FROM employees`,實際執行的SQL語句將為 `'Sarah'; DELETE FROM employees'`,而不是刪除整個表。這保證了數據安全。
另一個優勢是,對於重復執行的相同查詢,SQL語句只需編譯一次,可以提高執行效率。
對於需要執行動態查詢的場景,最好採用白名單限制輸入。准備語句僅用於准備參數,查詢結構不能改變。
㈥ thinkphp怎麼做才是安全的sql防注入
主要的sql注入來源於數據請求。比如表單的提交。攻擊者會在請求中帶上一些可執行的sql語句。達到注入的目的。
Thinkphp內置了數據過濾機制。可以有效的將一些存在風險的符號過濾處理。具體如下:
1、Thinkphp3.2版本:
使用I方法來獲取post、get等參數。例如獲取id參數。
I('get.id');
I('post.id');
2、Thinkphp5.0版本:
由於5.0版本將單字母方法取消了,取而代之的是一些語義更明確的方法名,I方法對應的是input方法。所有使用input方法來獲取post、get等參數。例如獲取id參數。
input('get.id');
input('post.id');
更多案例可以查看Thinkphp官方文檔。
㈦ ThinkPHP如何防止SQL注入
(1)查詢條件盡量使用數組方式,這是更為安全的方式;
(2)如果不得已必須使用字元串查詢條件,使用預處理機制;
(3)使用綁定參數;
(4)強制進行欄位類型驗證,可以對數值數據類型做強制轉換;
(5)使用自動驗證和自動完成機制進行針對應用的自定義過濾;
(6)使用欄位類型檢查、自動驗證和自動完成機制等避免惡意數據的輸入;
(7)做一些過濾。