参考链接:https://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/
https://www.cnblogs.com/fengsiyi/p/7337450.html
常见的几种web前端安全问题有:XSS(跨站脚本攻击)、CSRF(跨站请求伪造)、SQL注入等。
1.XSS(跨站脚本攻击)(cross-site scripting)
它一般有三种类型:
第一种:反射型XSS
这种xss,跨站代码一般存在于某一个链接中,当呗攻击者访问这样的连接时,跨站代码就被执行,这类跨站代码一般不会存储在服务器上面
攻击原理:通过给别人发送带有恶意脚本代码参数的URL,当URL地址被打开时,特有的恶意代码参数被HTML解析、执行。它的特点是非持久化,必须用户点击带有特定参数的链接才能引起。
第二种:存储型XSS
这种xss用起来比较方便,跨站代码会存储在服务器上面数据库中,换句话就是可以持久的进行攻击,亦称持久型XSS
攻击原理:XSS代码被提交给网站-->网站把XSS代码存储进数据库—>当该页面再次被请求时,服务器发送已经被植入XSS代码的数据给客户端—>客户端执行XSS代码
第三种:基于DOM的XSS
这是由于客户端脚本自身的解析不正确导致的安全问题
攻击原理:源于DOM相关的属性和方法(url、src等),被插入用于XSS攻击的脚本。
XSS攻击是Web攻击中最常见的攻击方法之一,原理是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列 表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等等,有时候还和其他攻击方式同时实 施比如SQL注入攻击服务器和数据库、Click劫持、相对链接劫持等实施钓鱼。
防御XSS的手段:
概括:防范的方法就是,不信任任何用户的输入,对每个用户的输入都做严格检查,过滤,在输出的时候,对某些特殊字符进行转义,替换等。
1)HttpOnly。现在HTTP协议(HTTPS也是可以的)才能读取cookies,JavaScript是读取(注意是读取,不是操作)不到cookies的。这本质上不是预防XSS,而是在被攻破时候不允许JS读取Cookie。
2)过滤用户输入。检查用户输入的内容中是否有非法内容。如<>(尖括号)、”(引号)、 ‘(单引号)、%(百分比符号)、;(分号)、()(括号)、&(& 符号)、+(加号)等。服务端也要严格控制输出。
3)处理富文本。处理的过程是在服务端配置富文本标签和属性的白名单,不允许出现其他标签或属性(例如script、iframe、form等),即”XSS Filter“。
2.CSRF(跨站请求伪造)
CSRF实现原理详细过程和图示:
1、用户C打开浏览器,访问网站A,输入用户名和密码请求登录网站A;
2、在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
3、用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
4、网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问站点A;
5、浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
CSRF攻击是源于WEB的隐式身份验证机制!WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的!
一般在(4)处恶意网站(B)的攻击手段如下(必须是指向A的地址,否则无法带上cookie):
1.譬如在网站内的图片资源中潜入恶意的转账操作
2.构建恶意的隐藏表单,并通过脚本提交恶意请求
而且,从头到尾,攻击网站都没有获取到过 cookie,都是通过浏览器间接实现(利用Web的cookie隐式身份验证机制),所以HttpOnly并不会影响这个攻击。
几种常见防御CSRF的手段:
1. 验证HTTP Referer字段(非常简单,但是鉴于客户端并不可信任,所以并不是很安全)
(防止CSRF,检查Referer字段简单直接,但是其完全依赖浏览器发送正确的Referer字段。虽然http协议对此字段的内容有明确的规定,但并无法保证来访的浏览器的具体实现,亦无法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器,篡改其Referer字段的可能。)
2. 在请求地址中添加token并验证
(譬如post中,以参数的形式加入一个随机产生的token)
3. 验证码(图片验证码和短信验证码)
4. 对特殊参数(比如增加的伪随机数)进行加密
3.SQL注入
SQL注入的原理(步骤):
(1)确定网站是否存在注入点,若存在,找到SQL注入位置
(2)判断服务器类型和后台数据库类型
(3)针对不通的服务器和数据库特点(猜测表名和列名)进行SQL注入攻击
防御SQL注入手段:
1)PreparedStatement(简单有效)
采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX方法传值即可。
使用好处:
(1).代码的可读性和可维护性.
(2).PreparedStatement尽最大可能提高性能.
(3).最重要的一点是极大地提高了安全性.
原理:
sql注入只对sql语句的准备(编译)过程有破坏作用
而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理,
而不再对sql语句进行解析,准备,因此也就避免了sql注入问题.
2)使用正则表达式过滤传入的参数(包括字符串过滤)