目前越来越多地进入MySQL。这是我不太讨厌的事情,但我现在想用它写一些脚本。
我的问题很简单,我正在编写一个搜索脚本,只是想知道我的php代码是否可以阻止一些SQL注入..代码:
$orig = $_POST['term'];
$term = mysql_real_escape_string($orig);
$sql = mysql_query("select * from db1 where content like '%$term%' ");
这可以吗?或者,如果任何人有更容易/更好/更安全的方式来做这件事,请倾向于让我知道。
答案 0 :(得分:5)
为避免在未设置$_POST['term']
的情况下发出警告:
if (isset($_POST['term'])) {
$term = mysql_real_escape_string($_POST['term']);
$sql = mysql_query("select * from db1 where content like '%$term%' ");
// rest of sql query
}
答案 1 :(得分:3)
是的,SQL注入是安全的。如果您想使用更系统的方法来避免SQL注入问题,我建议学习使用PDO和参数化查询。
答案 2 :(得分:1)
是的mysql_real_escape_string
答案 3 :(得分:0)
标准转义通常不足以用于LIKE
子句中使用的值。除非您希望用户指定自己的%
占位符,否则您应该添加:
$term = mysql_real_escape_string($_POST['term']);
$term = addcslashes($term, "%_");
准确地说,这只是一个非常大的表的问题,LIKE查询中过多的%%%%
占位符注入会使数据库服务器减速。
答案 4 :(得分:0)
在您的情况下,mysql_real_escape_string将阻止SQL注入,因为它会转义单引号,并且您的字符串设置在单引号之间。因此,无论如何,$ term将始终只是SQL的简单字符串。
如果您有类似
的内容select * from A where id = $number
然后没有逃避会阻止注射:
0; drop A;
为防止出现这种情况,您可以使用预准备语句(PDO)或类型检查。