在SQL注入方面这是安全的吗?

时间:2011-04-20 20:00:53

标签: php mysql sql-injection

目前越来越多地进入MySQL。这是我不太讨厌的事情,但我现在想用它写一些脚本。

我的问题很简单,我正在编写一个搜索脚本,只是想知道我的php代码是否可以阻止一些SQL注入..代码:

$orig = $_POST['term'];
$term = mysql_real_escape_string($orig);
$sql = mysql_query("select * from db1 where content like '%$term%' ");

这可以吗?或者,如果任何人有更容易/更好/更安全的方式来做这件事,请倾向于让我知道。

5 个答案:

答案 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)或类型检查。