Как вы дезинфицируете свои данные? - PullRequest
3 голосов
/ 10 июля 2009

Это функция, которую я сейчас использую (из книги php, которую я купил):

function escape($data) {
    return mysql_real_escape_string(trim($data), $this->linkid);    
}

Но я чувствую, что это может быть безопаснее. например, возможно использовать htmlspecialchars. Это всегда делает меня параноиком. Я читал, что mysql_real_escape_string - это плохо и никогда его не использовать, но потом я также прочитал, что это лучший способ Много путаницы в отношении очистки данных при вставке их в базу данных.

Так как ты это делаешь? и каковы плюсы и минусы того, как вы это делаете.

Ответы [ 8 ]

4 голосов
/ 10 июля 2009

Вы говорите о двух разных видах побега.

mysql_real_escape_string() экранирует данные, поэтому отправлять их в MySQL будет безопасно.

htmlspecialchars() экранирует данные, поэтому будет безопасно отправлять что-либо, отображающее HTML.

Оба прекрасно работают для своих целей, но параметризованные запросы с помощью чего-то вроде mysqli немного более аккуратны.

4 голосов
/ 10 июля 2009

Давайте кратко рассмотрим ПОЧЕМУ экранирование необходимо в разных контекстах:

Если вы находитесь в строке с разделителями-кавычками, вам нужно иметь возможность экранировать кавычки. Если вы находитесь в XML, то вам нужно отделить «контент» от «разметки» Если вы используете SQL, вам нужно отделить «команды» от «данных» Если вы находитесь в командной строке, вам нужно отделить «команды» от «данных»

Это действительно базовый аспект вычислений в целом. Поскольку синтаксис, который разделяет данные, может встречаться в ДАННЫХ, должен быть способ отличить ДАННЫЕ от СИНТАКСА, следовательно, экранировать.

В веб-программировании наиболее распространенными примерами экранирования являются: 1. Вывод текста в HTML 2. Вывод данных в атрибуты HTML 3. Вывод HTML в HTML 4. Вставка данных в Javascript 5. Вставка данных в SQL 6. Вставка данных в команду оболочки

Каждый из них имеет различные последствия для безопасности, если обрабатывается неправильно. ЭТО ДЕЙСТВИТЕЛЬНО ВАЖНО! Давайте рассмотрим это в контексте PHP:

  1. Текст в HTML: htmlspecialchars (...)

  2. Данные в атрибутах HTML htmlspecialchars (..., ENT_QUOTES)

  3. HTML в HTML Используйте библиотеку, например HTMLPurifier , чтобы УБЕДИТЬСЯ, что присутствуют только допустимые теги.

  4. Данные в Javascript Я предпочитаю json_encode. Если вы помещаете его в атрибут, вам все равно нужно использовать # 2, например

  5. Вставка данных в SQL У каждого драйвера есть функция escape (). Это лучше. Если вы работаете в обычном наборе символов latin1 , добавьте косую черту (...). mysql_real_escape_string () лучше. Не забывайте цитаты ВОКРУГ вызова addlashes ():

    "INSERT INTO table1 SET field1 = '". addlashes ($ data). "'"

  6. Данные в командной строке escapeshellarg () и escapeshellcmd () - прочитайте инструкцию

- Примите это близко к сердцу, и вы устраните 95% * общих рисков веб-безопасности! (* предположение)

1 голос
/ 10 июля 2009

На самом деле - это «универсальный ответ» для метапроблемы (безопасного хранения предоставленных пользователем данных в базе данных), который заключается в следующем: если вы не используете параметры связывания, чтобы избежать всей проблемы внедрения в Начни с того, что ты делаешь это неправильно.

Очистка данных - отличная идея, но вероятность того, что вы что-то упустите, высока. Итак, какие бы другие методы вы не использовали (а Яни прав, это зависит от данных), не пренебрегайте использованием переменных связывания.

Переданные данные никогда не должны попадать в запрос без привязки.

1 голос
/ 10 июля 2009

Универсального ответа нет. Это всегда должно зависеть от того, какие данные вы храните.

  • Это должно быть число? Затем пропустите через is_numeric (или что-то подобное)
  • Это строка, которая не может содержать HTML? Используйте htmlentities
  • и т.д.

Выполнение всех данных через mysql_real_escape_string - хорошая идея. Конечно, это также зависит от того, использует ли ваш код библиотеку БД, PDO или что-то еще.

Например, с PDO вместо функции mysql вы захотите использовать $pdo->quote, или с утверждениями Zend_Db, ничего, так как это для вас автоматически ускользает.

0 голосов
/ 10 июля 2009
  1. В общем, используйте filter_var ()

  2. В случаях, когда разрешены только очень специфические форматы или значения, может быть лучше использовать регулярные выражения или in_array () допустимых значений.

  3. Помните, что «вход» означает любой источник ввода, который вы не можете напрямую контролировать.

  4. Если входные данные входят в запрос, используйте подготовленные операторы (например, mysqli)

0 голосов
/ 10 июля 2009

Убедившись, что данные верны и / или правильно сформированы (см. Комментарий Яни Хартикайнен), вам действительно нужен только вызов встроенной addlashes PHP ().

0 голосов
/ 10 июля 2009

Обеззараживайте свои данные только перед тем, как поместить их в конфиденциальный контекст, например:

  • часть SQL-запроса
  • часть имени файла или пути
  • часть команды оболочки
  • часть вывода HTML (или любого другого вывода, такого как CSV, XML, ATOM и т. Д. И т. Д.)

Не используйте одну универсальную функцию escape, потому что тогда у вас будет ощущение, что данные в безопасности, но это не так. Это безопасность зависит от контекста. И очевидно, что вы не можете выполнить все одновременно, независимо от всех ситуаций, когда вы можете использовать данные. Поэтому сохраняйте необработанные данные в базе данных (и да, используйте mysql_real_escape_string() или какую-либо привязку параметра, например, используя PDO) и используйте специальную функцию экранирования при вводе в контекст:

  • htmlspecialchars() в контексте HTML
  • escape_shell_arg() и escape_shell_cmd() в контексте команды оболочки
  • и т. Д., И т. Д.
0 голосов
/ 10 июля 2009

Использовать SOAP? Хар хар.

(отказ от ответственности: да, это шутка)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...