Php 如何循环$\u GET数组并转义其所有变量?
如何转义字符串所有$\u获取内容 谢谢诸如此类的东西: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
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