Чистый пользовательский ввод с использованием preg_replace_callback и ord ()? - PullRequest
1 голос
/ 23 октября 2011

У меня есть текстовое поле в стиле форума, и я хотел бы очистить вводимые пользователем данные, чтобы остановить потенциальную вставку xss и кода.Я видел, как использовались htmlentities, но другие говорили, что символы &, #,%,: также необходимо кодировать, и, чем больше я смотрю, тем больше потенциально опасных символов появляется.Белый список проблематичен, так как помимо ^ a-zA-z0-9 есть много допустимых текстовых опций.Я придумал этот код.Будет ли это работать, чтобы остановить атаки и быть в безопасности?Есть ли причина не использовать его, или лучше?

function replaceHTML ($match) {
    return "&#" . ord ($match[0]) . ";";
}

$clean = preg_replace_callback ( "/[^ a-zA-Z0-9]/", "replaceHTML", $userInput );

РЕДАКТИРОВАТЬ: _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ ____ Конечно, я могу ошибаться, но, насколько я понимаю, htmlentities заменяет только & <> "(и 'если ENT_QUOTES включен). Этого, вероятно, достаточно, чтобы остановить большинство атак (и, откровенно говоря, вероятно, более чем достаточно для моегосайт с низким трафиком. Однако, из-за моего навязчивого внимания к деталям, я продолжал копать. У меня есть книга, в которой я предупреждаю также кодировать # и% для «отключения шестнадцатеричных атак». Два веб-сайта, которые я обнаружил, не разрешают: и -.все это меня смущает и побудило меня заняться преобразованием всех не алфавитно-цифровых символов. Если htmlentities делает это уже тогда, то отлично, но это не так. Вот результаты из кода, который я запустил и скопировал после нажатия на источник просмотра в Firefox.

оригинал (случайные символы для проверки): 5: gjla # '' * & $! Jl: 4

preg_replace_callback: 5: gjla # '' * & $! jl: 4

htmlentities (w / ENT_QUOTES): 5: gjla # '' * & $! jl: 4

htmlentities, похоже, не кодирует эти другие символы, такие как: Извините за стену текста.Это я просто параноик?

РЕДАКТИРОВАТЬ # 2: _ __ _ __ _ __ _ _

Ответы [ 3 ]

1 голос
/ 23 октября 2011

Это именно то, что htmlentities уже делает:

http://codepad.viper -7.com / NDZMa3

Будет преобразовано (с интервалом для предотвращения двойного кодирования stackoverflow):
"& # amp;"
до
"& # amp; # amp;"

1 голос
/ 23 октября 2011

Все, что вам нужно, чтобы остановить XSS-атаки, это использовать htmlspecialchars().

0 голосов
/ 23 октября 2011

пробел ' ' можно изменить на \s в вашем регулярном выражении, также добавив /i в конце регулярного выражения, которое вы сделали case insensitive, и вам не нужно вручную переводить ваши символы в последовательности,это может быть сделано с обратным вызовом htmlentities

$clean = preg_replace_callback('/[^a-z0-9\s]/i', 'htmlentities', $userInput);
...