gpt4 book ai didi

php - 通过 PHP 清理 GET 中的用户数据

转载 作者:IT王子 更新时间:2023-10-29 01:11:17 25 4
gpt4 key购买 nike

如何通过 PHP 清理 $_GET 变量中的数据?

我通过 strip_tags 只清理了 GET 中的一个变量。我不确定是否应该清理所有内容,因为上次将数据放入 Postgres 时,使用 pg_prepare 最容易解决问题。

最佳答案

How do you sanitize data in $_GET -variables by PHP?

清理 $_GET 中的数据。这是 PHP 脚本中常用的方法,但它是完全错误的*。

您的所有变量都应保持纯文本形式,直到您将它们嵌入到另一种类型的字符串中。没有一种形式的转义或“清理”可以涵盖您可能将值嵌入其中的所有可能类型的字符串。

因此,如果您将字符串嵌入到 SQL 查询中,则需要在退出时对其进行转义:

$sql= "SELECT * FROM accounts WHERE username='".pg_escape_string($_GET['username'])."'";

如果您要将字符串吐出到 HTML 中,则需要将其转义:

Cannot log in as <?php echo(htmlspecialchars($_GET['username'], ENT_QUOTES)) ?>.

如果您按照不知道自己在做什么的人的建议,在开始时对 $_GET 数组执行了这两个转义步骤:

$_GET['username']= htmlspecialchars(pg_escape_string($_GET['username']));

然后,当您的用户名中有“&”时,它会在您的数据库中神秘地变成“&”,如果您的用户名中有撇号,它会在页面上变成两个撇号。然后,当您有一个包含这些字符的表单时,很容易在编辑它们时出现双重转义,这就是为什么这么多糟糕的 PHP CMS 最终会出现像“O\\\\的新书”这样的 splinter 文章标题\\\\\\\\\\\\\\\'赖利”。

自然,每次发送变量时都要记住 pg_escape_string 或 mysql_real_escape_string 和 htmlspecialchars 有点乏味,这就是为什么每个人都想在脚本开头的一个地方(错误地)这样做。对于 HTML 输出,您至少可以通过定义一个具有 echo(htmlspecialchars(...)) 的短名称的函数来节省一些输入。

对于 SQL,最好使用参数化查询。对于 Postgres,有 pg_query_params .或者实际上,正如您提到的那样准备好的陈述(尽管我个人认为它们不太容易管理)。无论哪种方式,您都可以忘记“清理”或转义 SQL,但如果您嵌入其他类型的字符串(包括 HTML),您仍然必须转义。

strip_tags() 不是处理 HTML 显示输入的好方法。过去它存在安全问题,因为浏览器解析器在解释标签的含义时实际上比您想象的要复杂得多。 htmlspecialchars() 几乎总是适合使用,因此如果有人输入小于号,他们实际上会得到一个字面的小于号,并且不会发现一半的文本神秘地消失了。

(*: 无论如何,作为解决注入(inject)问题的一般方法。当然,对特定字段进行特定领域的检查是值得的,并且您可以执行一些有用的清理任务,例如从提交的值中删除所有控制字符。但这不是大多数 PHP 编码人员所说的清理的意思。)

关于php - 通过 PHP 清理 GET 中的用户数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1314518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com