一个简单的PHP搜索表单的安全性

时间:2013-06-21 00:30:04

标签: forms security search

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

完成这项工作的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的问题,但我真的希望知道的人只是对我说“是的,这就是你需要的全部”,或“不,你也需要考虑到......“。

先谢谢。 干杯Al。

2 个答案:

答案 0 :(得分:3)

请记住格言:过滤,退出

您没有在那里输出术语,那么为什么要使用htmlspecialchars()将其转换为HTML?

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

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

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

答案 1 :(得分: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();