這是最好的方法嗎?使用mysql_real_escape_string清除我的查詢
我應該對每個查詢中的每個值都這樣做嗎? GET和POST?
是addslashes(mysql_real_escape_string())
矯枉過正?
這是最好的方法嗎?使用mysql_real_escape_string清除我的查詢
我應該對每個查詢中的每個值都這樣做嗎? GET和POST?
是addslashes(mysql_real_escape_string())
矯枉過正?
如果你使用的是mysql_query(),那麼是的,mysql_real_escape_string()是最好的方法。是的,你必須將它應用到你混入你的sql語句的每個參數。例如。
$query = "
SELECT
x,y,z
FROM
foo
WHERE
a = '". mysql_real_escape_string($_POST['a'], $mysql) . "'
AND b = '". mysql_real_escape_string($_POST['b'], $mysql) . "'
";
但是,您也可以使用準備好的語句,例如,與pdo模塊。這些參數是從sql語句中分離出來的,因此不需要轉義。它更安全(因爲你不能忘記逃跑或做錯了/錯誤的字符集),往往比參數混合語句更快,甚至更簡單。例如
$pdo = new PDO('mysql:host=localhost;dbname=test', '..', '..');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare("
INSERT INTO
foo (x,y,z)
VALUES
(:x,:y,:z)
");
$stmt->bindParam(':x', $x);
$stmt->bindParam(':y', $y);
$stmt->bindParam(':z', $z);
// insert all records (0,0,0) ... (0,1,0) ... (9,9,9)
for($x=0; $x<10; $x++) {
for($y=0; $y<10; $y++) {
for($z=0; $z<10; $z++) {
$stmt->execute();
}
}
}
編輯:和addslashes(mysql_real_escape_string())不僅是矯枉過正,但也是錯誤的。
+1用於提示準備好的報表/ PDO – karim79 2009-07-22 19:31:45
您需要在腳本中建立一個mysql連接以使用mysql_real_escape_string()。
您是否嘗試過PDO?
它可以自動防止mysql注入攻擊。
$db = new PDO("mysql:host=$dbhost;dbname=$default_dbname", $dbusername, $dbuserpassword);
$st = $db->prepare ('SELECT * from my_table WHERE owner= ? and dog = ?');
$st->execute (array('Bob', 'Rex'));
$data = $st->fetchAll();
雖然可能想在輸出上使用htmlentities()。
[停止SQL注入PHP的最佳方法](http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php) – outis 2012-03-26 02:07:18