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

Using htmlspecialchars function with PDO prepare and execute

提问人:GPraz 提问时间:7/16/2016 更新时间:7/17/2016 访问量:3519

问:

在表单验证和数据库查询中使用 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'];

php pdo htmlspecialchars

评论


答:

2赞 Quentin 7/16/2016 #1

当您有一些纯文本(例如用户输入,或您以前存储在数据库中并刚刚用 SELECT 从中取出的用户输入,或通过 HTTP 从第三方获取的文本等)并且想要将其插入到 HTML 文档中时,您应该使用。这可以保护您免受 XSS 的攻击。htmlspecialchars

通常,在将数据插入数据库(数据库不是 HTML 文档)时不应使用它。您可能希望稍后在某种非 HTML 形式中使用它。

评论

0赞 GPraz 7/16/2016
实际上,在用户填写登录表单后,用户名/密码确实有效,将创建一些会话变量。其中之一是,它将显示在导航栏上。所以在这种情况下,应该使用,对吧?$_SESSION['user'] = $usernamehtmlspecialchars
0赞 Quentin 7/16/2016
@GPraz — 当从任何地方(包括 SESSION 超全局)获取用户名(表示为纯文本)然后将其放入 HTML 文档中时,是的,您应该使用 .htmlspecialchars
9赞 Rob Apodaca 7/16/2016 #2

您的混淆很常见,因为书籍和互联网上的信息和示例(包括 php.net)具有误导性或模棱两可。在开发 Web 应用程序时,您可以了解的最重要的事情是过滤器输入、转义输出

滤波器输入这意味着,对于任何数据输入,无论是由用户在表单上提供,还是由来自其他来源的文件提供,都要过滤掉不属于的任何内容。例如,如果需要数值,请过滤掉任何非数字字符。另一个例子是限制/确保数据的最大长度。但是,您不需要为此发疯。例如,如果您期望一行文本可以包含字面上的任意字符组合,那么尝试提出过滤器可能只会让您的用户感到沮丧。

因此,您通常会将输入数据存储在数据库中,并根据需要事先进行一些筛选。

转义输出转义输出的含义是正确地确保给定媒体的数据安全。大多数时候,此媒体是一个网页 (html)。但是,它也可以是纯文本、xml、pdf、图像等。对于 html,这意味着使用 or(您可以在此处阅读差异)。对于其他媒体类型,您可以根据需要转义/转换(或者如果合适,则根本不转义/转换)。htmlspecialchars()htmlentities()

现在,您的问题是是否应该使用将用作 sql 查询参数的输入数据。答案是否定的。您不应以任何方式修改数据。htmlspecialchars()

是的,$_POST中包含的数据应被视为危险数据。这就是为什么你应该 1) 防止在做的时候使用准备好的语句和绑定参数进行 sql 注入,以及 2) 如果你把它放在 html 中,则正确地转义/转换 $_POST 中的数据。

有许多PHP框架可以为您处理这些细节,我建议您选择并使用一个。但是,如果不这样做,您仍然可以构建一个安全可靠的应用程序。无论您是否使用框架,我强烈建议您阅读 OWASP 建议的建议。如果不这样做,只会导致 Web 应用程序的安全噩梦。