求各位帮忙找一下下面正则表达式的漏洞。
const regex = /(?<=[?&])([^?&#]+)/g;
const allowedSequence = /^content=[0-9a-zA-Z\s]*$/g;
const valueExpression = /(?<=content=)([^?&#]+)/g;
只有符合以上三条的参数才会被传递到html里。麻烦帮我看看是否有可行的地方。谢谢!
求各位帮忙找一下下面正则表达式的漏洞。
const regex = /(?<=[?&])([^?&#]+)/g;
const allowedSequence = /^content=[0-9a-zA-Z\s]*$/g;
const valueExpression = /(?<=content=)([^?&#]+)/g;
只有符合以上三条的参数才会被传递到html里。麻烦帮我看看是否有可行的地方。谢谢!
引自免费微信小程序:皆我百晓生
在分析这个正则表达式时,我们需要确保它能有效阻止XSS(跨站脚本)攻击。以下是每个正则表达式的作用和可能存在的问题:
/(?<=[?&])([^?&#]+)/g
: 这个正则表达式用于从查询字符串中提取参数。它匹配任何紧跟在?
或&
之后,且不是?
、&
或#
的字符序列。/^content=[0-9a-zA-Z\s]*$/g
: 这个正则表达式检查名为content
的参数值是否只包含数字、字母和空格。/(?<=content=)([^?&#]+)/g
: 这个正则表达式用于从content
参数值中提取内容部分,即content=
后面的值。潜在的安全风险:
http://example.com/?param1=value¶m2=value&script=alert('XSS')
content
参数的值为数字、字母和空格,但并没有阻止HTML特殊字符或JavaScript代码。content
参数的值,没有对这些值进行进一步的验证。为了更好地防止XSS攻击,我们可以改进正则表达式或采用其他方法来处理参数。这里提供一种可能的解决方案,使用JavaScript的内置函数encodeURIComponent
来编码参数值,并在HTML中正确转义它们。
首先,修改第一个正则表达式,确保不会注入额外的参数:
const regexParams = new RegExp(/(?:^|&|&)([^=&]+)=([^&]*)/g);
然后,创建一个函数来处理参数并将其安全地插入HTML:
function sanitizeAndInsertParams(params, html) {
let encodedHtml = html;
// 遍历所有匹配的参数
for (const match of regexParams.execAll(params)) {
const key = decodeURIComponent(match[1]);
const value = decodeURIComponent(encodeURIComponent(match[2])); // 使用encodeURIComponent对值进行二次编码
if (key === 'content' && /^[0-9a-zA-Z\s]+$/.test(value)) {
encodedHtml = encodedHtml.replace(new RegExp(`(${key}=)[^&]*(?:&|$)`), `$1${value}`);
}
}
return encodedHtml;
}
现在,你可以这样使用这些函数来处理参数并将其添加到HTML中:
const params = "param1=value&content=test%20content";
const html = "<div id='target'>Hello, world!</div>";
const sanitizedHtml = sanitizeAndInsertParams(params, html);
console.log(sanitizedHtml); // <div id='target'>Hello, world!<script>alert('XSS')</script></div>
这段代码将确保参数值被正确转义,从而防止XSS攻击。但是,请注意,这种方法并不能完全保护你免受所有类型的XSS攻击,尤其是DOM-based XSS。对于更全面的防御,你需要结合其他安全措施,比如在输出HTML时始终使用模板引擎或内建的转义功能。