как обезопасить $ _GET - PullRequest
       3

как обезопасить $ _GET

0 голосов
/ 19 октября 2018

Я пытаюсь защитить свои $_GET входы, все работает, проблема в том, что $_GET['action'] не может пройти preg_match() и всегда приводит к:

"действие недействительно"

Я не знаю, почему это происходит, действие может иметь только два значения, как или ненавидеть, которые оба в нижнем регистре, но все еще не могут передать его.

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 голосов
/ 19 октября 2018

Если вам нужно проверить, что строка полностью состоит из букв, вы можете использовать ctype_alpha().

Код: ( Demo )

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

Вывод:

all alphabetical

Если вам необходимо проверить, является ли переданное значение like, hate или [что-то еще];создать массив «белого списка» для поиска значения.

Код: ( Демо )

$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.] Если вы также хотите разрешить заглавные буквы, вы можете добавить i после конечного разделителя шаблона (%), чтобы он выглядел как %^[a-z0-9.]{4,69}$%i или %^[a-z\d.]{4,69}$%i.

_lower - это странная вещь, добавляемая к имени вашей переменной, потому что вы не вызываете никаких функций, которые приводят строку в нижний регистр.

0 голосов
/ 19 октября 2018

Общее количество действий ограничено.Более безопасно вообще не использовать пользовательский ввод.Вместо этого используйте оператор 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"];
}

Здесь у вас есть гарантия, чтодействие действительно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...