Хорошая функция для выхода из $ _POST // что вы думаете об этом

0

Я использую $_POST и знаю о mysql exploit, я решил использовать эту функцию в верхней части моей страницы, поэтому все POST будут в безопасности: Можете ли вы сказать мне, если я что-то пропущу, и эта функция действительно будет работать, как я думаю?

function clean_post(){
    if ( $_POST){
            foreach ($_POST as $k => $v) {
            $_POST[$k]=stripslashes($v);
            $_POST[$k]=mysql_real_escape_string($v);
            $_POST[$k]=preg_replace('/<.*>/', "", "$v");
        }
  }

  if ( $_COOKIE){
            foreach ($_COOKIE as $k => $v) {
            $_COOKIE[$k]=stripslashes($v);
            $_COOKIE[$k]=mysql_real_escape_string($v);
            $_COOKIE[$k]=preg_replace('/<.*>/', "", "$v");
        }
  }
}

Он также удалит все теги html, самый безопасный вариант для вывода результата может быть использован:

<pre>
  $foo 
</pre> 

Ура!

Ура!

  • 0
    Какая польза от этого? Зачем кому-то нужно что-то подобное? Я знаю, что нет. Для mysql я использую PDO с подготовленными утверждениями, поэтому мне не нужно избегать чего-либо из поста. Для других вещей я использую встроенный в php фильтр filter_var () с различными опциями.
  • 0
    Приятно видеть, что вы думаете о безопасности, здорово, так держать! но ... mysql_real_escape_string требует активного подключения к базе данных. поэтому ваша функция выдаст ошибку, если вы используете ее перед подключением к mysql. это также может вызвать проблемы, если у вас есть несколько подключений к разным базам данных, которые используют разные параметры сортировки. перед тем, как убрать лишнюю косую черту, вы всегда должны проверить, что php добавил косую get_magic_quotes_gpc() используя get_magic_quotes_gpc() . Что делать, если вы случайно вызвали функцию дважды?
Показать ещё 1 комментарий
Теги:

7 ответов

10

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

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

  • 0
    Я не могу понять эту часть: вы ничего не избежите . Он убегает от персонажей? Вы можете это объяснить? Thnaks.
  • 2
    @Eray Alakese: Моя точка зрения заключается в том, что он, скорее всего, будет использовать эту функцию очистки вместо правильного экранирования данных. Я думаю, что это опасная привычка.
Показать ещё 1 комментарий
2

Есть некоторые проблемы с этим.

Сначала вы применяете функции к типам, которые им не нужны, для целых чисел, например, требуется только (int), чтобы быть безопасным.

Во-вторых, вы не гарантируете длину, когда вы запрашиваете строку "12 символов", было бы неплохо обеспечить, чтобы у вас было всего 12 символов, а не 2048. Ограничение размера - это действительно то, что ваши нападающие не будут как.

Третий в вашем цикле foreach у вас есть переменная $v, вы назначаете 3 раза функцию на $v до $_POST [$ k]. Таким образом, первые два задания теряются, когда происходит 3-го...

Тогда все, что говорили предыдущие люди, правы: -)

Правило применяет фильтр в нужный момент для правильного вывода. Для вывода HTML нужен html-фильтр (htmlspecialchars), но база данных ему не нужна, ему нужна база данных. Предположим, вы хотите извлечь данные из своей базы данных для создания CSV или PDF файлов, а экранирование HTML сделает вашу жизнь более сложной. В это время вам понадобится экранирование CSV или выпадение PDF файла.

Наконец, очень сложно запомнить, если вы манипулируете данными, которые уже хорошо экранированы для вашего вывода. И я рекомендую вам отличное чтение на Joel on Software о Apps Hungarian. Текст довольно длинный, но очень хороший, и последовательность веб-экранирования используется в качестве примера того, почему Apps Hungarian является хорошим (даже если System Hungarain - это плохо).

  • 0
    Вы 3 раза назначаете функцию на $ v для $ _POST [$ k]. Как я мог пропустить это!
  • 0
    Так что теперь вы довольно подвержены инъекциям SQl :-)
Показать ещё 1 комментарий
1

Привет, это мой первый ответ на любой вопрос, заданный в Интернете, поэтому ознакомьтесь с ним.

Поместите этот код в верхнюю часть вашего script и не нужно присваивать эти опубликованные значения любым переменным для выполнения той же самой задачи, что и входные данные для базы данных. Просто используйте значения $_POST, как и в ваших запросах.

foreach ($_POST as $k => $v) {                  
      if(!is_array($_POST[$k]) ) {       //checks for a checkbox array & so if present do not escape it to protect data from being corrupted.
          if (ini_get('magic_quotes_gpc')) {      
                $v = stripslashes($v); 
            }               

            $v = preg_replace('/<.*>/', "", "$v");           //replaces html chars
            $_POST[$k]= mysql_real_escape_string(trim($v));

        }
 }
0

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

Существует множество ситуаций, когда вы можете захотеть, чтобы необработанные данные передавались по HTTP-запросу. С вашим подходом нет возможности сделать это.

  • 0
    Используйте связанные параметры: Никогда не слышал об этом, вы можете объяснить немного больше?
  • 0
    @Arnaud: см., Например, devzone.zend.com/article/686 .
0

В общем, я не думаю, что это хорошая идея.

  • Не все почтовые данные обязательно попадают в MySQL, поэтому нет необходимости скрывать их, если это не так. Тем не менее, использование чего-то вроде PDO и подготовленных операторов является лучшим способом, функции mysql_* устарели.
  • Регулярное выражение может уничтожить много потенциально допустимого текста. Вы должны беспокоиться о вещах, таких как HTML, при выводе, а не вводе. Кроме того, для этой функции используйте функцию типа strip_tags или htmlspecilchars.
  • stripslashes требуется только в том случае, если включены магические кавычки (чего они не должны быть, но всегда возможны)
  • 0
    Вы, ребята, все очень правы!
0

При работе с stripslashes я бы использовал get_magic_quotes_gpc():

if (get_magic_quotes_gpc()) {
    $_POST[$k]=stripslashes($v);
}

В противном случае вы будете перекрывать.

0

Не забывайте $_GET []

if ($_POST OR $_GET)

Также вы можете добавить strip_tags()

  • 1
    На самом деле, просто используйте $ _REQUEST (и $ _POST, и $ _GET) и называйте это день
  • 1
    @editor, использующий запрос, неоднозначен и определенно не очень хорошая идея. Кроме того, изменение запроса не изменит то, что находится в get или post, это не по ссылке.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню