之前做项目写的那叫一个随意。。由于都是小项目和练手demo,完全没有管过安全相关方面的知识。。回头重新总结一下吧
目前比较常见的安全问题大概有这几种:
- XSS Cross Site Script 跨站脚本攻击
- CSRF Cross-site request forgery 跨站请求伪造
- SQL注入
- DDOS Distributed Denial of Service 分布式拒绝服务
比较少见的,还是了解一下的:
- iframe风险
- 上传漏洞
- 点击劫持
- 钓鱼
一个个来说吧~
XSS
简单来说就是页面执行了不被期望解析的代码,恶意web用户将代码植入到提供给其它用户使用的页面。比如评论内容为死循环的script代码段,get参数为js代码等。
跨站脚本攻击的危害:窃取cookie、放蠕虫、网站钓鱼 ...
跨站脚本攻击的分类主要有:存储型XSS、反射型XSS、DOM型XSS
解决办法就是把所有前段输出数据转义,保证不被解析。
原则:宁死也不让数据变成可执行的代码,不信任任何用户的数据,严格区分数据和代码。
保存的数据库的时候,for PHPer,
addslashes
,stripcslashes
这两个函数可以为预定义',",\打上(去掉)'\'。
htmlentities
或者htmlspecialchars
会将预定义的字符转化为html实体,也就是让浏览器输出html代码。
js中,html实体应直接加入innerHTML里面不会被解析,会被显示成代码,如果是html字符的话就需要加入textContent里面,可以用这个来写过滤函数。
// 防止中文乱码,但我好像没事
htmlentities($str, ENT_COMPAT , "UTF-8");
原代码
<script>alert(1)<\/script>
<p>1<p>在</p>11</p>
转化输出大概是这样的
<script>alert(1)<\/script>
<p>1<p>222</p>11</p>
CSRF
可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......
造成的问题包括:个人隐私泄露以及财产安全。简单来说,通过客户浏览器的cookie等个人信息去以客户身份行动。
Web的隐式身份验证机制只能保证请求是来自于你的浏览器,不能保证是不是用户操作的。
简单来说CSRF攻击可以分成两个部分,在可信任的访问网站登陆并生成cookie,在不登出的情况下有意或者无意的访问危险网站。这里的危险网站访问不一定是一个网页,可以是一个请求,一个资源的地址。
一般策略有几种,验证 HTTP Referer 字段;添加 token 并验证;重要操作用post,验证码等。
验证 HTTP Referer 字段
根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。但这个属性是网页浏览器的,安全性依赖于第三方(即浏览器)上,旧浏览器上是可以修改的。
其次,有些用户有关闭Referer的隐私需求,并正常访问时,会被认为是CSRF攻击。
这种方法的好处就是简单易行,不改变任何源代码,直接写一个拦截的中间件就行了,缺点也很明显,过度依赖于第三方。但 Referer Check 可以用来监控 CSRF 攻击。
添加 token 并验证
token是两端都保存的,标志用户的长字符串。IBM提到的做法是将token完全是页面获取,镶嵌进form表单的所有url里面成为参数(post则是隐藏input value)。
这样对这个页面的dom操作比较复杂,影响性能,尤其是异步的话要更新更多form。
当然我们还是可以存在cookie里面的。那么问题来了,如果存在cookie里,岂不是和不用token没区别了?
区别还是有的,一般的cookie是直接用作身份凭证参数,但用token的时候可以把cookie当成存储的地方(cookie可以加HttpOnly)!
需要的时候表单从cookie中找到需要的token在辅以算法(如md5)或者参数调用,达到目的。
当然也可以放在请求的header里作为参数。
Token 应该是一次性的,即每次请求成功后要更新 Token,这样也能刷新登陆时间。比较好用的库:jwt。
验证码
重要步骤可以使用,不过尽量少用,比较烦人。。
SQL注入
就是防止储存的数据对你的服务器,和业务造成印象。还是那几个,引号,特殊符号等,根本的手段就是参数化查询或者做词法分析。
还是那个原则,永远不要相信用户的输入。不要使用动态拼装SQL语句。可以调用已有的高级参数化sql类实现,内部一般都会有自动检测转译语法。
ps: 为应用创建单独的用户来使用数据库,控制权限。
DDOS 攻击
指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒绝服务攻击的威力。
高防服务器
高防服务器主要是指能独立硬防御 50Gbps 以上的服务器,能够帮助网站拒绝服务攻击,定期扫描网络主节点等,这东西是不错,就是贵~
黑名单
设置黑名单,此方法秉承的就是“错杀一千,也不放一百”的原则,会封锁正常流量,影响到正常业务。
DDoS 清洗
DDoS 清洗会对用户请求数据进行实时监控,及时发现DOS攻击等异常流量,在不影响正常业务开展的情况下清洗掉这些异常流量。
CDN 加速
CDN 服务将网站访问流量分配到了各个节点中,这样一方面隐藏网站的真实 IP,另一方面即使遭遇 DDoS 攻击,也可以将流量分散到各个节点中,防止源站崩溃。
这个是真的一点经验都没有。。。也不能实践很尴尬,就先了解一下吧。
iframe风险
广告需求的iframe可能会因为到期域名更换等原因形成威胁。项目中目前还没用到过iframe这类元素,无经验。。
上传漏洞
上传的文件是有可能是可执行的脚本或者其他的非期望的文件,对服务器构成威胁。
应该严格控制上传的类型,而不只是上传文件的后缀,友情提问@简书:为什么我头像会动,不是限制jpg,jpeg,png吗?(滑稽)。
此外,上传的文件保存路径的所有文件,非特殊情况文件路径应该设定不可被执行(nignx设置)。
location /protected/ {
deny all;
}
在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。
在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。
此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。
还可以单独设置文件服务器的域名:由于浏览器同源策略的关系,一系列客户端攻击将失效。
点击劫持和钓鱼
这两个都差不多,算是比较久远的攻击手法,都是模拟出虚假页面来获取用户的登录账号和密码。一个利用覆盖遮盖,一个是利用路由跳转到钓鱼网站。
高级一点的都可以牵扯到xss攻击上。一般的话注意一下https和网址影噶就差不多了。。