Кодирование минимальных символов в запросе POST: это безопасно или нет? - PullRequest
3 голосов
/ 27 февраля 2010

Я столкнулся с подходом кодировать только следующие 4 символа в значении параметра POST: # ; & +. Какие проблемы это может вызвать, если таковые имеются?

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

Обновление. Для пояснения, этот вопрос касается кодирования параметров в теле POST, а не экранирования параметров POST на стороне сервера, e. г. перед передачей их в оболочку, базу данных, HTML-страницу или что-либо еще.

Ответы [ 3 ]

1 голос
/ 27 февраля 2010

С rfc1738 (если для передачи данных используется кодировка application/x-www-form-urlencoded):

Небезопасно:

Символы могут быть небезопасными по ряду причин. Символ пробела небезопасен, так как значительные пробелы могут исчезнуть, а незначительные пробелы могут быть введены, когда URL-адреса транскрибируются, набираются или подвергаются обработке программ обработки текста. Символы «<» и «>» небезопасны, поскольку они используются в качестве разделителей вокруг URL в свободном тексте; знак кавычки ("" ") используется для разграничения URL-адресов в некоторых системах. Символ" # "небезопасен и всегда должен кодироваться, поскольку он используется в World Wide Web и в других системах для разграничения URL-адреса из фрагмента / якоря идентификатор, который может следовать за ним. Символ "%" небезопасен, поскольку он используется для кодирования других символов. Другие символы небезопасны, поскольку известно, что шлюзы и другие агенты транспорта иногда изменяют такие символы. Это символы "{", "} "," | "," \ "," ^ "," ~ "," [","] "и" `".

Все небезопасные символы всегда должны быть закодированы в URL. Например, символ «#» должен быть закодирован в URL-адресах даже в системах, которые обычно не имеют дело с идентификаторами фрагментов или якорей, поэтому, если URL-адрес копируется в другую систему, которая их использует, нет необходимости изменять Кодировка URL.

0 голосов
/ 27 февраля 2010

Рассмотрим это: $sql ='DELETE * from статьи WHERE id ='.$_POST['id'].';
И вы вводите в форме: 1' OR '10
Тогда становится так: $sql ='DELETE * from статей WHERE id ='1' OR '10';

0 голосов
/ 27 февраля 2010

Экранирующие метасимволы обычно (всегда?) Выполняются для предотвращения инъекционных атак. Разные системы имеют разные метасимволы, поэтому каждой из них нужен свой способ предотвращения инъекций. Разные системы имеют разные способы экранирования персонажей. Некоторым системам не нужно экранировать символы, поскольку они имеют разные каналы для управления и данных (например, подготовленные операторы). Кроме того, фильтрация обычно лучше всего выполняется, когда данные вводятся в систему.

Самая большая проблема в том, что экранирование только этих четырех символов не обеспечит полную защиту. Атаки с использованием SQL, HTML и внедрения в оболочку все еще возможны после фильтрации четырех указанных вами символов.

...