前端面试考点之前端安全问题

1、CSRF

CSRF(Cross-site request forgery):跨站请求伪造攻击者盗用了你的身份,以你的名义发送恶意请求。

常见攻击场景::以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账。

1)CSRF的攻击原理

攻击原理

要完成一次CSRF攻击,受害者必须满足两个必要的条件:

a、登录受信任网站A,并在本地生成Cookie。(如果用户没有登录网站A,那么网站B在诱导的时候,请求网站A的api接口时,会提示你登录)

b、在不登出A的情况下,访问危险网站B(其实是利用了网站A的漏洞)。

cookie保证了用户可以处于登录状态,但网站B其实拿不到cookie。

2)如何防御CSRF攻击

方法一:Token 验证

服务器发送给客户端一个token;客户端提交的表单中带着这个token。如果这个token不合法,那么服务器拒绝这个请求。

方法二:Referer 验证

根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。只接受本站的请求,服务器才做响应;如果不是,就拦截。

2、XSS

XSS(Cross Site Scripting):跨域脚本攻击。跨站脚本攻击(XSS)最常见的攻击方式就是通过在交互式网站(例如论坛、微博等)中嵌入javascript脚本,当其他用户访问嵌有脚本的网页时,攻击者就能通过document.cookie窃取到用户cookie信息。

1)XSS的攻击原理

不需要你做任何的登录认证,它会通过合法的操作(比如在url中输入、在评论框中输入),向你的页面注入脚本(可能是js、hmtl代码块等)。

2)XSS类型

a、反射型:发出请求时,XSS代码出现在url中,作为输入提交到服务器端,服务器端解析后响应,XSS代码随响应内容一起传回给浏览器,最后浏览器解析执行XSS代码。这个过程像一次反射,所以叫反射型XSS。

攻击步骤如下:

1. 攻击者在url后面的参数中加入恶意攻击代码。

2. 当用户打开带有恶意代码的URL的时候,网站服务端将恶意代码从URL中取出,拼接在html中并且返回给浏览器端。

3. 用户浏览器接收到响应后执行解析,其中的恶意代码也会被执行到。

4. 攻击者通过恶意代码来窃取到用户数据并发送到攻击者的网站。攻击者会获取到比如cookie等信息,然后使用该信息来冒充合法用户的行为,调用目标网站接口执行攻击等操作。

b、存储型:存储型XSS和反射型XSS的差别在于,提交的代码会存储在服务器端(数据库、内存、文件系统等),下次请求时目标页面时不用再提交XSS代码。

存储型

1. 攻击者将恶意代码提交到目标网站数据库中。

2. 用户打开目标网站时,网站服务器将恶意代码从数据库中取出,然后拼接到html中返回给浏览器中。

3. 用户浏览器接收到响应后解析执行,那么其中的恶意代码也会被执行。

4. 那么恶意代码执行后,就能获取到用户数据,比如上面的cookie等信息,那么把该cookie发送到攻击者网站中,那么攻击者拿到该cookie然后会冒充该用户的行为,调用目标网站接口等违法操作。

3)如何防御XSS

XSS 攻击有两大要素:

a、攻击者提交恶意代码。

b、浏览器执行恶意代码。

浏览器默认开启XSS保护。该参数是设置在响应头中目的是用来防范XSS攻击的。

方法一:输入过滤。后端需要对提交的数据进行过滤。

方法二: 编码。对用户输入的数据进行HTML Entity编码、 CSS 编码、URL 编码(将不可信数据作为 URL 参数值时需要对参数进行 URL 编码。将参数值进行 encodeURIComponent 编码)。

方法三:前后端分离。改成纯前端渲染,把代码和数据分隔开。对 HTML 做充分转义。

3、cookie安全策略

对cookie的读写或发送一般有如下字段可以进行设置

a、http-only:只允许http或https请求读取cookie、JS代码是无法读取cookie的(document.cookie会显示http-only的cookie项被自动过滤掉)。发送请求时自动发送cookie.

b、secure-only:只允许https请求读取,发送请求时自动发送cookie。

c、host-only:只允许主机域名与domain设置完成一致的网站才能访问该cookie。

如何防御cooike被篡改

方法一:给Cookie添加HttpOnly属性。这种属性设置后, 只能在http请求中传递, 在脚本中, document.cookie无法获取到该Cookie值。对XSS的攻击, 有一定的防御值,但是对网络拦截, 还是泄露了。尽可能使用https。为cookie设置Secure属性为true,这样cookie只能使用https协议发送给服务器,而https比http更加安全。

方法二:在cookie中添加校验信息。 这个校验信息和当前用户外置环境有些关系,比如ip,user agent等有关。 这样当cookie被人劫持了, 并冒用, 但是在服务器端校验的时候, 发现校验值发生了变化, 因此要求重新登录, 这样也是种很好的思路, 去规避cookie劫持.

方法三:在cookie当中,不要存放敏感数据,只存放一个session Id,并定时更换cookie中的session id。 让session id按一定频率变换, 同时对用户而言, 该操作是透明的, 这样保证了服务体验的一致性.

方法四:第一点说了请求令牌理论上是可破解的,所以非常重要的场合,应该考虑使用验证码(令牌的一种升级,目前来看破解难度极大),或者要求用户再次输入密码(亚马逊、淘宝的做法)。但这两种方式用户体验都不好,所以需要产品开发者权衡。

你可能感兴趣的:(前端面试考点之前端安全问题)