弱點掃描之後javascript eval怎麼解決[方案javascript window]

  • Post category:javascript

javascript eval是早期專案要做到動態呼叫常用的語法,也是駭客利用進行攻擊的入口。比如:Client DOM Code Injection,Client DOM XSS,Client DOM Stored XSS,Deserialization of Untrusted Data 這些攻擊手法都可能會跟 javasctip eval 有關係。所以,遠使碼弱點掃描工具,不管是Fortify,Checkmarx,都有機會掃描出來為高風險必須要修改的項目。

建立Javascript 變數

在javascript程式中,先建立三個自定義的 myPerson 物件,以便後續動態呼叫。

function myPerson(name,age){
    this.name = name;
    this.age = age;
    this.show=function(){
        alert("姓名:"+ this.name +" 年齡:"+this.age);
    }
}

 

var p1 =new myPerson("Tom",20);
var p2 =new myPerson("Mary",18);
var p3 = new myPerson("Bob",22);

安排畫面上讓使用者輸入

在UI畫面上,設定一個輸入欄位,讓使用者指定要看哪一個人的資料。
並提供按鈕,顯示人員資料。

javascript:

function btn1Click(){
    var id = document.getElementById("pid").value;
    eval("p"+id+".show();");
}

Html:

<body>
請輸入你想知道第幾位的資訊<input type="text" id="pid" >
<input type="button" value="使用 eval" onclick="btn1Click()">

 

</body>

動態呼叫Javascript 變數–javascript eval

使用 Javascript eval,結果可以依照使用者指定的數字,顯示對應的人員資料。
但是,這樣的方式,就會有弱點被駭客攻擊的風險存在。

完整程式:

<!DOCTYPE html>
<html>
<head>
<meta charset="BIG5">
<title>Insert title here</title>
</head>
<script>
function myPerson(name,age){
    this.name = name;
    this.age = age;
    this.show=function(){
        alert("姓名:"+ this.name +" 年齡:"+this.age);
    }
}

 

var p1 =new myPerson("Tom",20);
var p2 =new myPerson("Mary",18);
var p3 = new myPerson("Bob",22);

 

function btn1Click(){
    var id = document.getElementById("pid").value;
    eval("p"+id+".show();");
}

 


</script>
<body>
請輸入你想知道第幾位的資訊<input type="text" id="pid" >
<input type="button" value="使用 eval" onclick="btn1Click()">

 

</body>
</html>

動態呼叫Javascript 變數–Javascript window

改用 Javascript window
javascript:

function btn2Click(){
    var id = document.getElementById("pid").value;
    window["p"+id].show();
    
    
}

Html:

<input type="button" value="使用 window[" onclick="btn1C2ick()">

完整程式:

<!DOCTYPE html>
<html>
<head>
<meta charset="BIG5">
<title>Insert title here</title>
</head>
<script>
function myPerson(name,age){
    this.name = name;
    this.age = age;
    this.show=function(){
        alert("姓名:"+ this.name +" 年齡:"+this.age);
    }
}

 

var p1 =new myPerson("Tom",20);
var p2 =new myPerson("Mary",18);
var p3 = new myPerson("Bob",22);

 

function btn1Click(){
    var id = document.getElementById("pid").value;
    eval("p"+id+".show();");
}

 

function btn2Click(){
    var id = document.getElementById("pid").value;
    window["p"+id].show();
    
    
}
</script>
<body>
請輸入你想知道第幾位的資訊<input type="text" id="pid" >
<input type="button" value="使用 eval" onclick="btn1Click()">
<input type="button" value="使用 window[" onclick="btn2Click()">
</body>
</html>

執行結果:

可以成功顯示指定人員資料,且不會有被攻擊的風險。

後記: var vs let

上面的宣告 3個 myPerson的地方,若從 var 改成 let ,結果就不一樣了。
只有 eval() 可以成功被呼叫,而 window[] ,則會出現物件 undefine 的錯誤訊息。

好了,以上就是我解決Checkmarx 弱點掃描:Client DOM Code InjectionClient DOM XSSClient DOM Stored XSSDeserialization of Untrusted Data 的方式。