首页 > 解决方案 > PHP BBCODE 解析器 XSS

问题描述

目前我有这段代码,它工作正常,但如果你开始在 url 中放置撇号等,[url] 标签仍​​然显示带有撇号的 url,我不想要 [url] 或 [img]如果里面有撇号,就可以工作。

    $find = array(

    '~\[url=(.+)](.+)\[/url\]~s',   
    '~\[img\](https?://[^"\'><]*?\.(?:jpg|jpeg|gif|png|bmp))\[/img\]~s',

    );

    $replace = array(
    '<a rel="nofollow" target="_blank" href="$1">$2</a>',
    '<img src="$1" alt="Image"/>',
     );

标签: phpregex

解决方案


不要使用(.*)url,而是使用[^]'\r\n]+与 a 不匹配的否定字符类',即右方括号]

在点也匹配换行符的地方使用 s 修饰符。如果您不想为 url 匹配换行符,也可以添加\r\n

您可以将第二个捕获组更改(.*)为非贪婪组(.*?)

您的 url 正则表达式可能如下所示:

~\[url=[^]\'\r\n]+](.+?)\[/url\]~s

正则表达式演示


推荐阅读