Sanitizing PHP / SQL $ _POST, $ _GET и т. Д.??

Хорошо, эта тема – это очаг, я это понимаю. Я также понимаю, что эта ситуация зависит от того, что вы используете в качестве кода. У меня есть три ситуации, которые необходимо решить.

  1. У меня есть форма, где мы должны позволять людям делать комментарии и заявления, которые используют запятые, тильды и т. Д., Но все равно остаются в безопасности от атак.

  2. У меня есть люди, входящие в такие даты: 10/13/11 мм / дд / гг на английском языке, может ли это быть дезинфицировано?

  3. Как я понимаю, как правильно использовать 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 полны &amp; &gt; &amp; &gt; мусор.

В коде:

form.html:

 <form action="post.php" method="get"> <textarea name="comment"> I really <3 dogs &amp; cats ;') </textarea> <input type="submit"/> </form> 

URL-адрес, который он генерирует:

 http://www.example.org/form.php?comment=I%20really%20%3C3%20dogs%20&amp;%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) и обеспечения безопасности для вывода данных для просмотра пользователями. Санитировать правильную вещь в нужное время. *

  • Существует два разных подхода к базовому подходу: вы можете дезинфицировать HTML, когда получаете его, или можете хранить его точно так же, как вы его получили, и дезинфицировать его только тогда, когда настало время вывести его пользователю. Каждый из этих методов имеет своих сторонников, но второй из них, вероятно, менее всего подвержен проблемам (с первым, что вы делаете, если обнаружена ошибка в вашей процедуре санировки, и вы обнаружите, что у вас недостаточно санитарный контент, хранящийся в вашей базе данных ?)

Даты могут быть дезинфицированы с использованием функции синтаксического анализа даты. В PHP вы можете посмотреть strtotime () . Ваша цель, как правило, принимать строковое представление даты и выводить либо объект, представляющий дату, либо другую строку, которая представляет одну и ту же дату каноническим способом (то есть: в определенном формате).

Что касается дезинфекции дат, PHP имеет некоторые встроенные функции, которые могут быть полезны. Функция strtotime () преобразует практически любой воображаемый формат даты / времени в временную метку Unix, которая затем может быть передана функции date (), чтобы преобразовать ее в любое форматирование, которое вам нравится.

Например:

$ date_sql = date ("Ymd", strtotime ($ _POST ["date"]));