前段时间读了《白帽子讲Web安全》,很不错的一本安全书籍,适合我这种安全小白。这篇文章是对客户端脚本部分的总结。
安全本质
安全的本质是信任。安全方案设计的基础是建立在信任之上,我们必须信任某些东西,必须有一些基本的假设。从另外一个方面讲,如果我们作为决策依据的条件被打破,被绕过,那么就会导致安全假设的前提不再可靠。
浏览器安全
同源策略
相同协议,域名,子域名,端口都相同才会被认为是同源。限制了来自不同源的脚本或者document对当前document的修改。
同源策略是浏览器安全的基础。可以想象如果没了同源策略,那么我通过脚本直接修改任何一个网站的东西,这不是乱套了吗?
注意有一些标签不收同源策略的影响,比如link,script,img,这些标签的src属性相当于发起了一次get请求。
XSS攻击
说白了就是把一段javascript脚本注入到输出的html中,使得渲染html的时候,解析了javascript脚本并且运行攻击代码。
XSS攻击是非常常见的一种攻击方式,我自己就在我们官网找到了一处反射XSS漏洞(直接把用户输入的搜索字符串打印到了搜索历史中,所以我如果输入搜索<script>alert(1)</script>
的就会弹出1)。
XSS攻击可以干啥,还是用上面我们官网的例子。如果我不是执行alert(1),而是发送一个删除帖子的API请求,那么只要点了这个链接那么这个用户发表过的文章就都被删除了,甚至我可以给他的好友群发站内信把我构造的链接加上,那么每一个打开这个链接用户都会中招,然后又会给他们的好友再群发站内信,这就构造了一个XSS蠕虫!所以千万不要低估XSS的危害。
如何防止XSS攻击
http-only
严格来说http-only是防止被XSS攻击之后的cookie劫持的问题。加了http-only之后的cookie不能被javascript访问到。给关键业务和敏感信息的cookie添加http-only是业界通用的处理方式
输入/输出检查
输入检查在不同的语境下面有不同的方式。比如登录框只限制手机号码,搜索框只允许出现英文中文字母,社区评论的富文本要稍微复杂一些。
变量输出到HTLM的时候要使用HtmlEncode编码转一遍,我上面讲的那个XSS问题就可以通过这个解决。
网友评论