Хорошо, эта тема – это очаг, я это понимаю. Я также понимаю, что эта ситуация зависит от того, что вы используете в качестве кода. У меня есть три ситуации, которые необходимо решить.
У меня есть форма, где мы должны позволять людям делать комментарии и заявления, которые используют запятые, тильды и т. Д., Но все равно остаются в безопасности от атак.
У меня есть люди, входящие в такие даты: 10/13/11 мм / дд / гг на английском языке, может ли это быть дезинфицировано?
Как я понимаю, как правильно использовать htmlspecialchars()
, htmlentities()
и real_escape_string()
? Я читал сайт php.net и некоторые сообщения здесь, но мне кажется, что это ситуация, в которой все зависит от того, кто читает вопрос, каков правильный ответ.
Я действительно не могу согласиться с этим … должен быть ответ, в котором текстовые форматы, аналогичные тем, которые я публикую здесь, могут быть дезинфицированы. Я хотел бы знать, если и как это возможно.
Спасибо … потому что мне кажется, что, задавая этот вопрос в других местах, он раздражает … Я изучаю то, что мне нужно знать, но я думаю, что попал на плато в то, что знаю, без примера того, что он предназначен для …
Заранее спасибо.
Это очень важный вопрос, и на самом деле он имеет простой ответ в виде кодировок. Проблема, с которой вы сталкиваетесь, что вы используете много языков одновременно. Сначала вы находитесь в HTML, затем в PHP и через несколько секунд в SQL. Все эти языки имеют свои собственные синтаксические правила.
Следует помнить, что строка всегда должна быть в правильной кодировке.
Давайте возьмем пример. У вас есть HTML-форма, и пользователь вводит в нее следующую строку:
I really <3 dogs & cats ;')
После нажатия кнопки отправки эта строка отправляется на ваш PHP-скрипт. Предположим, что это делается через GET. Он добавляется к URL-адресу, который имеет свой собственный синтаксис (например, символ & имеет особое значение), поэтому мы меняем языки. Это означает, что строка должна быть преобразована в правильную URL-кодировку. В этом случае браузер делает это, но PHP также имеет функцию urlencode
для этого.
В скрипте PHP строка хранится в $_GET
, закодированной как строка PHP. Пока вы кодируете PHP, это прекрасно. Но теперь давайте поместим строку в SQL-запрос. Мы меняем языки и правила синтаксиса, поэтому строка должна быть закодирована как SQL через функцию mysql_real_escape_string
.
На другом конце мы можем снова отобразить строку обратно пользователям. Мы извлекаем строку из базы данных, и она возвращается нам как строка PHP. Когда мы хотим внедрить его в HTML для вывода, мы снова меняем языки, поэтому мы должны кодировать нашу строку в HTML через функцию htmlspecialchars
.
На протяжении всего пути строка всегда находилась в правильной кодировке, что означает, что любой персонаж, с которым пользователь может придумать, будет рассмотрен соответствующим образом. Все должно быть гладким и безопасным.
Вещь, которую следует избегать (иногда это даже рекомендуется невеждым), преждевременно кодирует вашу строку. Например, вы можете применить htmlspecialchars
к строке перед тем, как поместить ее в базу данных. Таким образом, когда вы извлекаете строку позже из базы данных, вы можете вставить ее в HTML без проблем. Великолепно звучат? Да, действительно здорово, пока вы не начнете получать билеты поддержки людей, интересующихся, почему их квитанции в формате PDF полны & >
& >
мусор.
В коде:
form.html:
<form action="post.php" method="get"> <textarea name="comment"> I really <3 dogs & cats ;') </textarea> <input type="submit"/> </form>
URL-адрес, который он генерирует:
http://www.example.org/form.php?comment=I%20really%20%3C3%20dogs%20&%20cats%20;')
post.php:
// Connect to database, etc.... // Place the new comment in the database $comment = $_GET['comment']; // Comment is encoded as PHP string // Using $comment in a SQL query, need to encode the string to SQL first! $query = "INSERT INTO posts SET comment='". mysql_real_escape_string($comment) ."'"; mysql_query($query); // Get list of comments from the database $query = "SELECT comment FROM posts"; print '<html><body><h2>Posts</h2>'; print '<table>'; while($post = mysql_fetch_assoc($query)) { // Going from PHP string to HTML, need to encode! print '<tr><td>'. htmlspecialchars($post['comment']) .'</td></tr>'; } print '</table>'; print '</body></html>'
Главное, чтобы понять, что для каждой функции санитарии доступно для вас, и когда она должна использоваться. Например, функции экранирования базы данных предназначены для обеспечения безопасности данных для вставки в базу данных и должны использоваться как таковые; но функции экранирования HTML предназначены для нейтрализации вредоносного кода HTML (например, JavaScripts) и обеспечения безопасности для вывода данных для просмотра пользователями. Санитировать правильную вещь в нужное время. *
Даты могут быть дезинфицированы с использованием функции синтаксического анализа даты. В PHP вы можете посмотреть strtotime () . Ваша цель, как правило, принимать строковое представление даты и выводить либо объект, представляющий дату, либо другую строку, которая представляет одну и ту же дату каноническим способом (то есть: в определенном формате).
Что касается дезинфекции дат, PHP имеет некоторые встроенные функции, которые могут быть полезны. Функция strtotime () преобразует практически любой воображаемый формат даты / времени в временную метку Unix, которая затем может быть передана функции date (), чтобы преобразовать ее в любое форматирование, которое вам нравится.
Например:
$ date_sql = date ("Ymd", strtotime ($ _POST ["date"]));