我们有网址:
http://site.com/index.php?action=show
模板中使用 $_GET['action']
来检查?action=
:
switch ($_GET['action']) {
case = "show" {
$match_show = true;
}
}
在其他地方:
echo $_GET['action'];
使用这种结构绝对安全吗?
如何使它们安全?
感谢。
答案 0 :(得分:11)
切换的事情是可以的,因为你正在与硬编码值进行比较(但是,它是case "show":
btw。)
正如@Bruce在评论中提到的那样,你应该添加default:
个案例来捕捉列表中没有的值或空值:
switch ($_GET['action']) {
case "show":
$match_show = true;
break;
default:
// value is not on the list. React accordingly.
echo "Unknown value for 'action'".
}
第二件事是有潜在危险的,因为可以将HTML注入文档正文,更重要的是注入JavaScript。在回显之前,您应该对变量应用htmlspecialchars()
。
答案 1 :(得分:8)
$_GET
超全局默认情况下不安全,因为它可能包含特殊或编码字符以及其他不需要的文本序列。
您可以使用内置的PHP函数filter_input
根据几个标准过滤器来清理字符串(请参阅list of filters以了解可能的内容)。
示例:强>
if (!($action = filter_input(INPUT_GET, 'action', FILTER_SANITIZE_STRING))) {
$action = 'some-default';
}
优点:
依靠内置的清理过滤功能,确保:
缺点:
filter_input
(您可能不应该这样做),则$_GET
。旁注
您还可以使用in_array
检查该字段是否为一个集合,这是一种更动态的方法,可以检查您是否有一个集合。
$search = in_array($search, array('show', 'hide')) ? $search : 'some-default';
动态方法允许您安全地执行或查找目标操作,同时将数据结构中的潜在选项集存储在静态代码中。
答案 2 :(得分:3)
是的,如上所述,您必须在盲目使用之前验证任何$_GET
变量的值。但...
在使用它之前,您还应检查它是否存在。根据您在服务器上设置error_reporting()的方式,如果您尝试使用$_GET['action']
并且未在URL中指定?action=something
,那么您将获得 E_NOTICE - 未定义索引:动作,它会污染您的错误日志,或者更糟,会出现在浏览器中。
$urlAction = isset($_GET['action']) ? $_GET['action'] : null;
if (isset($urlAction)) {
// Rest of validation...
}
答案 3 :(得分:2)
PHP $_GET
本身是不安全的,它可以在几个方面被利用,为了一个好的阅读和示例我建议你阅读这篇文章
答案 4 :(得分:2)
有时当我有很多初学者为网站创建插件或模块时,我会使用类似的东西......
foreach($_GET as $key=>$value) {
if(functions_exists('clean_get_'.$key)) {
$_GET[$key]=call_user_func('clean_get_'.$key,$value);
} else {
unset($_GET[$key];
}
}
...所有的get和post值都被“神奇地”清理或删除,所以我不需要担心别人的sql-injectable插件。
或者,如果你是懒人加载的粉丝......
foreach($_GET as $key=>$value) {
if(is_file('clean_get_'.$key.'.php')) {
include_once('clean_get_'.$key.'.php');
if(functions_exists('clean_get_'.$key)) {
$_GET[$key]=call_user_func('clean_get_'.$key,$value);
} else {
unset($_GET[$key]);
}
} else {
unset($_GET[$key];
}
}
PS。代码直接写在这里,错误很可能!
答案 5 :(得分:1)
要用默认值替换空(未设置)值,请尝试:
$variable = isset($_GET['get_variable']) ? $_GET['get_variable'] : 'some-default';