sql注入總是無孔不入(ps:' or 1=1#),該如何安全的過濾好呢(我用的php和mysql_connect)?
可以使用 mysql_real_escape_string()
對字符串進行轉義,然后再放進 SQL。
$name = mysql_real_escape_string($_POST['name']);
mysql_query('SELECT * FROM `users` WHERE `name` = "'.$name.'"');
//改進版。防 SQL 注入,同時屏蔽 _ 和 % 字符
function escape($str) {
$str = mysql_real_escape_string($str);
$str = str_replace(['_', '%'], ['\\_', '\\%'], $str);
return $str;
}
這里有官方介紹:http://www.php.net/manual/zh/function.mysql-real-escape-string.php
個人建議還是使用一個WEB框架,常見的WEB框架都有完善的防注入機制。
例如:
簡單、快速入門的:CodeIgniter
功能更全面的:Yii (這個官網有時會被墻)
select * from users where name = @name
參數化查詢(Parameterized Query 或 Parameterized Statement)是訪問數據庫時,在需要填入數值或數據的地方,使用參數 (Parameter) 來給值。
在使用參數化查詢的情況下,數據庫服務器不會將參數的內容視為SQL指令的一部份來處理,而是在數據庫完成SQL指令的編譯后,才套用參數運行,因此就算參數中含有指令,也不會被數據庫運行。Access、SQL Server、MySQL、SQLite等常用數據庫都支持參數化查詢。