2012-04-12 72 views
2

我正在使用PDO给用户输入,但现在我没有使用PDO显示来自我的MySQL数据库的内容(仍然是使用SQL命令的旧式方式..)。使用PHP PDO时,我应该清理/过滤用户输入和输出吗?

将数据插入到MySQL数据库时,是否有必要过滤/清理用户的输入?

而且,如果要走的路是消毒输出,那么消毒输出的最佳方式是什么?我很好走,如果我只使用htmlspecialchars()或我需要使用strip_tags()和其他东西吗?

我正在使用占位符和准备语句。

谢谢。

回答

6

你在这里混淆不同的消毒:

  • 的SQL sanatizing数据插入到你的数据库。通过使用params准备查询,不需要转义,PDO可以在内部执行。如果您不使用准备好的查询,请使用它们。它是防弹的(据我所知)。

  • 您从DB和输出HTML中得到的数据:在这里你有它打印到用户之前,sanatize(防止XSS),无论是使用htmlspecialchars()htmlentites()strip_tags(),这取决于你想要什么逃避或删除。

+0

如果我想逃跑的字符串,其100%安全 – 2by 2012-04-12 18:31:59

+1

你会与每个函数安全,但使用一个你需要的:'strip_tags'除去HTML代码,而不是'htmlspecialchars'至极只能协商他们(所以他们仍然会被展示,但不被浏览器解释)。 'htmlentities'也会编码像àéè这样的字符。如果您的应用程序支持UTF-8,只需使用'htmlspecialchars'。 请参阅http://stackoverflow.com/questions/7232793/should-i-use-both-striptags-and-htmlspecialchars-to-prevent-xss – Claaker 2012-04-12 18:37:14

+0

使用htmlentities()而不是htmlspecialchars()。 – 2012-04-12 18:43:47

5

如果您正确使用参数化查询,那么不需要转义。那实际上将转义的数据插入到数据库中,所以当你选择数据时你会得到逃脱回来。

但是,只是切换到PDO,不是使您的代码更安全,例如,如果你这样做

$sth = $db->prepare("INSERT INTO sometable (x) VALUES ($_GET[x])"); 

仍然完全容易受到注入攻击,因为你没有使用占位符。

+0

我正在使用占位符和准备语句。 – 2by 2012-04-12 18:30:57