php - 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"/>',
);
解决方案
不要使用(.*)
url,而是使用[^]'\r\n]+
与 a 不匹配的否定字符类'
,即右方括号]
。
在点也匹配换行符的地方使用 s 修饰符。如果您不想为 url 匹配换行符,也可以添加\r\n
。
您可以将第二个捕获组更改(.*)
为非贪婪组(.*?)
。
您的 url 正则表达式可能如下所示:
~\[url=[^]\'\r\n]+](.+?)\[/url\]~s
推荐阅读
- git - 如何在结帐/克隆中包含被忽略的文件?
- batch-file - 如何删除每行文本的第一个“文本”
- python - pyqtdeploy - 没有这样的文件或目录,构建尝试复制不存在的子目录
- django - 具有两种形式的 Django 视图未发布一个
- rust - 如何使用它们连接的节点迭代 Petgraph 节点的边缘?
- ios - 如何在swift中自动导入依赖框架
- javascript - alpinejs中未定义的文件请求
- google-apps-script - 从旧时间戳的响应表中追加和删除行?
- python - discord.py 男高音 api 我做错了吗?
- terraform - Terraform:如何在同一个 iam 策略文档语句中分离不同标识符的操作