八月面试题-2018-9-6

631 阅读6分钟

1、电商网站A和电影票网站B合作,A的用户,可以通过A网站下单购买电影票,之后跳转跳转到B(不需要登录)去选座位。 如果A、B是同域名,比如,比如a.domain.com,b.d,om,b.domain.com能不能共能不能共享cookie?如果不同域如何处理?

答:同域下 单点登陆的问题;不同域下,跨域请求的问题
不同域名cookie不能共享。A和B相同一级域名 .domain.com 就可以共享cookie。 A网站登录成功后生成token,带着访问B网站进行。 如果是淘宝和天猫的关系,就会有专门处理所有资源权限的服务 OAuth

2、请说说什么是XSS?如何攻击?如何防御?

答:XSS 跨网站指令码(英语:Cross-site scripting,通常简称为:XSS)是一种网站应用程式的安全漏洞攻击,是代码注入的一种。它允许恶意使用者将程式码注入到网页上,其他使用者在观看网页时 就会受到影响。这类攻击通常包含了 HTML 以及使用者端脚本语言。 XSS 分为三种:反射型,存储型和 DOM-based 如何攻击 XSS 通过修改 HTML 节点或者执行 JS 代码来攻击网站。 例如通过 URL 获取某些参数 上述 URL 输入可能会将 HTML 改为

,这样页面中就凭空多了一段可执行脚本。这种攻击类型是反射型攻击,也可以说是 DOM-based 攻击。 也有另一种场景,比如写了一篇包含攻击代码 的文章,那么可能浏览文章的用户都会被攻击到。这种攻击类型是存储型攻击,也可以说是 DOM-based 攻击,并且这 种攻击打击面更广。 以上示例使用了 js-xss 来实现。可以看到在输出中保留了 h1 标签且过滤了 script 标签 如何防御 最普遍的做法是转义输入输出的内容,对于引号,尖括号,斜杠进行转义 通过转义可以将攻击代码 变成 对于显示富文本来说,不能通过上面的办法来转义所有字符,因为这样会把需要的格式也过滤掉。这种情况通常采用白名单过滤的办法,当然也可以通过黑名单过滤,但是考虑到需要过滤的标签 和标签属性实在太多,更加推荐使用白名单的方式。 内容安全策略 (CSP) 是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本 (XSS) 和数据注入攻击等。无论是数据盗取、网站内容污染还是散发恶意软件,这些攻击都是主 要的手段。 我们可以通过 CSP 来尽量减少 XSS 攻击。CSP 本质上也是建立白名单,规定了浏览器只能够执行特定来源的代码。 通常可以通过 HTTP Header 中的 Content-Security-Policy 来开启 CSP content-security-policy.com/ eggjs.org/zh-cn/core/… 只允许加载本站资源 只允许加载 HTTPS 协议图片 允许加载任何来源框架 www.owasp.org/index.php/X… 上面这种就必要隐蔽,不好排查 也可以写个while循环一直往cookie中塞东西,把cookie塞爆,用户就再也打不开你的网站了。 http-only 可以防一部分xss,用js读不到cookie。 样式也可以写js的进行xss攻击 body { background-image: url('javascript:alert("XSS");') }

3、CSRF攻击是什么?如何防范?

答: CSRF 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。[1] 跟跨網站指令碼(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。 简单点说,CSRF 就是利用用户的登录态发起恶意请求。

4、如果发现在某个用户的电脑上,网站的静态资源打不开了,如何确定是CDN的问题还是那个用户机器、浏览器的问题?

5、请说说在hybrid端实现类似原生般流畅的体验,要注意哪些事项。

6、请说说浏览器事件机制中事件触发三个阶段?

答:事件触发三阶段 事件触发有三个阶段 document 往事件触发处传播,遇到注册的捕获事件会触发 传播到事件触发处时触发注册的事件 从事件触发处往 document 传播,遇到注册的冒泡事件会触发 事件触发一般来说会按照上面的顺序进行,但是也有特例,如果给一个目标节点同时注册冒泡和捕获事件,事件触发会按照注册的顺序执行。

// 以下会先打印冒泡然后是捕获 node.addEventListener('click',(event) =>{ console.log('冒泡') },false); node.addEventListener('click',(event) =>{ console.log('捕获 ') },true)

注册事件 通常我们使用 addEventListener 注册事件,该函数的第三个参数可以是布尔值,也可以是对象。对于布尔值 useCapture 参数来说,该参数默认值为 false 。useCapture 决定了注册的事件是捕获事件还是冒泡事件。对于对象参数来说,可以使用以下几个属性 capture,布尔值,和 useCapture 作用一样 once,布尔值,值为 true 表示该回调只会调用一次,调用后会移除监听 passive,布尔值,表示永远不会调用 preventDefault 一般来说,我们只希望事件只触发在目标上,这时候可以使用 stopPropagation 来阻止事件的进一步传播。通常我们认为 stopPropagation 是用来阻止事件冒泡的,其实该函数也可以阻止捕获事件。stopImmediatePropagation 同样也能实现阻止事件,但是还能阻止该事件目标执行别的注册事件。

node.addEventListener('click',(event) =>{ event.stopImmediatePropagation() console.log('冒泡') },false); // 点击 node 只会执行上面的函数,该函数不会执行 node.addEventListener('click',(event) => { console.log('捕获 ') },true) 事件代理 如果一个节点中的子节点是动态生成的,那么子节点需要注册事件的话应该注册在父节点上

  • 1
  • 2
  • 3
  • 4
  • 5
z

事件代理的方式相对于直接给目标注册事件来说,有以下优点 节省内存 不需要给子节点注销事件