通过PHP消毒在获取用户数据(Sanitizing user's data in GET b

2019-06-18 17:37发布

你如何通过PHP消毒在$ _GET -变量数据?

我通过消毒在GET只有一个变量strip_tags 。 我不知道我是否应该清理一切与否,因为在将数据Postgres的最后一次,这个问题是最容易使用的解决pg_prepare

Answer 1:

你如何通过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']));

然后,当你在你的用户名,它会莫名其妙的变成了“&”“和;” 在数据库中,如果你在你的用户名有一个撇号,它会变成两个页面上的撇号。 然后,当你有这些字符的形式,很容易落得双逃逸的事情时,他们编辑,这就是为什么这么多坏的PHP的CMS结束了破碎的文章标题,如“距离O新书\\\\ \\\\\\\\\\\\\\\“赖利”。

当然,记住pg_escape_string或mysql_real_escape_string,并用htmlspecialchars每次发送变量退房时间是有点乏味,这就是为什么每个人都希望在脚本的开始做(不正确地)在一个地方。 对于HTML输出,你至少可以通过定义,做回声(用htmlspecialchars(...))短名称的功能节省一些打字。

对于SQL,你最好使用参数化查询。 对于Postgres的有pg_query_params 。 或者实际上,预处理语句,你提到的(虽然我个人觉得他们不太易于管理)。 无论哪种方式,你就可以忘掉“消毒”或转义SQL,但是如果你在其他类型的字符串,包括HTML嵌入你仍必须逃脱。

用strip_tags()不是治疗输入HTML显示的一个好方法。 在过去,它已经有安全问题,因为浏览器解析器实际上是他们一个什么样的标签可以是比你想象的解释要复杂得多。 用htmlspecialchars()几乎总是改为使用正确的事情,因此,如果有人键入小于号,他们就会得到一个字面小于号和找不到一半的文本神秘地消失。

(*:作为一般的方法来解决注入问题,反正当然也有特定于域的检查,这是值得做的特殊领域,也有你可以像从提交的数据中删除所有的控制字符有用的清理任务,但这是。不是大多数PHP程序员的意思消毒。)



Answer 2:

如果你在谈论消毒输出,我会建议在您的数据库中存储的内容在它的全部,转义形式,然后逃脱它( 用htmlspecialchars或东西)当你呼应出的数据,这样,你有输出更多的选择。 见这个问题要问的消毒/逃脱数据库内容的讨论。

在Postgres的存储方面,使用pg_escape_string查询每个变量,逃跑报价,一般防止SQL注入。

编辑:

我在一个数据库中存储数据,然后检索它通常的步骤是:

  1. 调用数据库的数据避开功能(pg_escape_string,函数mysql_escape_string等),以逃避在查询中使用的每个传入$ _GET变量。 请注意,存储在数据库中,当没有在文中多余的斜线使用这些功能,而不是addslashes的结果。

  2. 当你的数据备份出来的数据库,你可以用任何输出的数据用htmlspecialchars,没有必要用stripslashes,因为应该没有多余的斜线。



Answer 3:

你必须清理所有请求,不仅出任GET。

您可以使用该功能ヶ辆() ,该函数的preg_replace()与正则表达式,或者通过投过滤器:

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

[]的



Answer 4:

根据往哪里去净化你的投入。

  • 如果你显示它(在页面上或作为输入字段的值),使用htmlspecialchars和/或str_replace
  • 如果你把它当作另一种类型,投它。
  • 如果它包括在SQL查询,逃避它使用相应的功能,也许剥离HTML标签,如果你想那些完全拆除(这是不一样逃脱相同)。

同为POST或从您的数据库甚至数据,因为你的数据库里面的数据一般不应该逃脱。

有两件事情你应该检查:

  1. 您输入的编码与PHP脚本/输出/ DB表
  2. 如果你有[magic_quotes_gpc][1]启用,则应禁用它(只要你能)或stripslashes() GET,POST和cookie的值。 magic_quotes_gpc已过时,你应该清理你操纵数据,这取决于使用该数据。


文章来源: Sanitizing user's data in GET by PHP