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

时间:2009-08-21 22:46:11

标签: php get sanitization

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

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

5 个答案:

答案 0 :(得分:77)

  

如何通过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;'时,它会在你的数据库中神秘地变成'&amp; 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编码员通过消毒所表达的意思。)

答案 1 :(得分:5)

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

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

编辑:

我在数据库中存储数据然后检索它的常用步骤是:

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

  2. 当你从数据库中取回数据时,你可以在任何输出数据上使用htmlspecialchars,不需要使用stripslashes,因为不应该有额外的斜杠。

答案 2 :(得分:3)

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

您可以使用函数htmlentities(),函数preg_replace()和正则表达式,或者按强制转换过滤:

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

[]的

答案 3 :(得分:2)

根据输入的位置消毒您的输入。

  • 如果您显示它(在页面上或作为输入字段的值),请使用htmlspecialchars和/或str_replace
  • 如果您将其用作其他类型,请将其投射。
  • 如果将其包含在SQL查询中,请使用相应的函数将其转义,如果您希望完全删除它们(可能与转义不同),可以删除html标记。

对于POST或数据库中的数据也是如此,因为数据库中的数据通常不会被转义。

你应该检查两件事:

  1. 您的输入与PHP脚本/输出/数据库表的编码
  2. 如果您启用了[magic_quotes_gpc][1],则应该禁用它(无论何时可以)或stripslashes() GET,POST和COOKIE值。不推荐使用magic_quotes_gpc,您应该清理您操作的数据,具体取决于该数据的使用

答案 4 :(得分:0)

使用带有filter_var()过滤器的PHP本机函数FILTER_SANITIZE_STRING

示例:https://www.w3schools.com/php/filter_sanitize_string.asp