我有一张列出电影的表格,我已经整合了一个简单的搜索功能。 我在表单中有一个文本字段,可以输入标题或关键字,然后提交表单。
完成这项工作的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。
答案 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();