Stripslashes не работает для моих магических цитат в PHP
Я начал использовать магические кавычки, и я столкнулся с небольшой проблемой, я думаю, что это простая проблема, которую я не могу понять.
Я не хочу использовать полосы, которые не удаляются, когда я пишу что-то в моем текстовом поле.
Код:
<?php
echo "Removed Slashes: ";
// Remove those slashes
if(get_magic_quotes_gpc())
echo stripslashes($_POST['question']);
else
echo $_POST['question'];
?>
<form method='post'>
Question: <input type='text' name='question'/><br />
<input type='submit'>
</form>
Я также попробовал этот, который на самом деле работает!
<?php
$str = "Is your name O\'reilly?";
// Outputs: Is your name O'reilly?
echo stripslashes($str);
?>
Но теперь я хочу использовать свой вклад для веб-сайта по соображениям безопасности
3 ответа
Я не могу выразить это лучше, чем этот комментарий cHao на странице руководства
Причина, по которой магические цитаты не рекомендуются, заключается в том, что универсальный подход к экранированию / цитированию неверен и совершенно опасен. Разные типы контента имеют разные специальные символы и разные способы избежать их, и то, что работает в одном, имеет побочные эффекты в других местах. Любой пример кода, здесь или где-либо еще, который притворяется, что работает как магические кавычки - или выполняет аналогичное преобразование для HTML, SQL или чего-либо еще в этом отношении - также имеет неправильный заголовок и аналогично опасен.
Магические цитаты не для безопасности. Они никогда не были. Это удобная вещь - они существуют, так что нуб PHP может шарить и в конечном итоге писать некоторые запросы mysql, которые вроде бы работают, без необходимости изучать правильное экранирование / цитирование данных. Они предотвращают несколько случайных синтаксических ошибок, как и их работа. Но они не остановят злонамеренного и полусознательного злоумышленника от взлома базы данных PHP noob. И этот бедный нуб, возможно, никогда даже не узнает, как или почему его база данных исчезла, потому что магические кавычки (или его изящная функция "я собираюсь избежать всего") дали ему ложное чувство безопасности. Ему никогда не приходилось учиться тому, как по-настоящему справляться с недоверенными данными
Данные должны быть экранированы там, где вам нужно, и для домена, в котором они будут использоваться. (mysql_real_escape_string - НЕ добавляет косые черты! - для MySQL (и это только в том случае, если у вас есть подсказка и вы используете подготовленные операторы), htmlentities или htmlspecialchars для HTML и т. д.) Все остальное обречено на провал.
Действительно, прими совет. Не используйте их, вы не узнаете ничего полезного, попробовав их, просто забудьте, что они когда-либо существовали.
Взгляните на эту статью http://www.sitepoint.com/magic-quotes-headaches и на эту http://econsultancy.com/us/blog/2663-web-app-security-basics-filtering-input-and-escaping-output для получения дополнительной информации.
Ну, это легко атаковать, но, похоже, больше усилий, чтобы помочь. Итак, вот моя попытка быть полезной.
Таким образом, вы отправляете данные обратно на сервер и хотите, чтобы все, что пользователь отправляет обратно, не попадало куда-либо, чтобы оно могло действовать злонамеренно.
Наивная стратегия, которую вы приняли, это сказать: хорошо, я буду очищать данные в общем, включив магическое цитирование, которое должно избежать всех неприятностей...
Однако это не так. Ваша задача заключается в том, чтобы при работе с ненадежными данными вы использовали собственную стратегию очистки, полностью зависящую от того, как вы ее используете. Хороший ресурс для изучения, где вы должны позволить ненадежным данным вводить определенное местоположение, и как избежать ненадежных данных, может быть найден в OWASP
Вы заметите, что не все места подходят для ненадежных данных, экранированных или иных. Это подчеркивает тот факт, что для правильной реализации безопасных веб-сайтов вам необходимо учитывать как то, куда поступают ненадежные данные, так и то, как эти данные попадают туда.
Этот вопрос более непосредственно фокусируется на том, как, потому что мы рассматриваем (и нападаем на использование) общий механизм побега. Вы подразумеваете, что включение магических кавычек является подходящим методом для экранирования данных, предназначенных для всех мест, где могут оказаться ваши недоверенные данные.
Наилучшая практика говорит о том, что на самом деле вам нужно использовать механизм побега, который подходит для тех мест, где вы собираетесь его использовать. Как уже указывалось, использование mysql_real_escape_string является популярной функцией, которая специфична для экранирования строк для использования в запросе MySQL. Люди используют этот механизм, но необходимость вручную экранировать ваши данные с помощью этого механизма заменяется правильным использованием объектов данных PHP (PDO). (Связывание ваших ненадежных данных с параметром, а не создание строк запроса вручную).
Другие очевидные механизмы экранирования включают в себя кодирование символов html с использованием htmlspecialchars или htmlentities, а более универсальные механизмы экранирования кавычек добавляют косые черты и надстрочные косые черты. Есть даже экранирующие методы для аргументов командной строки escapeshellarg и escapeshellcmd
Таким образом, вы можете видеть, что правильное экранирование данных гораздо менее тривиально, чем применение магических кавычек ко всем входящим данным, и часто существуют надежные механизмы безопасного экранирования данных в зависимости от места, в котором вы собираетесь их использовать.
Простое решение вашей проблемы - создать простую функцию, которая проталкивает все ваши данные, если они касаются вашей БД. Может быть смоделировано как таковое:
function sanitizeString($var)
{
$var = strip_tags($var);
$var = htmlentities($var);
$var = stripslashes($var);
return mysql_real_escape_string($var);
}//end sanitizeString