sql注入攻击实例mysql_MySQL 处理SQL注入攻击
MySQL ?處理SQL注入攻擊
如果您通過網頁獲取用戶輸入并將其插入到一個MySQL數據庫中,則有可能讓您對稱為SQL注入的安全問題敞開大門。本課將教您如何幫助防止這種情況發生,并幫助您保護腳本和MySQL語句。
比如當你要求用戶輸入他們的名字,這時候他們給你的不是名字而是一個MySQL語句,那么你可能會在不知不覺中運行這條SQL語句。
永遠不要相信用戶提供的數據,只在驗證后處理此數據.通常,這是通過模式匹配來完成的。在下面的示例中,用戶名限制為字母數字混合個字符,加上下劃線和長度為8到20個字符—根據需要修改這些規則。if?(preg_match("/^\w{8,20}$/",?$_GET['username'],?$matches))
{
$result?=?mysql_query("SELECT?*?FROM?users
WHERE?username=$matches[0]");
}
else
{
echo?"username?not?accepted";
}
為了演示問題,請考慮以下輸入://?supposed?input
$name?=?"Qadir';?DELETE?FROM?users;";
mysql_query("SELECT?*?FROM?users?WHERE?name='{$name}'");
函數調用應該從users表中檢索記錄,其中名稱列與用戶指定的名稱匹配。在正常情況下, $name只包含字母數字字符和空格,例如字符串 ilia。但是在這里,通過將一個全新的查詢附加到$name,對數據庫的調用變成了災難:注入的刪除查詢從用戶刪除所有記錄。
幸運的是,如果使用MySQL ,mysql_query() 函數不允許在單個函數調用中查詢堆?;驁绦卸鄠€查詢。如果嘗試堆棧查詢,則調用失敗。
但是,其他PHP數據庫擴展,例如SQLite和PostgreSQL,則會愉快地執行堆疊查詢,執行一個字符串中提供的所有查詢,并產生嚴重的安全問題。
防止SQL注入:
您可以使用perl和PHP等腳本語言巧妙地處理所有轉義字符。PHP的MySQL擴展提供了函數mysql_real_escape_string()以轉義對MySQL有特殊意義的字符。if?(get_magic_quotes_gpc())
{
$name?=?stripslashes($name);
}
$name?=?mysql_real_escape_string($name);
mysql_query("SELECT?*?FROM?users?WHERE?name='{$name}'");
Like語句中的注入
like查詢時,如果用戶輸入的值有"_"和"%",則會出現這種情況:用戶本來只是想查詢"abcd_",查詢結果中卻有"abcd_"、"abcde"、"abcdf"等等;用戶要查詢"30%"(注:百分之三十)時也會出現問題。
在PHP腳本中我們可以使用addcslashes()函數來處理以上情況,如下實例:$sub?=?addcslashes(mysqli_real_escape_string($conn,?"%something_"),?"%_");
//?$sub?==?\%something\_
mysqli_query($conn,?"SELECT?*?FROM?messages?WHERE?subject?LIKE?'{$sub}%'");
總結
以上是生活随笔為你收集整理的sql注入攻击实例mysql_MySQL 处理SQL注入攻击的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: An error was encount
- 下一篇: mysql int()_简单谈谈MySQ