GPr*_*raz 2 php pdo htmlspecialchars
在表单验证和数据库查询中使用 PHP PDO using htmlspecialchars()function将特殊字符转换为 HTML 实体真的有必要吗?
例如,我有一个或多或少具有简单登录系统的网站:
$username = (string) htmlspecialchars($_POST['user']);
$password = (string) htmlspecialchars($_POST['pass']);
$query = $dbh->prepare("select id where username = ? and password = ?")
$query->execute($username, $password);
Run Code Online (Sandbox Code Playgroud)
请注意,除了所讨论的函数之外,我还使用了类型转换。那么,有必要吗?或者我可以安全地使用$username = $_POST['user'];?
您的困惑很常见,因为书籍和互联网(包括 php.net)上的信息和示例具有误导性或模棱两可的含义。在开发 Web 应用程序时,您可以学到的最重要的事情是过滤输入、转义输出。
过滤输入 这意味着对于任何数据输入,无论是由用户在表单上提供还是由其他来源的文件提供,都应过滤掉任何不属于的数据。一个例子是,如果您需要一个数字值,请过滤掉任何非数字字符。另一个例子是限制/确保数据的最大长度。但是,您不必为此发疯。例如,如果您期望一行文本可以包含几乎任何字符组合,那么尝试提出过滤器可能只会让您的用户感到沮丧。
因此,您通常会将输入数据存储在您的数据库中,并预先提供一些可选的过滤。
转义输出
何谓越狱输出是适当使安全数据对于一个给定的媒体。大多数时候,这个媒体是一个网页(html)。但是,它也可以是纯文本、xml、pdf、图像等。对于 html,这意味着使用htmlspecialchars()or htmlentities()(您可以在此处阅读差异)。对于其他媒体类型,您将根据需要进行转义/转换(如果合适,则根本不进行转换)。
现在,您的问题是您是否应该htmlspecialchars()在将用作 sql 查询参数的输入数据上使用。答案是不。您不应以任何方式修改数据。
是的, $_POST 中包含的数据应该被认为是危险的。这就是为什么您应该 1) 使用准备好的语句和绑定参数来防止 sql 注入,以及 2) 如果将 $_POST 中找到的数据放在 html 中,则正确转义/转换它。
有许多 PHP 框架可以为您处理这些细节,我建议您选择并使用一个。但是,如果您不这样做,您仍然可以构建一个安全可靠的应用程序。无论您是否使用框架,我强烈建议您阅读OWASP建议的建议。不这样做只会导致您的 Web 应用程序的安全噩梦。
| 归档时间: |
|
| 查看次数: |
2551 次 |
| 最近记录: |