JS加密解密/XSS的防御

之前有一篇文章提到过xss,今天说一下防御策略

js 复制代码
分析一下这段代码,拆解一下代码,写一篇对于防御xss的心得
if (arr != null) {
var filterXSS = function(e) {
    if (!e)
        return e;
    for (; e != unescape(e); )
        e = unescape(e);
    for (var r = ["<", ">", "'", '"', "%3c", "%3e", "%27", "%22", "%253c", "%253e", "%2527", "%2522"], n = ["&#x3c;", "&#x3e;", "&#x27;", "&#x22;", "%26%23x3c%3B", "%26%23x3e%3B", "%26%23x27%3B", "%26%23x22%3B", "%2526%2523x3c%253B", "%2526%2523x3e%253B", "%2526%2523x27%253B", "%2526%2523x22%253B"], a = 0; a < r.length; a++)
        e = e.replace(new RegExp(r[a],"gi"), n[a]);
    return e
};
return filterXSS(unescape(arr[2]));
}
;return null

这段代码的思路拆解

这段代码的目的是对用户输入进行过滤,以防止跨站脚本(XSS)攻击。让我们详细拆解这段代码,并分析其工作原理和有效性。

代码拆解

  1. 检查 arr 是否为空:

    js 复制代码
    if (arr != null) {

    代码首先检查变量 arr 是否为 null。如果 arrnull,则不进行后续操作。

  2. 定义 filterXSS 函数:

    js 复制代码
    var filterXSS = function(e) {

    filterXSS 是一个用于过滤 XSS 攻击的函数。它接收一个参数 e,表示需要过滤的输入。

  3. 检查 e 是否为空:

    js 复制代码
    if (!e) return e;

    如果 enullundefined,直接返回 e,不进行后续过滤。

  4. 反复解码 e

    js 复制代码
    for (; e != unescape(e); ) e = unescape(e);

    这段代码使用 unescape 函数对 e 进行反复解码,直到 e 无法再被解码为止。这一步旨在处理被编码多次的攻击字符串。

  5. 替换潜在危险字符:

    js 复制代码
    for (var r = ["<", ">", "'", '"', "%3c", "%3e", "%27", "%22", "%253c", "%253e", "%2527", "%2522"], n = ["&#x3c;", "&#x3e;", "&#x27;", "&#x22;", "%26%23x3c%3B", "%26%23x3e%3B", "%26%23x27%3B", "%26%23x22%3B", "%2526%2523x3c%253B", "%2526%2523x3e%253B", "%2526%2523x27%253B", "%2526%2523x22%253B"], a = 0; a < r.length; a++)
        e = e.replace(new RegExp(r[a],"gi"), n[a]);

    这里定义了两个数组 rnr 包含需要替换的潜在危险字符及其编码形式,而 n 包含相应的安全替换字符。通过循环,逐个将 r 中的字符替换为 n 中的字符。

  6. 返回过滤后的字符串:

    js 复制代码
    return e

    最终返回过滤后的字符串。

  7. 调用 filterXSS 并返回结果:

    js 复制代码
    return filterXSS(unescape(arr[2]));

    arr[2] 进行解码,并将其传递给 filterXSS 函数进行过滤,然后返回过滤后的结果。

  8. 处理空 arr 情况:

    js 复制代码
    ;return null

    如果 arrnull,则直接返回 null

防御 XSS 的心得

  1. 多层次编码和解码: 在处理用户输入时,不仅要考虑原始输入,还要考虑多次编码后的输入。攻击者常常会对恶意脚本进行多次编码以绕过简单的过滤规则。代码中通过反复调用 unescape 函数处理了这种情况。
  2. 全面的字符替换: 代码中定义了一个字符替换列表,将 <, >, ', " 等潜在危险字符及其多种编码形式替换为对应的安全字符。这种做法可以防止攻击者利用这些字符注入恶意脚本。
  3. 防御策略的全面性: 防御 XSS 攻击不仅仅是过滤和替换输入,还包括在输出时进行适当的编码和转义。在不同的上下文中(如 HTML、JavaScript、URL 等),需要使用不同的编码方法,以确保输出内容是安全的。
  4. 使用成熟的库和框架: 尽管自定义的过滤函数可以解决部分问题,但使用成熟的、安全的库和框架(如 OWASP 提供的库)往往更加可靠。这些库经过广泛测试,并包含了应对各种复杂攻击手段的策略。
  5. 不断更新和审计: 安全是一个不断变化的领域,新型攻击手段不断涌现。开发人员应定期更新和审计代码,确保其防御策略能够应对最新的安全威胁。

总之,防御 XSS 攻击需要从多个角度进行考虑和处理,包括输入过滤、输出编码以及使用可靠的安全库和框架。通过多层次的防御策略,可以有效地提高应用程序的安全性。

代码的防护jsjiami在线js加密解密工具

怎么隐藏你的xss保护逻辑呢,使用在线js加解密工具对代码进行保护。

相关推荐
夏小花花1 分钟前
vue3 ref和reactive的区别和使用场景
前端·javascript·vue.js·typescript
掘金安东尼4 分钟前
前端周刊第427期(2025年8月4日–8月10日)
前端·javascript·面试
Mintopia17 分钟前
一个月速成 AI 工程师:从代码小白到智能工匠的修炼手册
前端·javascript·aigc
Mintopia21 分钟前
Next.js 全栈:接收和处理请求
前端·javascript·next.js
tanyongxi6630 分钟前
C++ 特殊类设计与单例模式解析
java·开发语言·数据结构·c++·算法·单例模式
遗憾皆是温柔32 分钟前
24. 什么是不可变对象,好处是什么
java·开发语言·面试·学习方法
wearegogog1231 小时前
C语言中的输入输出函数:构建程序交互的基石
c语言·开发语言·交互
Fine姐1 小时前
The Network Link Layer: 无线传感器中Delay Tolerant Networks – DTNs 延迟容忍网络
开发语言·网络·php·硬件架构
晓得迷路了1 小时前
栗子前端技术周刊第 94 期 - React Native 0.81、jQuery 4.0.0 RC1、Bun v1.2.20...
前端·javascript·react.js