Взламывают, как защитить сайт?

Здравствуйте! На сайте сделана функция, с помощью которой защищена админка. (Переадресация юзера, если права меньше требуемых)
function rights($rights){
global $http;
global $user;
if($user['rights'] < $rights) {
header('Location: '.$http.$_SERVER['SERVER_NAME']); exit;
}}


$user_id = isset($_COOKIE['uid']) ? fl($_COOKIE['uid']) : '';
$password = isset($_COOKIE['password']) ? fl($_COOKIE['password']) : '';

if($user_id && $password) {
$user = $base -> query('SELECT * FROM `users` WHERE `id` = "'.$user_id.'" AND `password` = "'.$password.'"') -> fetch_assoc();
} else {$user = false;}


Эту функцию каким-то образом обходят. Подскажите пути решения
  • Вопрос задан
  • 2736 просмотров
Решения вопроса 4
У вас в коде возможна sql инъекция.
'SELECT * FROM `users` WHERE `id` = "'.$user_id.'"
Инструкция как их избежать:
habr
php.net
Ответ написан
Комментировать
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Ну тогда хотя-бы так:
function rights($rights){
global $http, $user;
if(!isset($user['rights']) OR empty($rights) OR $user['rights'] < $rights) {
header('Location: '.$http.$_SERVER['SERVER_NAME']); exit;
}
}

$user_id = isset($_COOKIE['uid']) ? fl($_COOKIE['uid']) : '';
$password = isset($_COOKIE['password']) ? fl($_COOKIE['password']) : '';

if(!empty($user_id) && !empty($password)) {
$user = $base->query('SELECT * FROM `users` WHERE `id` = "'.mysql_real_escape_string($user_id).'" AND `password` = "'.mysql_real_escape_string($password).'"')->fetch_assoc();
} else {$user = false;}


P.S. Но явно дыра где-то в другом месте.
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
На все данные, приходящие извне, нужно применять фильтрацию регулярными выражениями.
Затем, использовать подготовленные запросы для обращения к БД через запросы.
Как защитить сайты от взлома?
Ответ написан
@Dimkin1447
if($user['rights'] AND $user['rights'] < $rights OR !$user['rights'] )
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
FanatPHP
@FanatPHP
Чебуратор тега РНР
Вариант с SQL инъекцией выглядит конечно романтично, но я бы предположил, что в этом говнокоде всё ещё проще - $rights не определена, и следовательно при лобом значении $user проверка не срабаывает.
Ответ написан
SagePtr
@SagePtr
Еда - это святое
if ($user['rights'] < $rights)
Как это должно сработать в случае, если $user = false ?
Скорее всего, из-за ошибки это условие просто принимается как false, и проверка ваша проходит.
UPD: Всё-таки возвращает true, но я бы не рекомендовал полагаться на неявные преобразования типов, тем более, начиная с PHP 7.4 это генерирует Notice, а в будущих версиях однажды может быть убрано.
Ответ написан
@flekst
SQL-inj на виду
Простейшая cookie с
uid = "uid[админа]'; --"

Поломает проверку, закоментировав остаток запроса.

Решения уже отмечали - не используйте нефильтрованные данные, проверяйте их.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы