本书未发布

71. XSS 安全漏洞

未匹配的标注

说明

目前我们的项目中存在非常严重的 XSS 安全漏洞。作为一个合格的 Web 开发工程师,必须遵循一个安全原则:
永远不要信任用户提交的数据。

我们在创建话题时对用户提交的内容字段 body 太过信任,没有对其做过滤处理,即原封不动的显示在页面上,这是非常危险的。

XSS 也称跨站脚本攻击 (Cross Site Scripting),恶意攻击者往 Web 页面里插入恶意 JavaScript 代码,当用户浏览该页之时,嵌入其中 Web 里面的 JavaScript 代码会被执行,从而达到恶意攻击用户的目的。

一种比较常见的 XSS 攻击是 Cookie 窃取。我们都知道网站是通过 Cookie 来辨别用户身份的,一旦恶意攻击者能在页面中执行 JavaScript 代码,他们即可通过 JavaScript 读取并窃取你的 Cookie,拿到你的 Cookie 以后即可伪造你的身份登录网站。(扩展阅读 —— IBM 文档库:跨站点脚本攻击深入解析

有两种方法可以避免 XSS 攻击:

第一种,对用户提交的数据进行过滤;
第二种,Web 网页显示时对数据进行特殊处理,一般使用 htmlspecialchars() 输出。
Laravel 的 Blade 语法 {{ }} 会自动调用 PHP htmlspecialchars 函数来避免 XSS 攻击。但是因为我们支持 WYSIWYG 编辑器,我们使用的是 {!! !!} 来打印用户提交的话题内容:

如下图我们尝试添加一个包含 XSS 攻击代码的正文段的内容试一下。我们可以看到 XSS 攻击代码被当做普通文本显示出来了。
在上一节话题详情页显示 $topic->body 时我们使用了 助手方法 raw , 这是因为我们使用编辑器保存的话题正文内容是HTML代码段

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~