Данные должны быть экранированы (очищены) для хранения и закодированы для отображения.Данные должны никогда кодироваться для хранения.Вы хотите хранить только необработанные данные.Обратите внимание, что экранирование вообще не изменяет необработанные данные, поскольку экранирующие символы не сохраняются;они используются только для правильного оповещения о разнице между необработанными данными и синтаксисом команд.
Короче говоря, вы хотите сделать следующее:
$data = $_POST['raw data'];
//Shorthand used; you all know what a query looks like.
mysql_query("INSERT " . mysql_real_escape_string($data));
$show = mysql_query("SELECT ...");
echo htmlentities($show);
// Note that htmlentities() is usually overzealous.
// htmlspecialchars() is enough the majority of the time.
// You also don't have to use ENT_QUOTES unless you are using single
// quotes to delimit input (or someone please correct me on this).
Возможно, вам также понадобится убрать косые черты от пользователявведите, если включены магические кавычки.stripslashes()
достаточно.
Что касается того, почему вы не должны кодировать для хранения, возьмите следующий пример:
Скажите, что у вас есть поле БД, которое char(5)
.Ввод html также maxlength="5"
.Если пользователь вводит «&&&&&», что может быть совершенно правильным, оно сохраняется как «&&».Когда он извлекается и отображается обратно пользователю, если вы не кодируете, он увидит «&&», что неверно.Если вы делаете кодирование, они видят «&&», что также неверно.Вы не храните данные, которые пользователь намеревался сохранить.Вам необходимо хранить необработанные данные.
Это также становится проблемой в случае, когда пользователь хочет сохранить специальные символы.Как вы справляетесь с их хранением?Вы неХраните его в необработанном виде.
Чтобы защитить от внедрения SQL, по крайней мере экранируйте ввод с помощью mysql_real_escape_string
, но рекомендуется использовать подготовленные операторы с оберткой БД, такой как PDO.Выясните, какой из них работает лучше, или напишите свой собственный (и тщательно протестируйте его).
Чтобы защититься от XSS (межсайтовый скриптинг), закодируйте ввод пользователя, прежде чем он отобразится обратно.