Короткий вывод: инъекция работает, потому что программист склеивает SQL-запрос из строк, а пользовательский ввод в этой склейке ничем не отделён от самого кода запроса.
Причина в деталях: если запрос собран через прямую склейку с переменной login, а loginвзятпрямоизформы,топользовательможетвписатьтуданеимя,акусокSQL,вродеусловияOR1=1,итогдаусловиевзапросестановитсявсегдаистинным,базаотдаётданные,которыеотдаватьнедолжнабыла.
Почему так вообще возможно: SQL не отличает текст, который ввёл человек, от части кода запроса, для базы это просто одна строка символов, и если её не подготовить правильно, опасный кусок выполнится как обычная часть команды.
Лечится это одним способом: подготовленные выражения через PDO или mysqli, где значения передаются отдельно от текста запроса и физически не могут превратиться в код.
Ответить на вопрос