PHP安全$ _GET与否

Jam*_*mes 10 php get

我们有网址:

http://site.com/index.php?action=show
Run Code Online (Sandbox Code Playgroud)

$_GET['action']在模板中用于检查以下值?action=:

switch ($_GET['action']) {
    case = "show" {
        $match_show = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

在其他地方:

echo $_GET['action'];
Run Code Online (Sandbox Code Playgroud)

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

如何使它们安全?

谢谢.

Pek*_*ica 12

切换的事情是可以的,因为你正在与硬编码值进行比较(但是,它是case "show":顺便说一下).

正如@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'". 

}
Run Code Online (Sandbox Code Playgroud)

第二件事是有潜在危险的,因为有可能将HTML注入文档主体,更重要的是注入JavaScript.您应该htmlspecialchars()在回显变量之前应用变量.

  • 我倾向于进一步验证`$ _GET ['action']`对一个预期的动作列表,如果它不是其中一个就失败了 (2认同)

Bru*_*son 8

$_GET超全局默认情况下不,因为它可能包含特殊或编码字符等不良文字序列是安全的.

您可以使用内置的PHP函数filter_input根据几个标准过滤器来清理字符串(请参阅过滤器列表以了解可能的内容).

例:

if (!($action = filter_input(INPUT_GET, 'action', FILTER_SANITIZE_STRING))) {
    $action = 'some-default'; 
}
Run Code Online (Sandbox Code Playgroud)

好处:

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

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

缺点:

  • 语法是一个值得记住的熊
  • filter_input如果你修改超全局$_GET(你可能不应该这样做),就无法使用.

边注

您还可以检查该字段是否为使用集合之一in_array,这是一种更动态的方法,用于检查您是否具有集合之一.

$search = in_array($search, array('show', 'hide')) ? $search : 'some-default';
Run Code Online (Sandbox Code Playgroud)

动态方法允许您安全地执行或查找目标操作,同时将数据结构中的潜在选项集存储在静态代码中.