从superglobals中删除数组($ _GET,$ _POST ...)

时间:2011-11-20 08:25:47

标签: php arrays

在PHP中,根据PHP documentation,可以在$_GET$_POST$_COOKIE$_FILES$_REQUEST中包含数组。问题是那些来自用户,我可能会得到它们而不是字符串。例如,请考虑以下代码段。

<?php
if (isset($_GET['hello'])) {
    echo 'Hello, ', htmlspecialchars($_GET['hello']), '.';
}
else {
    echo '<form action="?"><input name="hello"><input type="submit"></form>';
}

看起来好吗?好吧,只要你不能工作,它将正常工作的URL。问题是黑客可以尝试制作$_GET['hello']数组。如果URL字符串看起来像?hello[]=something PHP将返回错误消息

  

警告:htmlspecialchars()要求参数1为字符串,在第3行的FILE中给出数组

好的,谁会在生产站点中启用HTML错误(另一件事是错误日志......)。但整数也是一个问题 - PHP是动态类型语言,所以它很容易接受像'2' + 2这样的代码。虽然是,但您可以使用(int)我有一些旧的代码,但没有这样做。如果字符串来自$_GET$_POST,则它也可以是数组。像array('2') + 2之类的东西会导致PHP的致命错误。

  

致命错误:第3行的FILE中不支持的操作数类型

现在这是不可接受的,因为它会停止脚本。我不需要那些变量中的数组,但它们让我烦恼。是否有任何简单的代码片段可以从这些特殊变量中删除数组。如果我真的想要一个数组,我可以在运行代码片段之前复制它。

3 个答案:

答案 0 :(得分:3)

您可以使用is_array()来检查此类内容。

if (is_array($_GET['hello']) // exit/error

或只是再次显示表格

if (isset($_GET['hello']) && !is_array($_GET['hello']) {

对于输入array('2') + 2之类的人,您不必担心太多。它已经是一个字符串,因此它不会作为PHP脚本运行。但是,根据您的范围,最好以最适合您的格式对信息进行编码。

在您的示例中,有人可能会将HTML代码注入您的get变量,从而导致网站看起来与众不同。像strip_tagshtmlentities这样的简单函数不会受到影响。

答案 1 :(得分:1)

然后你可以做这样的事情:

foreach($_POST as $key => $val) {
    if(is_array($val)) {
        unset($_POST[$key]);
    }
}

希望它在某种意义上有所帮助。

答案 2 :(得分:1)

在字符串上下文中使用它之前,我会检查它是否为字符串。

$name = (isset($_GET['name']) && is_string($_GET['name'])) ? $_GET['name'] : 'Unknown!';

或者:

if(isset($_GET['name']) && is_string($_GET['name']) {
    //do stuff
}

如果你想删除所有数组:

foreach($_GET as $key => $val) {
    if(is_array($val)) {
        unset($_GET[$key]);
    }
}
哎呀看起来Sudhir已经把我击败了那部分,但已经输入了...... :)