通过PHP在GET中清除用户数据

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

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


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

不会净化$ _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 \ \\\“赖利”。

当然,每次发送一个变量时记住pg_escape_string或mysql_real_escape_string和htmlspecialchars有点乏味,这就是为什么每个人都想在脚本开始时在一个位置(错误地)执行该操作的原因。 对于HTML输出,至少可以通过定义一个名为echo(htmlspecialchars(...))的简短函数来保存一些输入。

对于SQL,最好使用参数化查询。 对于Postgres,有pg_query_params。 或者事实上,如你所提及的准备好的陈述(虽然我个人觉得它们不太适合)。 无论哪种方式,您都可以忘记SQL的“消毒”或转义,但如果您嵌入其他类型的字符串(包括HTML),则仍然必须转义。

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

(*:作为解决注入问题的一般方法,无论如何,自然而然地,在特定领域有值得做的域特定检查,并且可以执行有用的清理任务,例如从提交的值中删除所有控制字符。不是大多数PHP编码人员通过卫生处理的意思。)


如果您正在讨论清理输出的问题,我会建议您将数据库中的内容以完整的非转义形式存储,然后在回显数据时将其转义(htmlspecialchars或其他),这样您就有更多的输出选项。 请参阅此问题以获取有关清理/转义数据库内容的讨论。

在存储在postgres中,在查询中的每个变量上使用pg_escape_string来转义引号,并且通常防止SQL注入。

编辑:

我在数据库中存储数据然后检索它的通常步骤如下:

  • 调用数据库数据转义函数(pg_escape_string,mysql_escape_string等),以便转义查询中使用的每个传入的$ _GET变量。 请注意,使用这些函数而不是addslashes会导致在存储在数据库中时文本中不会有额外的斜杠。

  • 将数据从数据库中取出后,只需在任何输出的数据上使用htmlspecialchars,不需要使用stripslashes,因为不应该有额外的斜线。


  • 您必须清理所有请求,而不仅仅是POST。

    你可以使用函数htmlentities(),函数preg_replace()和正则表达式,或者通过cast来过滤:

    <?
    $id = (int)$_GET['id'];
    ?>
    

    []的

    链接地址: http://www.djcxy.com/p/71943.html

    上一篇: Sanitizing user's data in GET by PHP

    下一篇: jquery using ajax to send data and save in php