网络基础07 HTTP安全

XSS跨站脚本攻击

现象

XSS(cross site scripting),即跨站点脚本工具,发生在用户的浏览器端。用户输入非法字符,向页面植入恶意代码,在目标网站上执行非原有的脚本。

如果网页会使用用户的输入渲染为HMTL内容渲染时就会执行被植入的恶意代码,利用这些恶意脚本,攻击者可获取用户的敏感信息如Cookie、SessionID等,进而危害数据安全。

XSS的本质是:恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。

分类

一般会分为存储型XSS、反射型XSS和DOM型XSS

(1)存储型XSS

攻击者将恶意代码提交到目标网站的数据库中,用户打开网站时网站将恶意代码从数据库中取出,拼接在HTML中返回给浏览器,在浏览器中执行恶意代码

恶意代码窃取用户数据,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作

这种攻击常见于带有用户保存数据的网站功能,比如论坛发帖、商品评论、用户私信等。

(2)反射型XSS

攻击者构造出包含恶意代码的特殊的URL,用户打开URL后,网站服务端取出URL中的恶意代码,凭借在HTML中返回给浏览器,在浏览器中执行恶意代码

反射型XSS与存储型XSS的区别是,存储型XSS的恶意代码存在数据库,而反射型XSS的恶意代码存在URL中。

反射型XSS攻击常见于通通过URL传递参数的功能,比如网站搜索、跳转等。由于需要用户主动打开URL才能生效,所以攻击者往往会结合多种手段诱导用户点击。

(3)DOM型XSS

攻击者构造出包含恶意代码的特殊的URL,用户打开URL后,JavaScript取出URL中的恶意代码并执行。恶意代码窃取用户数据,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

DOM型XSS与前两种区别是,DOM型XSS的取出和执行恶意代码都有浏览器端完成,属于前端JavaScript自身的安全漏洞,而其他两种属于服务端的安全漏洞。

防护

XSS攻击有两大要素:

  1. 攻击者提交恶意代码
  2. 浏览器执行恶意代码

针对第一个要素,需要对用户输入进行过滤,但是并非完全可靠,因为在提交较短并不确定内容要输出哪里,对内容的转义有可能导致乱码和不确定性问题。

所以更合理的预防方法是针对第二个要素,通过防止浏览器执行恶意代码来防范XSS,分为两类:

  1. 防止HTML中出现注入
  2. 防止JavaScript执行恶意代码

总结起来,可以采取的预防方法有:

(1)一定要针对用户输入做相关的格式检查、过滤等操作,防止任何可能的前端注入

(2)对于不需要考虑SEO的内部系统、管理系统,使用纯前端渲染代替服务端渲染,把代码与数据分开

(3)对于需要服务端拼接HTML的情况,要对HTML中的敏感字符(比如>>等)进行HTML转义(<>

(4)由于HTML转义是很复杂的,不同情况下要采取不同的准一规则,应当尽量避免自己写转义库,而是采取成熟的、业界通用的转义库

(5)对于跳转链接例如或者location.href="xxx"要检验内容,禁止以javascript:开头的链接

(6)遵循GET请求不改变服务状态的原则,改变状态的请求都是用POST或者PUT方法

(7)前端在使用innerHTMLouterHTMLdocument.write时要注意,不要把不可信数据作为HTML插入到页面

(8)使用Vue/React技术栈时不要使用v-htmldangerouslySetInnerHTML功能,在前端render阶段避免XSS隐患

(9)DOM中的内联事件监听器,比如onclickonloadonmouseover、JavaScript中的evalsetTimeoutsetIntervaleval都可以将字符串作为代码运行,如果不可信数据传递给上述API,很容易产生安全隐患,所以要尽量避免,