1

我有一个列出电影的表格,并且包含了一个简单的搜索功能。我在表单中有一个文本字段,可以输入标题或关键字,然后提交表单。

完成这项工作的 php/mysql 代码是:

$find = $_POST['find'];
$find = mysql_real_escape_string($find);
$find = htmlspecialchars($find);
$sql = "SELECT * FROM tbl_buyerguide WHERE rel_date BETWEEN NOW() AND DATE_ADD(now(), INTERVAL 2 MONTH) AND title LIKE '%".$find."%' ORDER BY title";

其中 'find' 是搜索表单中文本输入的名称。

这对于满足所需目的的搜索功能来说已经足够好了。

我对所有人的问题是:

mysql_real_escape_string 和 htmlspecialchars 是否足以使我的搜索表单安全?

我已经阅读了我可以在 stackoverflow 上找到的所有关于此的问题,但我真的希望知道的人对我说“是的,这就是你所需要的”,或者“不,你还需要考虑帐户 ...”。

提前致谢。干杯艾尔。

4

2 回答 2

4

记住这句格言:过滤进来,逃避

您没有在那里输出该术语,那么为什么要出于 HTML 目的使用htmlspecialchars()?

相反,只为数据库转义它(您应该使用准备好的语句,但这是另一点)。所以你应该在那里使用 htmlspecialchars 。

相反,当您将变量输出到 HTML 页面时,您应该将其转义为 HTML(再次使用htmlspecialchars)。

现在,您正在混合使用数据库和 html 转义,这将导致两者都无效......

于 2013-06-21T01:34:43.843 回答
2

是的,让它安全就足够了……你也可以把 strip_tags() 扔进去……

虽然我只会用一行来做......而不是使用三个

   $find = htmlspecialchars(mysql_real_escape_string($_POST['find']));

但要真正使其安全和最新,您应该停止使用 mysql_* 函数,因为它们已被弃用,并且将在 PHP 的任何未来版本中删除......

您应该改为切换到 mysqli_* 或 PDO,并实现为您处理安全性的准备好的语句。

示例...在 PDO 中

   $db = new PDO('mysql:server=localhost;dbname=test', 'username', 'password');

   $find = $_POST['find'];

   $query = $db->prepare('SELECT * FROM tbl_buyerguide WHERE rel_date BETWEEN NOW() AND DATE_ADD(now(), INTERVAL 2 MONTH) AND title LIKE :like ORDER BY title');
   $query->bindValue(':like', '%' . $find . '%');
   $query->execute();
于 2013-06-21T00:34:28.300 回答