Regex как первая линия защиты от XSS - PullRequest
10 голосов
/ 20 сентября 2010

У меня было регулярное выражение в качестве первой линии защиты от XSS.

public static function standard_text($str)
{
    // pL matches letters
    // pN matches numbers
    // pZ matches whitespace
    // pPc matches underscores
    // pPd matches dashes
    // pPo matches normal puncuation
    return (bool) preg_match('/^[\pL\pN\pZ\p{Pc}\p{Pd}\p{Po}]++$/uD', (string) $str);
}

На самом деле это Кохана 2.3 .

Это работает на общедоступном тексте(HTML никогда не используется) и запрещает ввод, если он не проходит этот тест.Текст всегда отображается с htmlspecialchars() (или, более конкретно, аромат Коханы , он добавляет набор символов среди прочего).Я также поставил strip_tags() на выходе.

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

Могу ли я просто полагаться на экранированиевыход

1 Ответ

6 голосов
/ 20 сентября 2010

Никогда не безопасно полагаться на регулярные выражения для фильтрации опасных XSS-атак. И хотя вы не полагаетесь на них, экранирование выходных данных и фильтрация входных данных при правильном использовании убьют все виды атак. Следовательно, нет никакого смысла в использовании регулярных выражений в качестве «первой линии защиты», когда их помощь на самом деле не нужна. Как вы и ваш клиент обнаружили, они только усложняют вещи при таком использовании.

Короче говоря: если вы используете html_entities или htmlspecialchars для выхода из выходных данных, вам не нужны регулярные выражения и не нужны strip_tags.

...