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 Injection,Client DOM XSS,Client DOM Stored XSS,Deserialization of Untrusted Data 的方式。