Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何循环$\u GET数组并转义其所有变量?_Php_Arrays_Security_Get - Fatal编程技术网

Php 如何循环$\u GET数组并转义其所有变量?

Php 如何循环$\u GET数组并转义其所有变量?,php,arrays,security,get,Php,Arrays,Security,Get,如何转义字符串所有$\u获取内容 谢谢诸如此类的东西: foreach ($_GET as $key => $val) { $_GET[$key] = mysql_real_escape_string($val); } 但我同意佩卡的观点,这不是一个好主意。类似这样的事情: foreach ($_GET as $key => $val) { $_GET[$key] = mysql_real_escape_string($val); } <?php array_w

如何转义字符串所有$\u获取内容

谢谢诸如此类的东西:

foreach ($_GET as $key => $val)
{
   $_GET[$key] = mysql_real_escape_string($val);
}
但我同意佩卡的观点,这不是一个好主意。

类似这样的事情:

foreach ($_GET as $key => $val)
{
   $_GET[$key] = mysql_real_escape_string($val);
}
<?php
array_walk($_GET, 'mysql_real_escape_string');
?>
但我同意佩卡的观点,这不是一个好主意。


<?php
array_walk($_GET, 'mysql_real_escape_string');
?>
例如,您可以使用相同的技术修剪()其内容

有关详细信息


例如,您可以使用相同的技术修剪()其内容


有关详细信息,$\u GET superglobal是一个数组,因此您可以像其他数组一样对其进行迭代。。但是为了安全起见,你真的不应该。数组的每个参数都应该在不同的上下文中以不同的方式进行过滤/净化/转义

例如,如果您正在处理一篇博客文章,您可能会有一个标题、正文、发布日期和作者:

  • 标题可能不应该有任何html标记
  • 主体可能允许一些标记,但设置非常有限
  • 日期可能是整数(时间戳)、特定日期格式或下拉列表中的一系列数字
  • 作者可以是字符串(用户名),或者最好是作者id。如果是id,则应该是int,不需要转义

如果对它们进行相同的筛选,则会丢失每一个的上下文和用途。

$\u GET superglobal是一个数组,因此可以像其他数组一样对其进行迭代。。但是为了安全起见,你真的不应该。数组的每个参数都应该在不同的上下文中以不同的方式进行过滤/净化/转义

例如,如果您正在处理一篇博客文章,您可能会有一个标题、正文、发布日期和作者:

  • 标题可能不应该有任何html标记
  • 主体可能允许一些标记,但设置非常有限
  • 日期可能是整数(时间戳)、特定日期格式或下拉列表中的一系列数字
  • 作者可以是字符串(用户名),或者最好是作者id。如果是id,则应该是int,不需要转义
如果你对它们都进行同样的过滤,你就失去了它们各自的背景和目的。

你不应该这样做

相反,使用和来插入、操作和查询您的数据,这样就不需要逃避事情。这样你就不用担心你是否正确地逃避了事情(或者你完全忘记了什么地方,哎呀!)

你不应该这样做


相反,使用和来插入、操作和查询您的数据,这样就不需要逃避事情。这使您不用担心是否正确地避开了问题(或者您可能完全忘记了某个地方,哎呀!)

最好使用参数化的quire,但是如果已经编写了应用程序,那么返回并重写每个查询的成本会很高。这是一个经济高效的补丁,在大多数情况下都可以使用,只需确保使用Wapiti(开源)或Acunetix($)或NTOSpider($)测试您的代码即可

请记住,您可以通过GET传递数组?var[1]=test

function escape_deep($value) 
{ 
    $value = is_array($value) ? 
                array_map('escape_deep', $value) : 
                mysql_real_escape_string($value); 

    return $value; 
} 
function stripslashes_deep($value) 
{ 
    $value = is_array($value) ? 
                array_map('stripslashes_deep', $value) : 
                stripslashes($value); 

    return $value; 
} 
if(!get_magic_quotes_gpc()){
   $_GET=escape_deep($_GET);
}else{
   $_GET=stripslashes_deep($_GET);
   $_GET=escape_deep($_GET);
}
如果magic_quotes_gpc处于启用状态,则不希望添加两次斜杠。还要记住,magic_引用了,这种逃避方法并不能阻止一切。例如,此查询仍然易受攻击:

mysql\u查询(“从usesr中选择名称,其中id=“.$\u GET[id])

利用:

http://localhost/vuln.php?id=1 和睡眠(500)

补丁:


mysql\u查询(“从usesr中选择名称,其中id='$\u GET[id]”)

最好使用参数化的quire,但如果已经编写了应用程序,那么返回并重写每个查询的代价会很高。这是一个经济高效的补丁,在大多数情况下都可以使用,只需确保使用Wapiti(开源)或Acunetix($)或NTOSpider($)测试您的代码即可

请记住,您可以通过GET传递数组?var[1]=test

function escape_deep($value) 
{ 
    $value = is_array($value) ? 
                array_map('escape_deep', $value) : 
                mysql_real_escape_string($value); 

    return $value; 
} 
function stripslashes_deep($value) 
{ 
    $value = is_array($value) ? 
                array_map('stripslashes_deep', $value) : 
                stripslashes($value); 

    return $value; 
} 
if(!get_magic_quotes_gpc()){
   $_GET=escape_deep($_GET);
}else{
   $_GET=stripslashes_deep($_GET);
   $_GET=escape_deep($_GET);
}
如果magic_quotes_gpc处于启用状态,则不希望添加两次斜杠。还要记住,magic_引用了,这种逃避方法并不能阻止一切。例如,此查询仍然易受攻击:

mysql\u查询(“从usesr中选择名称,其中id=“.$\u GET[id])

利用:

http://localhost/vuln.php?id=1 和睡眠(500)

补丁:


mysql\u查询(“从usesr中选择名称,其中id='$\u GET[id]”)

这不是一个好主意。应在将传入数据插入数据库之前直接对其进行卫生处理。可能是因为某些原因,您需要这些未编码形式的变量在脚本中的其他地方。@Pekka,而不仅仅是数据库;任何使用它并需要序列化的地方。这包括SQL语句、HTML输出、shell参数化等@strager是的,绝对-我假设他在这里谈论数据库是因为
mysql\u real\u escape\u字符串
。不过,值得一提的是,这不是一个好主意。应在将传入数据插入数据库之前直接对其进行卫生处理。可能是因为某些原因,您需要这些未编码形式的变量在脚本中的其他地方。@Pekka,而不仅仅是数据库;任何使用它并需要序列化的地方。这包括SQL语句、HTML输出、shell参数化等@strager是的,绝对-我假设他在这里谈论数据库是因为
mysql\u real\u escape\u字符串
。不过,值得一提的是,w35l3y发布了一个更好的方法。Thanx,我不知道函数存在!实际上w35l3y发布了一个更好的方法。Thanx,我不知道函数存在@Russell Dias,不是根据Oops。这很奇怪,当我发表评论时,我一定在查找另一个函数。我的道歉。@Russell Dias,不是根据Oops。这很奇怪,当我发表评论时,我一定在查找另一个函数。我很抱歉。编辑了最后一行,使之成为syntact