$var = htmlentities($var, ENT_QUOTES);
Плохая идея. HTML-кодирование для выходного каскада, где вы используете <?php echo htmlspecialchars($var); ?>
переменных в HTML-шаблоне. Если вы попытаетесь справиться с этой проблемой на выходе во время ввода, вы получите ввод, который не обязательно кодируется в базе данных, не позволяя вам правильно сопоставлять, нарезать и сортировать его. И если вы затем выведете содержимое из базы данных без экранирования, у вас все еще есть ошибки XSS для любого контента, который приходит через средства, отличные от ввода формы.
HTML-кодирование при создании HTML и ни в какое другое время.
$var = htmlspecialchars($var, ENT_QUOTES, 'UTF-8');
Да? Это уже закодировано HTML, зачем его дважды закодировать? Гарантируется, что они будут искажать символы, такие как &
и <
, а также (из-за предыдущих htmlentities
) всех символов, отличных от ASCII.
Достаточно ли для защиты от инъекций sql?
Не совсем. В основном: здесь нет кода защиты SQL-инъекций.
Существует HTML-экранирование, но обратные слэши являются специальными символами в строковых литералах MySQL, а обратные косые черты не затрагиваются с помощью HTML-экранирования. Поэтому входные строки с завершающим обратным слэшем разбивают конец '
в запросе, делая запрос недействительным.
Так получилось, что после этого нет никаких других символов или инъекций '
в строке, нет способа использовать этот конкретный запрос; вы можете заставить его сломаться. Но как только запрос изменится, это уже не так.
Чтобы выполнить SQL-инъекцию «защита», вы должны вызвать $sqlServ->real_escape_string()
по значению непосредственно перед тем, как поместить его в строковый литерал в запросе. Но это действительно легко забыть или ошибиться. Использование параметризованных запросов последовательно является более надежным подходом и не сложнее.
*** НЕТ! *** единственный надежный способ защитить ваш код от SQL-инъекции - использовать *** параметризованные запросы ***, а не объединять ваши SQL-предложения! Прекратите тратить время на попытку «фильтровать» или «дезинфицировать» ваш SQL - просто ** используйте параметры ** и сделайте с ним! –
Не ленитесь, послушайте советы marc_s, маркеры параметров - это путь. – jarlh
Хорошее объяснение здесь: http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php – patricmj