PHP将解析查询字符串,并将这些值注入$_GET超全局数组($_POST如果使用POST,btw在表单中完成,则相同).
在您的情况下,$_GET数组将包含:
array
'a' =>
array
0 => string 'asd' (length=3)
1 => string 'asdasd' (length=6)
'b' =>
array
0 => string '$a' (length=2)
Run Code Online (Sandbox Code Playgroud)
查询字符串中传递的每个值都将由PHP放入$_GET数组中,如果需要,[]在查询字符串中使用时创建子数组.
但这并不会导致任何类型的"代码执行":只要你正确处理输入(即不信任输入并使用eval它,或任何类似的坏主意),就没有风险代码注入.
如果您不确定如何获得安全,那么您至少可以过滤$ _GET数组.这是功能:
function filter_url($url)
{
if (is_array($url))
{
foreach ($url as $key => $value)
{
// recurssion
$url[$key] = filter_url($value);
}
return $url;
}
else
{
// remove everything except for a-zA-Z0-9_.-&=
$url = preg_replace('/[^a-zA-Z0-9_\.\-&=]/', '', $url);
return $url;
}
}
Run Code Online (Sandbox Code Playgroud)
现在您可以像这样过滤$ _GET:
$_GET = filter_url($_GET);
Run Code Online (Sandbox Code Playgroud)
这将基本上从可疑字符(如[])中清除$ _GET数组.
谢谢
有人对你撒了谎,你不会执行任何操作,你只会发送一个数组而不是一个普通变量。
试试这个代码
<?php
$x = $_GET['x'];
var_dump($x);
?>
Run Code Online (Sandbox Code Playgroud)
并使用 ?x=1 访问它,然后使用 ?x[a]=1&x[b]=2 这是预期的行为,而不是注入,并且您无法使用它运行任何代码。