Я всегда интересовался написанием веб-программного обеспечения, такого как форумы или блоги, которые имеют ограниченную разметку для переписывания в HTML. Но в последнее время я все больше и больше заметил, что для PHP, попробуйте googling «PHP BBCode parser -PEAR» и протестируйте несколько, вы либо получаете неэффективный беспорядок, либо получаете плохой код с отверстиями XSS здесь и там.Regex и «war» на XSS
Взяв мой предыдущий пример, из тех, кто плохо разбирается в BBCode, как бы вы избежали XSS? Теперь я возьму ваше типичное регулярное выражение для обработки ссылки, и вы можете указать, насколько он уязвим и как его избежать.
// Assume input has already been encoded by htmlspecialchars with ENT_QUOTES
$text = preg_replace('#\[url\](.*?)\[/url\]#i','<a href="\1">\1</a>', $text);
$text = preg_replace('#\[url=(.*?)\](.*?)\[/url\]#i','<a href="\1">\2</a>', $text);
Обработка тегов изображений вряд ли более безопасна, чем эта.
Итак, у меня есть несколько конкретных вопросов, в основном связанных с реализацией PHP.
- Лучше ли использовать в этом примере только совпадение с использованием выражения проверки uri/url? Или, лучше ли использовать
(.*?)
и обратный вызов, а затем выяснить, является ли вход действительной ссылкой? Как было бы очевидно выше,javascript:alert('XSS!')
будет работать в вышеуказанных тегах URL-адреса, но не будет работать, если будет выполнено сопоставление uri. - Что касается таких функций, как
urlencode()
в обратном вызове, будут ли они любыми сдерживаниями или проблемами (насколько стандарты URI идут)? - Было бы безопаснее написать парсер полного стека? Или это время и вычислительная мощность, необходимая для разработки и использования такой вещи, которая слишком важна для обработки нескольких разных записей на странице?
Я знаю, что мой пример является одним из многих и более конкретным, чем некоторые. Однако не уклоняйтесь от предоставления своих собственных. Итак, я ищу принципы и передовые методы, а также общие рекомендации для XSS-защиты в ситуации синтаксического анализа.
Хм, я согласен с вами в том, что вы сказали, но у меня не было большого мастерства в создании правильного парсера. Знаете ли вы о приличных учебниках для анализа XML-esque? Мне было трудно найти хорошую, которая не слишком сложна, но все же на уровне навыков, необходимых. –
Если вы не можете найти стороннюю парсерную библиотеку, которая удовлетворяет ваши потребности, вы можете сделать это вручную: сначала preg_split-with-PREG_SPLIT_DELIM_CAPTURE над строкой с чем-то вроде «\ [[^ \]] + \] ' выберите теги, затем перейдите в список, содержащий стек открытых тегов. – bobince
(Индексы с нулевым номером в списке будут тегами с тегами с нечетным номером. Обычно текст будет выведен из HTML-кода, и, возможно, если вы это сделаете, смайлики будут автозаполнены, но некоторые теги могут изменить это.) – bobince