2009-11-27 2 views
3

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

Очевидно, что директива magic quotes, устаревшая в php 5.3.0+ и удаленная в php6, становится более актуальной, для тех, кто хочет обновить и перейти к новым языковым функциям, сохраняя при этом устаревший код (дон 't мы любим это ..).

Тем не менее, одна вещь, которую я не видел, - это много обсуждать теорию/лучшую практику с тем, что нужно делать, защищая ваши данные - например, для хранения с косой чертой или без нее? Я лично думаю, сохраняя спасся данные в БД плохой ход, но хочу услышать обсуждение и прочитать некоторые тематические исследования предпочтительно ..

Некоторые ссылки из PHP инструкции только для справки:

PHP Manual - mysql_real_escape_string

PHP Manual - htmlspecialchars

и т.д. и т.п.

Любые советы?

+3

Тот факт, что вы сказали «например, чтобы хранить с или без косых черт», заставляет меня поверить, что у вас может быть некорректная концепция правильного побега. если вы выполняете экранирование правильно, то строки, отправляемые в базу данных, которая требует косой черты, будут иметь их, но фактически не будут храниться в базе данных. если вы видите слэши в базе данных, данные были неправильно экранированы. – longneck

+0

Объясните больше, пожалуйста, длинный - будет ли mysql удалять экраны перед вставкой? Есть ли страница об этом? Но вы мертвы правильно - я думаю, что в какой-то момент я забыл об этом и теперь пытался догнать. – dmp

+0

mysql_real_escape_string не будет пропускать косые черты и т. Д. Это делает строку безопасной для SQL-запроса. – William

ответ

6

Взгляните на подготовленные заявления. Я знаю, что в mysql это работает очень хорошо и представляет собой безопасную форму получения данных в вашей базе данных. Он также имеет несколько преимуществ в производительности.

http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html

У меня есть еще несколько ресурсов, если вы заинтересованы.

Надеюсь, это то, что вы ищете, tc.

Edit:

Одна вещь, которую я могу добавить, с помощью фильтров в сочетании с подготовленными операторами. Например, чтобы проверить, является ли значение укусом, которое вы используете FILTER_SANITIZE_STRING, или для электронного письма, которое вы используете FILTER_SANITIZE_EMAIL.

Это экономит некоторое количество кода и работает очень хорошо. Вы всегда можете проверить данные, используя свои собственные методы, но есть много фильтров, которые вы можете использовать.

+0

Спасибо, прочитаю! – dmp

+0

Я изучал это - вы упомянули еще несколько ресурсов, если у вас есть шанс, я буду благодарен за некоторые ссылки! Еще раз спасибо за подсказку. – dmp

+0

Проверьте эти две ссылки: http://net.tutsplus.com/tutorials/php/getting-clean-with-php/ и http://net.tutsplus.com/tutorials/other/top-20- mysql-best-practices/ Один, если для php и один для mysql, просто некоторые лучшие практики, наслаждайтесь! –

0

Это просто. ВСЕ входящие данные должны быть запущены через mysql_real_escape_string(), прежде чем вставлять их в базу данных. Если вы знаете, что что-то должно быть целым числом, например, установите его в целое число перед его вставкой и т. Д. Помните, что это просто для остановки SQL-инъекции. XSS и проверка данных различны.

Если вы хотите, чтобы что-то было электронным письмом, вам, очевидно, необходимо проверить его, прежде чем вставлять его в базу данных.

htmlentities() дезинфицирует данные, то есть изменить данные. Я думаю, что вы всегда должны хранить необработанные данные в базе данных, и когда вы берете эти данные, выберите, как вы хотите его дезинфицировать.

Мне нравится использовать следующую функцию в качестве «обертки» для функции mysql_real_escape_string().

function someFunction($value) 
{ 
    if (is_int($value) || is_float($value)) { 
     return $value; 
    } 
    return "'" . mysql_real_escape_string((string) $value) . "'"; 
} 

Если значение с плавающей точкой или целое число, то нет никакого смысла в управлении mysql_real_escape_string(). Причина, по которой я передал значение в строку, прежде чем передать ее в mysql_real_escape_string(), заключается в том, что иногда это значение может быть не строкой.

Пример значение не является строкой:

http://localhost/test.php?hello[]=test

Внутри test.php, вы запускаете mysql_real_escape_string() на $ _GET [ 'привет'] ожидая привет быть строкой. Ну, так как человек задает значение массиву, это фактически вызовет уведомление, поскольку hello не является строкой.

+0

Вы не совсем поняли в своем ответе. Ваше предложение не использовать htmlentities? – markus

+0

Его предложение состоит в том, чтобы всегда использовать mysql_real_escape_string перед хранением БД –

+0

При хранении его в базе данных? Да, мое предложение - не использовать htmlentities. Если я выводю данные в браузер, например, данные пользователя, то да, я запустил его через htmlentities. Иногда я, возможно, не захочу в некоторых случаях, я имею эту опцию, когда я получаю доступ к этим данным. – William

2
  • Используйте правильный метод избежать данных при выполнении запросов: mysql_real_escape_string, подготовленные запросы, и т.д. ...

  • данные хранятся в базе данных неизмененном

  • Используйте правильный метод побега данные о выходе: htmlspecialchars и т. д.

+0

Благодарим вас, что недостаточно людей понимают, что данные должны быть сбежаны по разным причинам с обеих сторон. SQL-инъекция стала меньше беспокоить, похоже, многие понимают ее, но XSS становится все более распространенным я рад видеть, что такие люди, как Гален, говорят об этом и как его предотвратить. –

1

Для вставки базы данных решение должно использовать bind variables.

В общем, в любое время, когда вы обнаруживаете, что что-либо избегаете (аргумент командной оболочке, команда db, пользовательский html и т. Д.), Это означает, что вы не используете правильный вызов функции (например, используя system, когда вы можете использовать форму с несколькими аргументами exec) или что ваша инфраструктура недостаточна. Стандартный подход к работе в недостаточной структуре - это усилить его, чтобы вы могли вернуться, чтобы не думать о цитировании.

Мышление об уровнях побега и уровнях цитирования может быть забавным, но если вам действительно нравится играть в Tcl в свободное время. Для реальной работы вы не должны думать о цитировании, если вы не разрабатываете библиотеку для других людей, и в этом случае вы должны правильно указывать и позволять вашим пользователям избегать думать о цитировании. (И вы должны тщательно документировать, что именно вы делаете и не делаете)

2

Для работы с базой данных проверьте параметризованные запросы и подготовленные операторы. PDO и mysqli хороши для этого.

Htmlspecialchars - это правильный инструмент для отображения текста в html-документах.

И, как вы упомянули php 5.3, у вас есть доступ к filter functions, которые являются обязательными для использования при обработке пользовательских данных.

Смежные вопросы