如何通过PHP清理$ _GET -variables中的数据?
我只通过strip_tags
清理GET中的一个变量。
我不确定是否应该清理所有内容,因为上次将数据放入Postgres时,使用pg_prepare
最容易解决问题。
答案 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注入。
编辑:
我在数据库中存储数据然后检索它的常用步骤是:
调用数据库数据转义函数(pg_escape_string,mysql_escape_string等),以转义查询中使用的每个传入的$ _GET变量。请注意,使用这些函数而不是addslashes会导致在存储在数据库中时文本中没有额外的斜杠。
当你从数据库中取回数据时,你可以在任何输出数据上使用htmlspecialchars,不需要使用stripslashes,因为不应该有额外的斜杠。
答案 2 :(得分:3)
您必须清理所有请求,而不仅仅是POST作为GET。
您可以使用函数htmlentities(),函数preg_replace()和正则表达式,或者按强制转换过滤:
<?
$id = (int)$_GET['id'];
?>
[]的
答案 3 :(得分:2)
根据输入的位置消毒您的输入。
htmlspecialchars
和/或str_replace
。对于POST或数据库中的数据也是如此,因为数据库中的数据通常不会被转义。
你应该检查两件事:
[magic_quotes_gpc][1]
,则应该禁用它(无论何时可以)或stripslashes()
GET,POST和COOKIE值。不推荐使用magic_quotes_gpc
,您应该清理您操作的数据,具体取决于该数据的使用。答案 4 :(得分:0)
使用带有filter_var()
过滤器的PHP本机函数FILTER_SANITIZE_STRING
。