使用PHP PDO在表单验证和数据库查询中将特殊字符转换为HTML实体是否真的有必要使用htmlspecialchars()
函数?
例如,我有一个简单登录系统的网站,或多或少像:
$username = (string) htmlspecialchars($_POST['user']);
$password = (string) htmlspecialchars($_POST['pass']);
$query = $dbh->prepare("select id where username = ? and password = ?")
$query->execute($username, $password);
请注意,除了有问题的功能之外我还使用类型转换。所以,有必要吗?或者我可以安全地使用$username = $_POST['user'];
?
答案 0 :(得分:3)
您的困惑很常见,因为书籍和互联网(包括php.net)中的信息和示例都具有误导性或模糊性。开发网络应用时,您可以学到的最重要的事情是 filter input, escape output 。
过滤输入 这意味着对于任何数据输入,无论是由用户在表单上提供还是由来自其他来源的文件提供,都要过滤掉任何不属于的内容。例如,如果您需要数字值,请过滤掉任何非数字字符。另一个例子是限制/确保数据的最大长度。但是,你不需要为此疯狂。例如,如果您希望一行文字可以包含字面上的任何字符组合,那么尝试使用过滤器可能只会让您的用户感到沮丧。
因此,您通常会将输入数据存储在数据库中,并提供可选的一些过滤功能。
转义输出
转义输出的含义是为给定媒体正确保护数据安全。大多数时候,这个媒体是一个网页(html)。但是,它也可以是纯文本,xml,pdf,图像等。对于html,这意味着使用htmlspecialchars()
或htmlentities()
(您可以阅读差异here)。对于其他媒体类型,您可以根据需要进行转义/转换(如果适用,则根本不转义)。
现在,您的问题是您是否应该对将用作sql查询参数的输入数据使用htmlspecialchars()
。答案是不。您不应该以任何方式修改数据。
是的,$ _POST中包含的数据应被视为危险。这就是为什么你应该1)使用预处理语句和绑定参数防止sql注入,2)正确转义/转换$ _POST中的数据如果你把它放在html中。
有许多PHP框架可以为您处理这些细节,我建议您选择并使用一个。但是,如果不这样做,您仍然可以构建安全可靠的应用程序。无论您是否使用框架,我强烈建议您阅读OWASP建议的建议。如果不这样做,只会导致Web应用程序出现安全噩梦。
答案 1 :(得分:0)
当你有一些纯文本时(例如用户输入,或者你先前存储在数据库中的用户输入,只是用SELECT取出它,或者从一个HTTP中取出的文本),你应该使用htmlspecialchars
第三方等等,并且您想将它插入HTML文档。这可以保护您免受XSS攻击。
通常,在将数据插入数据库(数据库不是HTML文档)时不应使用它。您可能希望稍后在某种非HTML表单中使用它。