提示:前端查漏补缺,仅代表个人观点,不接受任何批评
提示:以下是本篇文章正文内容,下面案例可供参考
没有针对用户输入来源的数据以及不可信数据源的过滤
。常见情况是攻击者通过构造一个恶意链接的形式
,诱导用户传播和打开,由于链接内所携带的参数会回显于页面中或作为页面的处理数据源,最终造成XSS攻击。
存储型XSS是持久化的XSS攻击方式,通过用户输入个人信息或者发表文章的方式将恶意代码存储于服务器端
,当其他用户再次访问页面时触发,造成XSS攻击。
同样也是利用对数据源不可靠,缺乏过滤
,由于开发过程中,不可避免部分数据需要回填到DOM中,例如href、src、
代码如下(示例):
const htmlEncode = function (handleString){
return handleString
.replace(/&/g,"&")
.replace(/</g,"<")
.replace(/>/g,">")
.replace(/ /g," ")
.replace(/\'/g,"'")
.replace(/\"/g,""");
}
限定白名单
,仅允许常见的文本展示标签以及图片img标签进入白名单,这部分会再过滤后被保留,并且标签内的class和style属性也会被保留;其他属性和诸如script、iframe等标签都会被直接过滤掉。代码如下(示例):
import * as xss from 'xss';
function handleXss(content: Content) {
// 设置HTML过滤器的白名单
const options = {
whiteList: {
p: ['class', 'style'],
em: ['class', 'style'],
strong: ['class', 'style'],
br: ['class', 'style'],
u: ['class', 'style'],
s: ['class', 'style'],
blockquote: ['class', 'style'],
li: ['class', 'style'],
ol: ['class', 'style'],
ul: ['class', 'style'],
h1: ['class', 'style'],
h2: ['class', 'style'],
h3: ['class', 'style'],
h4: ['class', 'style'],
h5: ['class', 'style'],
h6: ['class', 'style'],
span: ['class', 'style'],
div: ['class', 'style'],
img: ['src', 'class', 'style', 'width'],
},
};
// 自定义规则
const myxss = new xss.FilterXSS(options);
// 直接调用 myxss.process() 即可
content.content = myxss.process(content.content);
return content;
}
style属性也不容忽视
,因此我们需要在option参数中额外为style属性设置白名单,确保style属性安全可控: css: {
whiteList: {
color: true,
'background-color': true,
},
}
针对信息源的过滤,针对不可信数据源的过滤,已经能达到初步的效果,但这远远不够,毕竟没有绝对的安全。
由于大部分攻击者会想要获取到用户的cookie去做别的坏事,所以我们需要在http的响应头set-cookie时设置httpOnly,让浏览器知道不能通过document.cookie的方式获取到cookie内容。
本文主要总结归纳了实践过程中针对XSS漏洞的防护措施,首先针对用户输入源和不可信数据源需要我们做好必要的过滤和校验,其次,通过CSP安全策略和其他HTTP响应头的设置等进一步确保安全性