在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中不支持的操作数类型
现在这是不可接受的,因为它会停止脚本。我不需要那些变量中的数组,但它们让我烦恼。是否有任何简单的代码片段可以从这些特殊变量中删除数组。如果我真的想要一个数组,我可以在运行代码片段之前复制它。
答案 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_tags
或htmlentities
这样的简单函数不会受到影响。
答案 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已经把我击败了那部分,但已经输入了...... :)