我正在使用PDO给用户输入,但现在我没有使用PDO显示来自我的MySQL数据库的内容(仍然是使用SQL命令的旧式方式..)。使用PHP PDO时,我应该清理/过滤用户输入和输出吗?
将数据插入到MySQL数据库时,是否有必要过滤/清理用户的输入?
而且,如果要走的路是消毒输出,那么消毒输出的最佳方式是什么?我很好走,如果我只使用htmlspecialchars()
或我需要使用strip_tags()
和其他东西吗?
我正在使用占位符和准备语句。
谢谢。
我正在使用PDO给用户输入,但现在我没有使用PDO显示来自我的MySQL数据库的内容(仍然是使用SQL命令的旧式方式..)。使用PHP PDO时,我应该清理/过滤用户输入和输出吗?
将数据插入到MySQL数据库时,是否有必要过滤/清理用户的输入?
而且,如果要走的路是消毒输出,那么消毒输出的最佳方式是什么?我很好走,如果我只使用htmlspecialchars()
或我需要使用strip_tags()
和其他东西吗?
我正在使用占位符和准备语句。
谢谢。
你在这里混淆不同的消毒:
的SQL sanatizing数据插入到你的数据库。通过使用params准备查询,不需要转义,PDO可以在内部执行。如果您不使用准备好的查询,请使用它们。它是防弹的(据我所知)。
您从DB和输出HTML中得到的数据:在这里你有它打印到用户之前,sanatize(防止XSS),无论是使用htmlspecialchars()
,htmlentites()
或strip_tags()
,这取决于你想要什么逃避或删除。
如果您正确使用参数化查询,那么不需要转义。那实际上将转义的数据插入到数据库中,所以当你选择数据时你会得到逃脱回来。
但是,只是切换到PDO,不是使您的代码更安全,例如,如果你这样做
$sth = $db->prepare("INSERT INTO sometable (x) VALUES ($_GET[x])");
仍然完全容易受到注入攻击,因为你没有使用占位符。
我正在使用占位符和准备语句。 – 2by 2012-04-12 18:30:57
如果我想逃跑的字符串,其100%安全 – 2by 2012-04-12 18:31:59
你会与每个函数安全,但使用一个你需要的:'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
使用htmlentities()而不是htmlspecialchars()。 – 2012-04-12 18:43:47