[JS]Dynamic Code Evaluation: Code Injection (Input Validation and Representation, Data Flow)

用到 function() {...} 也中「Dynamic Code Evaluation」?

最近系統的 JavaScript 被原始碼掃描工具掃出「Dynamic Code Evaluation」的問題。程式類似如下,


var mstrPreText = "這裡是masterPage的Prefix_";
var oHttpReq = GetXmlHttpRequest();
oHttpReq.open("POST","test.aspx", false);  
oHttpReq.send("");
var result = oHttpReq.responseText;
if (result == "abc") {
	alert("HelloWorld");
	window.setTimeout(function () { document.getElementById(mstrPreText + "TextBox2").focus(); }, 0);
	return false;
}

 

就是取得Server端的一些資料到Client端後,再依結果來 Alert 一些訊息,並設定 focus 到某個 TextBox之中。

看起來並沒有什麼 Dynamic Code Evaluation 的問題呀! 

依小弟的判斷可能是裡面有 function() { ... } 的關係!

 

所以讓 setTimeout 裡見不到 function() { ... } 應該就OK了吧!

所以上面的解法有3個,

1.不要使用 setTimeout ,自然就不會有 function(){…} 出現,直接設定 focus 到某個 TextBox之中。

document.getElementById(mstrPreText + "TextBox2").focus();

 

2.使用保哥提供的function,詳細請參考「利用 jQuery 將 DOM 元素聚焦 focus() 的六個版本」。


(function ($) {
    jQuery.fn.setfocus = function () {
        return this.each(function () {
            var dom = this;
            setTimeout(function () {
                try { dom.focus(); } catch (e) { }
            }, 0);
        });
    };
})(jQuery);

//改後的Code ...
var oHttpReq = GetXmlHttpRequest();
oHttpReq.open("POST", "test.aspx", false); 
oHttpReq.send("");
var result = oHttpReq.responseText;
if (result == "abc") {
	alert("HelloWorld");
	$("#" + mstrPreText + "TextBox2" ).setfocus();
	return false;
}

 

3.將原有設定 focus 抽出來另一個 function,如下,


function txtFocus(ctrlId) {
    var txt = document.getElementById(txtId);
    setTimeout(function () {
        try { txt.focus(); } catch (e) { }
    }, 0);
}

//改後的Code ...
var oHttpReq = GetXmlHttpRequest();
oHttpReq.open("POST", "test.aspx", false);  
oHttpReq.send("");
var result = oHttpReq.responseText;
if (result == "abc") {
	alert("HelloWorld");
	txtFocus(mstrPreText + "TextBox2");
	return false;
}

 

參考資訊

利用 jQuery 將 DOM 元素聚焦 focus() 的六個版本

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^