功能检测包括确定浏览器是否支持某段代码,以及是否运行不同的代码(取决于它是否执行),以便浏览器始终能够正常运行代码功能,而不会在某些浏览器中出现崩溃和错误。例如:
if ('geolocation' in navigator) { // 可以使用 navigator.geolocation } else { // 处理 navigator.geolocation 功能缺失 }Modernizr是处理功能检测的优秀工具。
功能推断(feature inference)
功能推断与功能检测一样,会对功能可用性进行检查,但是在判断通过后,还会使用其他功能,因为它假设其他功能也可用,例如:
if (document.getElementsByTagName) { element = document.getElementById(id); }非常不推荐这种方式。功能检测更能保证万无一失。
UA 字符串
这是一个浏览器报告的字符串,它允许网络协议对等方(network protocol peers)识别请求用户代理的应用类型、操作系统、应用供应商和应用版本。它可以通过navigator.userAgent访问。 然而,这个字符串很难解析并且很可能存在欺骗性。例如,Chrome 会同时作为 Chrome 和 Safari 进行报告。因此,要检测 Safari,除了检查 Safari 字符串,还要检查是否存在 Chrome 字符串。不要使用这种方式。
考虑到历史原因及现代浏览器中用户代理字符串(userAgent)的使用方式,通过用户代理字符串来检测特定的浏览器并不是一件轻松的事情。所以使用用户代理检测是最后的选择。
用户代理检测一般适用以下的情形:
不能直接准确的使用功能检测。
同一款浏览器在不同平台下具备不同的能力。这个时候可能就有必要确定浏览器位于哪个平台。
为了跟踪分析等目的需要知道特定的浏览器。
浏览器版本检测方式可以使用navigator.userAgent。
JS同源策略(same-origin policy)同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。
下表给出了相对同源检测的示例:
URL 结果 原因成功 只有路径不同
成功 只有路径不同
https://store.company.com/secure.html 失败 不同协议 ( https和http )
:81/dir/etc.html 失败 不同端口 ( 80是默认的)
失败 不同域名 ( news和store )
https://developer.mozilla.org/zh-CN/docs/Web/Security/Same-origin_policy
跨标签页通讯不同标签页间的通讯,本质原理就是去运用一些可以 共享的中间介质,因此比较常用的有以下方法:
通过父页面window.open()和子页面postMessage
异步下,通过 window.open('about: blank') 和 tab.location.href = '*'
设置同域下共享的localStorage与监听window.onstorage
重复写入相同的值无法触发
会受到浏览器隐身模式等的限制
设置共享cookie与不断轮询脏检查(setInterval)
借助服务端或者中间层实现
跨域的解决方案按实际使用量排序(个人理解):
CORS 跨域
nginx反向代理
WebSockets
JSONP 只支持GET请求
hash + iframe 只支持GET请求
postMessage 只支持GET请求
document.domain
https://lidaguang1989.github.io/2016/09/cors/
浏览器数据本地存储方法(localStroage、sessionStroage、cookie、indexedDB)目前常见的存储方式为以下三种:
Cookie
web存储 (locaStorage和seesionStorage)
IndexedDB
在H5出现之前,数据都是存储在cookie中的。为了解决cookie的局限性引入了Web存储,indexedDB用于客户端存储大量结构化数据(包括, 文件/ blobs)。
共同点:都是保存在浏览器端、且同源的
区别:
容量大小 4kb左右 5M左右 5M左右 无限容量
过期时间 只在设置的过期时间之前一直有效,
即使窗口或者浏览器关闭 始终有效 当前浏览器窗口关闭前有效 始终有效
存储方式 浏览器和服务器间来回传递 本地保存 本地保存 本地保存
作用域 在同源窗口中共享 在同源窗口中共享 在同源窗口并且同一窗口中共享 在同源窗口中共享
Web安全举例
XSS(跨站脚本攻击)几种形式,防范手段,过滤哪些字符
csrf(跨站请求伪造)原理,实现,防范手段
sql注入
命令行注入
DDoS(Distributed Denial of Service) 又叫分布式拒绝服务
流量劫持
DNS劫持
HTTP劫持
服务器漏洞
https://juejin.im/entry/5a559dd36fb9a01c9e45d896
状态码https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status
Web Worker