【问题标题】:Ignore a condition in JavaScript忽略 JavaScript 中的条件
【发布时间】:2021-09-27 06:26:59
【问题描述】:

我正在分析 Javascript 中函数的参数/参数,它们要么被 JS 库污染,要么未被污染。我把它分为三个场景。第一个是如果所有参数/参数都被污染,那么结果将是真的。其次,如果所有参数都未受污染,那么结果将是错误的。第三种情况是当一些论点被污染而一些未被污染时,我想忽略这种情况。对于前两个场景,我编写了以下几行代码。如果有人可以帮助我解决第三种情况。

function Shadow(x) {
    this.val = x;
}

Shadow.getVal = function(v) {
    return Shadow.isShadowed(v) ? v.val : v;
}

Shadow.isShadowed = function(x) {
    return x instanceof Shadow;
}


function Taint() {
 
    this._taintStack = [];

    
    this.invokeFunPre = function (iid, f, base, args) {
        
        let isTainted = false;

        let n_args = [];

        for(let i = 0; i < args.length; i++) {
            if (Shadow.isShadowed(args[i])) {
                n_args.push(Shadow.getVal(args[i]));
                isTainted = true;
            } else {
                n_args.push(args[i]);
            }
        }

        this._taintStack.push(isTainted);

        return {f: f, base: base, args: n_args, skip: false};
    }; 

【问题讨论】:

  • 循环之后,比较参数的数量和污染的数量。如果受污染的数量不是 0 或参数的数量,那么有些是受污染的,有些不是。

标签: javascript for-loop if-statement


【解决方案1】:

用这个改变invokeFunPre方法:

this.invokeFunPre = function (iid, f, base, args) {

    let isTainted = false;

    let n_args = [];
    let initialTaint = Shadow.isShadowed(args[0]);
    let mixed = false;

    for(let i = 0; i < args.length; i++) {
        if (Shadow.isShadowed(args[i])) {
            n_args.push(Shadow.getVal(args[i]));
            isTainted = true;
            mixed = !(initialTaint && true);
        } else {
            n_args.push(args[i]);
            mixed = initialTaint || false;
        }
    }

    if(!mixed)
        this._taintStack.push(isTainted);

    return {f: f, base: base, args: n_args, skip: false};
};

这要求至少有一个 arg 始终可用。您可以添加条件进行调整。但你明白了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2011-01-27
    • 2021-11-18
    • 1970-01-01
    • 2022-03-22
    • 2018-07-13
    • 2013-09-18
    相关资源
    最近更新 更多