如何保护$ _GET

时间:2018-10-19 06:32:15

标签: php mysqli

我正在尝试保护我的$_GET输入,确保一切正常,问题是$_GET['action']无法通过preg_match()并始终导致:

  

“操作无效”

我不知道为什么会发生这种情况,该动作只能有两个值,例如like或hate,都用小写字母表示,但仍然无法传递。

if(isset($_GET['username']) && isset($_GET['action']))
{
    $username = $_GET['username'];  
    $action = $_GET['action'];

    $user_filter_a = mysqli_real_escape_string($username);
    $user_filter_b = mysqli_real_escape_string($user_filter_a);
    $user_filter_c = strip_tags($user_filter_b);

    $action_filter_a = mysqli_real_escape_string($action);
    $action_filter_b = mysqli_real_escape_string($action_filter_a);
    $action_filter_c = strip_tags($action_filter_b);
    $action_filter_c_lower = strip_tags($action_filter_b);

    if(preg_match('%^[a-z0-9\.]{4,69}$%',$user_filter_c))
    {
        if(preg_match('%^[a-z]$%',$action_filter_c_lower))
        {
           if($action_filter_c_lower=='like')
           {
               echo 'you have liked this post';
           }elseif(action_filter_c_lower=='hate')
           {
               echo 'you have hated this post';
           }
        }else
        {
            echo 'action is not valid';
        }
    }else
    {
        echo 'username is not valid';
    }

2 个答案:

答案 0 :(得分:3)

当您需要验证字符串完全由字母组成时,可以使用ctype_alpha()

代码:(Demo

$string = 'asdgadsfg';
if (ctype_alpha($string)) {
    echo "all alphabetical";
} else {
    echo "not entirely alphabetical";
}

输出:

all alphabetical

如果您需要检查提交的值是likehate还是[其他];创建一个“白名单”数组以查找值。

代码:(Demo

$string = 'like';
$whitelist = ['like', 'hate'];
if (in_array($string, $whitelist)) {
    echo "valid: $string";
} else {
    echo "invalid: $string";
}

输出:

valid: like

其他提示:

if(isset($_GET['username']) && isset($_GET['action']))

可以更简单地写为:

if (isset($_GET['username'], $_GET['action'])) {

只有在将数据应用于查询之前,您才应该执行转义操作,这样就不会意外破坏数据或使自己困惑。老实说,我总是使用准备好的语句来构建用户提交的数据的查询,因此,我建议您研究该主题。

在正则表达式中,不需要在字符类中转义一个点,因此字符类可以如下所示:[a-z0-9.]如果还希望使用大写字母,则可以添加{{ 1}}在结束模式定界符(i)之后,使其看起来像%%^[a-z0-9.]{4,69}$%i

%^[a-z\d.]{4,69}$%i附加到变量名很奇怪,因为您没有调用任何使字符串小写的函数。

答案 1 :(得分:0)

操作总数有限。完全不使用用户输入更为安全。而是使用带有默认操作的switch语句:

$userAction = strtolower($_GET['action']);
switch($userAction) {
    case "like":
        $action = "like";
        break;
    case "hate":
        $action = "hate";
        break;
    default:
        $action = "default-action";
}

或者,您可以在数组中包含有效操作的列表:

$validAction = ["like","hate","other"];
$action = "";
if (in_array($_GET["action"],$validAction)){
    $action = $_GET["action"];
}

这里您可以确保该操作有效。