протестируйте несколько, вы либо получите неэффективный беспорядок, либо получите плохой код с дырами в XSS
Да, черт возьми. Я еще не встречал реализацию bbcode, которая не была XSS-уязвимой.
'<a href="\1">\1</a>'
Ничего хорошего: не удается экранировать символы «<», «&» и «» в HTML. </p>
Лучше ли в этом примере совмещать только с использованием выражения проверки uri / url? Или лучше использовать (. *?) И обратный вызов, а затем выяснить, является ли ввод действительной ссылкой?
Я бы ответил на звонок. В любом случае вам необходим обратный вызов для выполнения экранирования HTML; невозможно обеспечить безопасность только с помощью простой замены строки. Бросьте санитарные, пока вы делаете это.
А как насчет таких функций, как urlencode () в обратном вызове
Почти; на самом деле вам нужны htmlspecialchars (). urlencode () - это кодирование параметров запроса, а здесь это не то, что вам нужно.
Было бы безопаснее написать парсер с полным стеком?
Да.
bbcode на самом деле не поддается анализу регулярных выражений, потому что это рекурсивный язык на основе тегов (например, XML, который регулярное выражение также не может анализировать). Многие дыры в bbcode вызваны проблемами с вложениями и ошибками. Например:
[url]http://www.example.com/[i][/url]foo[/i]
Может выглядеть как
<a href="http://www.example.com/<i>">foo</i>
есть много других ловушек, которые генерируют неработающий код (вплоть до дыр XSS) в различных реализациях bbcode.
Я ищу принципы и лучшие практики
Если вам нужен язык, похожий на bbcode, который вы можете регулярно проверять, вам необходимо:
Это все еще чертовски трудно получить право. Правильный синтаксический анализатор, скорее всего, будет водонепроницаемым.