Проверка на безопасность

164
26 января 2019, 14:10

Есть ли уязвимости в данном коде?

if (isset($_COOKIE['lang'])) {
    $language = $_COOKIE['lang'];
    $result = "en";
    if (in_array($language, $LANGS)) {
        $result = $language;
    }
    @setcookie("lang", $result, time() + 14 * 24 * 3600, "/");
    include_once("../sys/lang/".$result.".php");
}  else {
    $language = "en";
    if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
        $language = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
    }
    $result = "en";
    if (in_array($language, $LANGS)) {
        $result = $language;
    }
    @setcookie("lang", $result, time() + 14 * 24 * 3600, "/");
    include_once("../sys/lang/".$result.".php");
}
Answer 1

Проверяйте куку не на существование, а на пустоту. Плюс размер вашего кода можно уменьшить.

Готовый вариант:

$result = 'en';
if(!empty($_COOKIE['lang']) && in_array($_COOKIE['lang'], $LANGS)) {
    $result = $_COOKIE['lang'];
}else if(!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
    $language = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
    if (in_array($language, $LANGS)) $result = $language;
}
setcookie('lang', $result, time() + 14 * 24 * 3600, '/');
include_once('../sys/lang/'.$result.'.php');
Answer 2

Не понятно что вы хотели бы услышать, но конечно же не безопасно, простой кайс взлома.

  1. Пишем скрипт test.php
  2. Аплодим на сайт через форму
  3. Находим coockie lang='../../../uploads/test.php'
  4. Success!

Содержимое test.php

<?php
  echo 'test';
Answer 3

Для PHP7+ можно использовать оператор объединения с null ??.

Будет так:

$result = $_COOKIE['lang'] ?? (
    isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) : 'en'
);
if (!in_array($result, $LANGS)) $result = 'en';
setcookie('lang', $result, time() + 14 * 24 * 3600, '/');
include_once('../sys/lang/'.$result.'.php');
READ ALSO
Свой json response в Laravel 5

Свой json response в Laravel 5

Пробую построить свое API на Laravel

181
Защищенная отправка GET запроса через URLOpenBlockingStream

Защищенная отправка GET запроса через URLOpenBlockingStream

В общем я отправляю GET запрос с приставкой https:// на свой хост на котором установлен SLL сертификат c поддержкой HSTS, SSI, Wildcard и проверка подлинности...

149
Выйти на других устройства при логине Wordpress?

Выйти на других устройства при логине Wordpress?

Подскажите, пожалуйста, как сделать так, чтобы после логина в админку Wordpress параллельно происходил выход на других устройствах

163