使用htmlspecialchars函数与PDO准备和执行

时间:2016-07-16 12:15:52

标签: php pdo htmlspecialchars

使用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'];

2 个答案:

答案 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表单中使用它。