PHP安全$ _GET与否

时间:2010-08-02 15:01:49

标签: php get

我们有网址:

http://site.com/index.php?action=show
模板中使用

$_GET['action']来检查?action=

的值
switch ($_GET['action']) {
    case = "show" {
        $match_show = true;
    }
}

在其他地方:

echo $_GET['action'];

使用这种结构绝对安全吗?

如何使它们安全?

感谢。

6 个答案:

答案 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'; 
}

优点:

依靠内置的清理过滤功能,确保:

  • 安全修复程序在PHP修补时可用
  • 一致/标准过滤
  • 固态过滤器实施(在性能和安全性方面)
  • 还提供明确的默认情况

缺点:

  • 语法有点难以记住
  • 如果您修改超级全局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本身是不安全的,它可以在几个方面被利用,为了一个好的阅读和示例我建议你阅读这篇文章

http://articles.sitepoint.com/article/php-security-blunders

答案 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';