本文转载自微信公众号“于大胆的推特”,作者于大胆。转载本文请在twitter上大胆联系Yu公众号。回想今天web开发的安全问题,我在新浪博客的时候遇到的最多的攻击就是XSS和SQL注入攻击。博客的核心功能是发布富文本,允许执行html语义标签。如果处理不当,可以执行js语句,导致各种xss攻击。当时还没有很好的解析文章内容的DOM解析库,堵塞漏洞非常辛苦和被动。另一种攻击是sql注入,破坏了部分表数据,但没有出现大规模故障。这两种攻击在互联网刚起步时非常流行。最重要的原因是他们的宿主环境是浏览器,可以执行html和js。SQL攻击也是如此。如果宿主环境不能打印SQL执行结果,攻击就会弱很多。但是现在是APP的时代,都是接口调用。即使界面包含html字符,APP也不会执行;同时API接口的认证也非常严格,很少发生SQL注入攻击。当然,HTTPS的推广和普及也让http服务的安全性提升了很多,至少很难有野蛮的篡改攻击。那么现在攻击的土壤是企业内部网站,因为大部分都是在浏览器下运行的,那么怎么解决呢?从web安全的角度来说,cookie和session本身的设计是有问题的。之前写过一篇文章,以后可以发到公众号。XSS攻击本质上是结合cookie来造成危害的。今天同事提出了一个方法。现在很多cookie不会验证它们的来源。如果cookie和设备(比如设备号或IP)可以绑定,那么攻击就会很小。很多,比如发现攻击者附加的cookie值和IP与redis存储的cookie和IP不一致,拒绝访问。对于内部系统,可以采用二次授权验证。比如nginx有httpbasicauth验证;或者您只能登录访问内部系统。攻击分为主动攻击和被动攻击。主动攻击并不可怕,总能找到解决办法,而被动攻击就很危险,关键时刻能杀人。当出现安全问题时,首先要确定服务器是否被人控制。如果被控制,危险性非常大;如果只利用应用程序漏洞,危险会小很多。服务器一旦被攻击,数据库密码等关键信息就会泄露,数据库相当于裸奔。即使数据库隔离得很好,也经不起别人的DELETE语句;为了减少损失,有两个建议。首先是数据库用户授权要更加细化;另外,代理数据库用于抵御一些通过代理的攻击。应用层攻击主要是利用软件漏洞,或者是考验程序员的能力。因此,经常升级系统和软件,使用相对成熟的代码框架,严谨的编程可以减少很多问题。大约90%的安全问题仍然是代码造成的。当然,密码安全也很重要。理论知识很多,但只要掌握几个要点,大部分问题都能迎刃而解。然后将sha1存储到数据库中,很容易从字典中进行攻击;最后,应用层的攻击防御也很重要,但是现在直接密码登录已经很少见了,都是验证码或者微信授权。当然,一个很重要的习惯就是经常修改密码,可以解决很多问题。其实有时候出现安全问题,最后发现是密码泄露了,根本不是技术问题。为了服务器本身的安全,尽量少安装软件;少开外网口(比如mongodb、es一定不能绑定外网口),即使开了也要加入白名单;使用防火墙进行更细粒度的控制;service比如web服务器被攻击,但是web服务器访问的数据库密码是由更安全的硬件存储的,所以危险性要小很多。有时候大家都很注重外部安全,但是内网之间的隔离也很重要,不能畅通无阻。隔离的另一个好处是,在出现问题后,可以将服务快速复制到其他机房,从而降低故障的影响。授权也很重要。服务之间的授权方式必须在云端,不能依赖本地。当然,安全的核心还是数据库资源,数据是一切的基础。最后,没有绝对的安全。这完全是一场游戏。如果网站不大,可能没有人想攻击您。如果按比例放大,它将是一棵大树。提前做好应对的准备,才不会出现问题的时候不知所措。
