【问题标题】:Images with BBcode (php, preg_replace). Security question带有 BBcode (php, preg_replace) 的图像。安全问题
【发布时间】:2011-09-07 00:28:28
【问题描述】:

Bbcode 问题。这个:

$text = preg_replace("@\[img\](.*)\[\/img\]@si",
"<img src=\"$1\" border=\"0\" />", $text);

工作正常,但同时也是一个很大的安全问题,例如:

[img]http://www.domain.com/delete-account/[/img]

[img]http://www.domain.com/logout/[/img]

任何想法如何控制它,以便只有以 .jpg 结尾的图像链接被转换为 html?

[img]http://www.domain.com/image.jpg[/img]

谢谢。

【问题讨论】:

  • 你需要添加CSRF保护。
  • @SalmanPK 不,他没有。 domain.com 确实如此。详情见我的回答。
  • 大声笑?那他为什么要关心?
  • @SalmanPK 没错,这是正确的答案:“当您允许用户指定src 元素的src 属性的任意值时,您不需要关心CSRF”。请告诉我你在笑什么,我很想加入;)

标签: php security preg-replace csrf bbcode


【解决方案1】:

根据the HTTP1.1 standard,请求带有GET(用于获取图像的方法)的URL不应导致任何操作,例如注销。因此,您不需要限制以 .jpg 结尾的 URL,而且通常这是一个坏主意,因为还有其他图像格式,并且 URL 通常与其内容类型无关。

更重要的是,如果请求一个 URL确实 改变了服务器 vulnerable.net 的状态,那么这个 Cross Site Request Forgery Vulnerability 无论如何都可以通过设置一个 302 重定向的自定义服务器来利用 @987654328 @到http://vulnerable.net/logout

仅供参考,如果您真的只想替换以 .jpg 结尾的 URL,您可以将其插入组中:

$text = preg_replace("@\[img\](.*\.jpg)\[\/img\]@si",
                     "<img src=\"$1\" border=\"0\" />", $text);

但这不是一种安全机制,如果浏览器(或积极缓存的代理,或病毒扫描程序,或...)预取 URL,则会失败。 GET 请求不应导致任何操作。

【讨论】:

  • 我知道这个问题“自定义服务器将evil.com/img.jpg 302 重定向到vulnerable.net/logout”。这就是为什么我将只允许托管在我自己的服务器上的图像。
  • @rlh 您应该真正修复更改 GET 请求状态的代码,而不是过滤这些图像帖子。请记住,浏览器可能会预取网站上的所有 URL;您的网站似乎拒绝使用这些浏览器的用户登录。
【解决方案2】:

考虑这个问题的一种方法是在服务器端检查 GET 和 POST 请求是否不等价。

POST 请求可以改变服务器端的数据,GET 请求不能改变任何东西。那就是HTTP协议。 IMG 标记始终是 GET 请求。并且浏览器可以毫无风险地执行这个 GET 请求,所以问题出在 服务器端,每一个可以更改数据(数据库、会话等)的操作都必须检查请求是 POST 请求。例如,您的 /post 或 /delete-account 网址应返回 403 或 200 代码,但带有 表单页面,要求 POST 确认。如果这在您的应用程序中是错误的,那么您不仅会遇到更改 IMG 标记的问题,而且可能还会遇到预加载 GET 引用甚至机器人的“html 页面加速器”。

如果您能找到this excellent book 的副本,您可能会发现一些高级图片链接问题和过滤技巧。例如,外国网站上的链接有时可能会成为问题。但这是一个比以一种方便的方式处理 GET 和 POST 请求开始复杂得多的问题。

【讨论】:

    猜你喜欢
    • 2012-08-24
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2012-04-01
    • 1970-01-01
    相关资源
    最近更新 更多