一尘不染

用PHP清理GET中的用户数据

php

如何通过PHP清理$ _GET -variables中的数据?

我只对GET
by中的一个变量进行了消毒strip_tags。我不确定是否应该清理所有内容,因为上次将数据放入Postgres时,使用可以最轻松地解决问题pg_prepare


阅读 301

收藏
2020-05-29

共1个答案

一尘不染

如何通过PHP清理$ _GET -variables中的数据?

清除$ _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']));

然后,当用户名中包含“&”时,它将神秘地变成“&amp;”
在您的数据库中,并且如果您的用户名中包含单引号,它将在页面上变成两个撇号。然后,当您拥有一个包含这些字符的表单时,在编辑它们时很容易以双转义形式结束它们,这就是为什么这么多不良的PHP
CMS都会以诸如“来自O \\\\ \\\\\\\\\\\\'Reilly”。

自然,每次发送变量时都要记住pg_escape_string或mysql_real_escape_string和htmlspecialchars有点乏味,这就是为什么每个人都希望在脚本开始时在一个位置(不正确)进行操作。对于HTML输出,您至少可以通过定义一个具有回声(htmlspecialchars(…))的短函数来保存一些键入。

对于SQL,最好使用参数化查询。对于Postgres,有pg_query_params。或者确实是您提到的准备好的语句(尽管我个人认为这些语句较难处理)。无论哪种方式,您都可以忘记对SQL进行“清理”或转义,但是如果您嵌入其他类型的字符串(包括HTML),则仍然必须转义。

strip_tags()不是处理HTML显示输入的好方法。过去,它存在安全性问题,因为浏览器解析器在解释标记的含义上实际上比您想象的要复杂得多。htmlspecialchars()几乎始终是正确的选择,因此,如果有人键入小于号,他们实际上会得到一个文字小于号,而不会发现一半文字神秘地消失。

(*:无论如何,这都是解决注入问题的通用方法。自然地,值得在特定字段上进行特定于域的检查,并且可以执行一些有用的清除任务,例如从提交的值中删除所有控制字符。但这是不是大多数PHP编码人员所说的清除含义。)

2020-05-29