Задать вопрос

Точно и подробно про защиту от инъекций в php, mysql?

Здравствуйте! Перерыл кучу разной информации по поводу защиты вводимых пользователями данных, но точного объяснения, как нужно правильно защищаться не нашел. На форумах, гайдах и прочих источниках информации, всегда всё сводится к одному - человек пишет гайд, как "правильно" нужно защищаться, потом в комментариях люди пишут, что он дурак и только учит людей плохому. В итоге, нормально и точной информации никто не оставил.
Возьмём за пример такую задачу, самую элементарную и о которой постоянно говорят - защита пароля, логина на форме авторизации. Кто-то пишет, что нужно делать так:
$login = trim($_GET['login']);
	$login = strip_tags($login);
	$login = mysqli_real_escape_string($mysqli, $login);

А кто-то, что нужно так:
$login = $_GET['login'];
	$login = mysqli_real_escape_string($mysqli, $login);

В итоге, все эти варианты "забраковывают". Ответа я так и не получил. К тому же, даже если "гуглить" информацию по моему запросу, на первых местах постоянно статьи, с минусовым рейтингом(С хабра, например). Возможно, вопрос очень простой, но перечитав все статьи, я окончательно запутался. Может ли кто-нибудь дать ответ по этому вопросу? Прошу не писать про то, что нужно использовать готовые CMS и прочие решения.
Спасибо!
  • Вопрос задан
  • 2800 просмотров
Подписаться 8 Оценить 1 комментарий
Решение пользователя Сергей delphinpro К ответам на вопрос (3)
delphinpro
@delphinpro Куратор тега PHP
frontend developer
$login = trim($_GET['login']);
$login = strip_tags($login);
$login = mysqli_real_escape_string($mysqli, $login);

Почему вы думаете, что нужно менять логин пользователя, если она захотел именно такой? хочет быть <script> - пусть будет. Не ограничивайте.

нужно различать sql-инъекцию и xss-атаку
т.е. если мы пишем в базу, то
$login = mysqli_real_escape_string($mysqli, $login);
query( insert into ... );

Далее выводим на страницу
$login = query( select from ... );
echo htmlspeialchars($login);

И все счастливы.

Если у вас будет время, напишите, пожалуйста, как бы Вы написали данный код. Мне просто интересно, посмотреть на правильно реализованный код.

Код писать лень, хотя я там выше в принципе его уже написал =) только вместо mysqli_real_escape_string в реальном коде я бы использовал подготовленные выражения (и PDO вместо mysqli, хотя тут наверное, дело вкуса).
Ответ написан