mysql_real_escape是否应该将变量用于所有对数据库的查询?
答案 0 :(得分:5)
是的,总是转义您传递给查询的变量。
更好的是,使用PDO:
<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>
这样您就不需要处理转义(除非您有需要特别小心的查询)。
但如果你坚持使用MySQL扩展,那么使用mysql_real_escape_string()
。
答案 1 :(得分:2)
您是否始终保护查询参数?是的。
你应该总是使用mysql_real_escape_string
吗?否。
如果您不打算使用prepared statements,请考虑使用mysqli_real_escape
(请注意 i 改进)对包含的字符串进行编码NUL
(ASCII 0),\n
,\r
,\
,'
,"
和Control-Z。但是,可能需要采取其他预防措施。
MySQLi是现在积极开发的mysql扩展。旧的MySQL扩展只会偶尔出现错误修正,但现在已经有一段时间不再开发了。
请参阅DevZone 上的这两个教程(但同时请注意,这两篇文章都是按照互联网标准来说很古老)
答案 2 :(得分:1)
是的,出于安全原因,您应该转义所有变量。转义数字等不会改变任何东西,所以逃避它们也没有问题。你应该逃避一切,因为你可能会意外地错过任何变量。我建议使用PHP的mysql_real_escape_string()
-function或PDO的prepared statements。