【问题标题】:Using htmlspecialchars function with PDO prepare and execute使用带有 PDO 准备和执行的 htmlspecialchars 函数
【发布时间】:2016-11-19 13:11:19
【问题描述】:

在表单验证和数据库查询中使用htmlspecialchars()函数的PHP PDO将特殊字符转换为HTML实体真的有必要吗?

例如,我有一个带有简单登录系统的网站,或多或少像:

$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


    【解决方案1】:

    您的困惑很常见,因为书籍和互联网(包括 php.net)中的信息和示例具有误导性或模棱两可。在开发 Web 应用程序时,您可以学到的最重要的东西是 filter input, escape output。

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

    因此,您通常会将输入数据存储在数据库中,并预先提供一些可选的过滤。

    转义输出 转义输出的意思是正确地确保给定媒体的数据安全。大多数时候,这种媒体是网页 (html)。但是,它也可以是纯文本、xml、pdf、图像等。对于 html,这意味着使用htmlspecialchars() 或htmlentities()(您可以阅读差异here)。对于其他媒体类型,您将视情况进行转义/转换(如果合适,则根本不进行转义)。

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

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

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

    【讨论】:

      【解决方案2】:

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

      一般来说,在将数据插入数据库时​​不应该使用它(数据库不是 HTML 文档)。您可能希望稍后在某些非 HTML 表单中使用它。

      【讨论】:

      • 实际上,当用户填写登录表单,并且用户名/密码确实有效后,会创建一些会话变量。其中之一是$_SESSION['user'] = $username,它将显示在导航栏上。所以在这种情况下,应该使用htmlspecialchars,对吧?
      • @GPraz — 当从任何地方(包括 SESSION 超全局)获取用户名(表示为纯文本)然后将其放入 HTML 文档中时,是的,您应该使用 htmlspecialchars。
      猜你喜欢
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 2012-07-02
      • 2014-09-16
      相关资源
      最近更新 更多