提问人:GPraz 提问时间:7/16/2016 更新时间:7/17/2016 访问量:3519
将 htmlspecialchars 函数与 PDO 一起使用 准备和执行
Using htmlspecialchars function with PDO prepare and execute
问:
在表单验证和数据库查询中使用 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'];
答:
当您有一些纯文本(例如用户输入,或您以前存储在数据库中并刚刚用 SELECT 从中取出的用户输入,或通过 HTTP 从第三方获取的文本等)并且想要将其插入到 HTML 文档中时,您应该使用。这可以保护您免受 XSS 的攻击。htmlspecialchars
通常,在将数据插入数据库(数据库不是 HTML 文档)时不应使用它。您可能希望稍后在某种非 HTML 形式中使用它。
评论
$_SESSION['user'] = $username
htmlspecialchars
htmlspecialchars
您的混淆很常见,因为书籍和互联网上的信息和示例(包括 php.net)具有误导性或模棱两可。在开发 Web 应用程序时,您可以了解的最重要的事情是过滤器输入、转义输出。
滤波器输入这意味着,对于任何数据输入,无论是由用户在表单上提供,还是由来自其他来源的文件提供,都要过滤掉不属于的任何内容。例如,如果需要数值,请过滤掉任何非数字字符。另一个例子是限制/确保数据的最大长度。但是,您不需要为此发疯。例如,如果您期望一行文本可以包含字面上的任意字符组合,那么尝试提出过滤器可能只会让您的用户感到沮丧。
因此,您通常会将输入数据存储在数据库中,并根据需要事先进行一些筛选。
转义输出转义输出的含义是正确地确保给定媒体的数据安全。大多数时候,此媒体是一个网页 (html)。但是,它也可以是纯文本、xml、pdf、图像等。对于 html,这意味着使用 or(您可以在此处阅读差异)。对于其他媒体类型,您可以根据需要转义/转换(或者如果合适,则根本不转义/转换)。htmlspecialchars()
htmlentities()
现在,您的问题是是否应该使用将用作 sql 查询参数的输入数据。答案是否定的。您不应以任何方式修改数据。htmlspecialchars()
是的,$_POST中包含的数据应被视为危险数据。这就是为什么你应该 1) 防止在做的时候使用准备好的语句和绑定参数进行 sql 注入,以及 2) 如果你把它放在 html 中,则正确地转义/转换 $_POST 中的数据。
有许多PHP框架可以为您处理这些细节,我建议您选择并使用一个。但是,如果不这样做,您仍然可以构建一个安全可靠的应用程序。无论您是否使用框架,我强烈建议您阅读 OWASP 建议的建议。如果不这样做,只会导致 Web 应用程序的安全噩梦。
评论