Я довольно запутан, в PHP есть так много функций, и некоторые используют это, некоторые используют это. Некоторые люди используют: htmlspecialchars()
, htmlentities()
, strip_tags()
т. Д.
Что является правильным и что вы, ребята, обычно используете?
Правильно ли это (посоветуйте мне лучше, если таковые имеются):
$var = mysql_real_escape_string(htmlentities($_POST['username']));
Эта строка может предотвратить инфляцию MySQL и XSS?
Кстати, есть ли еще какие-то другие вещи, которые нужно обратить внимание на атаку XSS и инъекцию MySQL?
РЕДАКТИРОВАТЬ
Заключить:
Если я хочу вставить строку в базу данных, мне не нужно использовать htmlentities
, просто используйте mysql_real_escape_string
. При отображении данных используйте htmlentities()
, это то, что вы все подразумеваете?
Подведем итог:
mysql_real_escape_string
используемый при вставке в базу данных htmlentities()
используемый при выводе данных на веб-страницу htmlspecialchars()
используется когда? strip_tags()
используется, когда? addslashes()
используется когда? Может ли кто-нибудь заполнить вопросительный знак?
mysql_real_escape_string used when insert into database htmlentities() used when outputting data into webpage htmlspecialchars() used when?? strip_tags() used when ?? addslashes() used when ??
htmlspecialchars примерно такая же, как htmlentities. разница: кодировки символов.
оба кодируют управляющие символы, такие как <
, >
и т. д., используемые для открытия тегов и т. д. htmlentities также кодируют символы из других языков, таких как умлауты, евро-символы и т. д. если ваши веб-сайты являются utf, используйте htmlspecialchars (), иначе используйте htmlentities ().
htmlspecialchars / entities кодируют специальные символы, поэтому они отображаются, но не интерпретируются . strip_tags УДАЛЯЕТ их.
на практике это зависит от того, что вам нужно делать.
пример … вы закодировали форум и дали пользователям текстовое поле, чтобы они могли публиковать материал. вредоносные просто пытаются
pictures of <a href="javascript:void(window.setInterval(function () {window.open('http://evil.com');}, 1000));">kittens</a> here
если вы ничего не сделаете, ссылка будет отображаться, и жертва, которая нажимает на ссылку, получает много всплывающих окон.
если вы htmlentitiy / htmlspecialchar свой вывод, текст будет там как есть. если вы strip_tag, он просто удаляет теги и отображает их:
pictures of kittens here
иногда вам может понадобиться смесь, оставляйте там теги, например <b>
(strip_tags может оставлять определенные теги там). это тоже небезопасно, поэтому лучше использовать некоторую библиотеку с полной версией против xss
процитировать руководство по php:
Возвращает строку с обратными косыми чертами перед символами, которые должны быть указаны в запросах базы данных и т. Д. Эти символы представляют собой одинарные кавычки ('), двойную кавычку ("), обратную косую черту () и NUL (байт NULL).
Пример использования addlashes () – это когда вы вводите данные в базу данных. Например, чтобы вставить имя O'reilly в базу данных, вам нужно будет его избежать. Настоятельно рекомендуется использовать специальную функцию управления СУБД (например, mysqli_real_escape_string () для MySQL или pg_escape_string () для PostgreSQL), но если используемая СУБД не имеет функции эвакуации, а СУБД использует \ для выхода из специальных символов, вы может использовать эту функцию.
Только кодируйте данные в том месте, где он входит в систему, для которой он должен быть закодирован – в противном случае вы столкнетесь с ситуациями, когда вы хотите управлять реальными данными.
Для SQL-инъекции – используйте связанные переменные, как описано в разделе Как я могу предотвратить SQL-инъекцию в PHP? (речь идет о подготовленных заявлениях, но это обязательство дает вам защиту, а не подготовку).
Для XSS – если вы пишете в HTML в точке, где указан HTML или текст. Используйте htmlentities в том месте, где вы создаете документ. Я бы не хотел хранить данные в этой форме в базе данных (за исключением, возможно, в системе с частой записью с редко читаемыми частотами, когда производительность и время доступа к ЦП / время доступа к диску становились и выдавались – тогда у меня была бы raw_ и html_ версия столбца … или просто использовать memcached или подобное).
Если вы позволяете пользователям вводить URL-адреса, вам нужно быть более осторожными, так как javascript:do_evil()
– это допустимый URI, который будет выполняться (например, в качестве href для ссылки на ссылку или (в некоторых браузерах) src изображения, которое просто загружен).
Вам нужно использовать mysql_escape_string () при вставке в базу данных и htmlentites при отображении HTML. Этого достаточно, если вы хотите предотвратить простую инъекционную атаку, но нет сомнений в многих других проблемах безопасности, о которых вам следует знать при разработке веб-приложения, а еще один крупный – поддельные подпрограммы.
htmlspecialchars () превращает &, ', ", <и> в формат сущности HTML (&," и т. д.)
htmlentities () превращает все применимые символы в их формат сущности HTML.
strip_tags () удаляет все теги HTML и PHP.
И htmlspecialchars (), и htmlentities () принимают необязательный параметр, указывающий, как обрабатывать кавычки. См. Руководство по PHP для специфики.
Функция strip_tags () принимает необязательный параметр, указывающий, какие теги не следует удалять.
$var = strip_tags ($var, '<p><br />');
Функция strip_tags () удалит даже недействительные теги HTML, что может вызвать проблемы. Например, strip_tags () выдержит весь код, который, по его мнению, является тегом HTML, даже если он неправильно сформирован, например
<b I forgot to close the tag.
Я подумал над этим быстрым контрольным списком:
php.ini
чтобы предотвратить доступ скриптов к вашим файлам cookie. PHPSESSID
пользователя (идентификатор сеанса) за пределами файла cookie , если кто-то узнает идентификатор сеанса кого-то еще, он может просто использовать его для входа в свою учетную запись Remember me
возможно, немного предупредите. PDO
игнорируют эту ошибку по умолчанию и регистрируют предупреждение в журналах. Это приводит к тому, что переменные, которые вы получаете из БД, равны нулю, в зависимости от вашего кода это может вызвать проблему безопасности. PDO
подражают подготовленным операторам. Отключите это. UTF-8
в своих базах данных, она позволяет хранить практически любой символ и избегать связанных с кодированием атак $myquery = "INSERT INTO mydb.mytable (title) VALUES(" . $user_input . ")"
значительной степени означают, что у вас есть огромный риск для SQL-инъекции. .php
файла, то всякий раз, когда ваш код загружает этот файл, он выполняет его и позволяет пользователю выполнить какой-либо код Взгляните на этот сайт PHP Security Consortium . Я нашел, что это хороший сайт для общего обзора безопасности PHP (включая SQL Injection и XSS).
Я бы не использовал htmlentities () при вставке данных в базу данных или в запросе базы данных. Если данные в вашей базе данных хранятся как сущности, эти данные тогда полезны только для того, что понимает html-объекты.
Вы должны использовать различные механизмы экранирования для разных типов вывода, например SQL – mysql_real_escape_string () , HTML – htmlentities () или htmlspecialchars () , shell – escapeshellarg () . Это связано с тем, что символы, которые являются «опасными», различны для каждого из них – нет волшебного способа сделать какие-либо данные безопасными для любого выходного носителя.
Я знаю, что это старый вопрос, но в наши дни самый проголосовавший ответ может вводить в заблуждение для новичков.
Вы никогда не должны использовать mysql_real_escape_string. Даже mysqli_real_escape_string слишком слаб, чтобы защитить вашу базу данных от SQL-инъекций. Вместо этого вы должны использовать PDO и аналогичные методы. (см. это руководство )
XSS (здесь я имею в виду: strip_tags()
, addslashes()
, htmlspecialchars()
, htmlentities()
) – здесь самый проголосовавший ответ по-прежнему верен, но я бы предложил прочитать эту статью