未分类

实习招聘面试经历-3

Uptown Funk

1.跨域

  • 讲jsonp的原理,实现
  • jsonp的安全性:
    当时自己说的是可不可以判断来源,比如请求头,域名.然后面试官说jsonp是get请求,没有origin的.我又猜测用reffer? 嗯,这个对了;
    我还猜测是不是用cookie和session.但是直接的script请求是不能带上这个的.
    面试官让我再想,我就猜可不可以传多一个验证的字段验证身份.对了.后面自己看书发现了这种方法就是token.记录如下:
    先介绍CSRF: 跨站请求伪造,cross site requrest forgery.
    意思是跨域发出请求,请求是身份认证后的(除了referer不一样,cookie是一样的)
    原理: 受害者必须依次完成两个步骤:
      1.登录受信任网站A,并在本地生成Cookie。
      2.在不登出A的情况下,访问危险网站B。
    cookie发送:如果是内存cookie,都可以正常发送,如果是本地cookie,需要带有p3p属性.
    get请求可以通过img等标签,post请求直接通过form表单提交.

 CSRF攻击是源于WEB的隐式身份验证机制!WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的!

防御:

  1. Cookie Hashing, 所有表单中包含同一个伪随机值,表单提交的时候提交这个cookie(加密后)进行验证
  2. 用验证码,能完全解决,但是用户体验不好
  3. One-Time Token, 不同的表单包含一个不同的伪随机值. 服务端给一个token,token可能包含时间戳,用户名id,随机字符串
  4. 限制Session Cookie的生命周期
  5. 检查Referer
  6. 对于jsonp,过滤callback函数名,按照 JSON 格式标准输出 Content-Type 及编码( Content-Type : application/json; charset=utf-8 )。

参考: 浅谈CSRF攻击方式

  • 跨域有没有额外的请求? 当时说没有=.= 后来想到又OPTIONS,自己确实遇到过的.
    OPTIONS的用途:
    1、获取服务器支持的HTTP请求方法;也是黑客经常使用的方法。
    2、用来检查服务器的性能。例如:AJAX进行跨域请求时的预检,需要向另外一个域名的资源发送一个HTTP OPTIONS请求头,用以判断实际发送的请求是否安全。

  • 跨域的话,有没有遇到传cookie的问题?没有=.= 怎么解决?
    查了一下资料,大概是这几种:

  1. 在后端提供一个获取其他域名下的所有cookie的接口,前端拿到cookie直接设置/或者后台返回设置cookie的js代码,前端jsonp加载
  2. 通过script发起一个请求,请求一个后端接口,发送一个加密的key,服务端验证key的合法性,在接口返回中写入登陆成功的cookie
  3. sohu的解决方法: 在登陆域名passport.sohu.com下登陆,通过隐藏的iframe提交登陆,返回内容写入成功登陆的cookie,此时cookie只有passport,然后前端通过登陆成功的标志操作iframe请求,带上cookie.后端检查到成功登陆的cookie后返回一段发起多个登陆请求的html片段; 这段html会请求一个加密后的17173的登陆url,这个链接就包含2中讲的key了,后面就和2一样. 在IE中,需要在响应内容的头部加入P3P.

其实当时如果不太紧张应该是可以想出来的=.= 当时说自己没遇到不会.
参考: 实现跨域cookie共享(转载)

移动端相关

  • tap的实现原理,解决什么问题(300ms是系统为了检测是不是双击)
  • 一个元素保留了tap事件和click事件,怎么阻止click事件的触发
    参考StackOverlow: Prevent click event after handling jQuery Mobile tap event on iOS
    1
    2
    3
    4
    5
    $('elementsSetThatCanBeTapped').on('tap', function(e) {
    e.preventDefault();
    e.stopPropagation();
    $(this).off('click');
    })

看起来是解除了click事件,阻止默认行为和冒泡.我试试看..嗯试了一下真的可以.但是如果可以,不要绑定click事件就好了吧…上面差不多就是这么做了.不过如果有事件委托那不太一样.果然面试的时候脑子不顶用啊哈哈.

  • 阻止事件冒泡/默认事件怎么做

XSS

问我还有没有了解其他前端安全.说了XSS.Cross Site Scripting.跨站脚本.然而重点不在跨站上.
发生在目标网站中目标用户的浏览器层面上,当用户浏览器渲染整个HTML文档的过程中出现了不被预期的脚本指令并执行时,XSS发生了.
跨站是因为一般攻击都是获取第三方的脚本资源(script请求).分为三种:反射型,存储型,DOMXSS

  • 反射型: XSS代码在url中作为输入提交到服务端,服务端解析后响应并在响应内容中出现这段xss代码,浏览器执行.(get,跳转)
  • 存储型: XSS代码存在服务端,比如留言板
  • DOMXSS: 通过各种输入点/输出点进行攻击(输入:document.cookie/location/url),(输出:docuemnt.write/window.open…)

防御措施:

  • 不要在页面中插入任何不可信数据,除非这些数已经进行了编码
  • 在将不可信数据插入到HTML标签之间时,对这些数据进行HTML Entity编码.编码的有6个: (当时蒙对了4个=.=)
    1
    2
    3
    4
    5
    6
    & --> &
    < --> &lt;
    > --> &gt;
    " --> &quot;
    ' --> &#x27;
    / --> &#x2F;

不推荐将单引号( ‘ )编码为 ' 因为它并不是标准的HTML标签
需要对斜杠号( / )编码,因为在进行XSS攻击时,斜杠号对于关闭当前HTML标签非常有用

  • 在将不可信数据插入到HTML属性里时,对这些数据进行HTML属性编码
    属性一定用引号,属性里的引号就进行编码
  • 在将不可信数据插入到SCRIPT里时,对这些数据进行SCRIPT编码
  • 在将不可信数据插入到Style属性里时,对这些数据进行CSS编码
  • 在将不可信数据插入到HTML URL里时,对这些数据进行URL编码

参考: 防御 XSS 的七条原则

分享到