这是最好的方法吗?
我应该对每个查询中的每个值执行此操作吗? GET和POST?
addslashes(mysql_real_escape_string())
过度杀伤吗?
答案 0 :(得分:6)
如果你正在使用mysql_query()那么是的,mysql_real_escape_string()是最好的方法。是的,您必须将它应用于您混合到sql语句中的每个参数。 E.g。
$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语句中传输,因此不需要转义。它更安全(因为你不能忘记转义或错误/错误的字符集),通常比将参数混合到语句中更快,甚至更简单。 e.g。
$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 :(得分:1)
您需要在脚本中建立一个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()。