Call Single sign-on Web Service 居然被 Checkmarx 掃出 XSRF ?

前陣子在同事在詢問程式中透過 Single sign-on post 過來的 User 資料,

然後再回 Call 它的 Web Method 去做驗證使用者,

居然被 Checkmarx 掃出有 XSRF (Cross-site request forgery) 的問題!!!

程式類似如下,

public void SSOLogin(string strUsrID, string strSID)
{
	strUsrID = AntiXssEncoder.HtmlEncode(strUsrID, true);
	var sso = new SSO.User();
	bool loginResult = sso.ChkSessionID("MyAP", strUsrID, strSID);
	if(loginResult){
		// 登入成功 ...
		
	}else{
		// 登入失敗 ...
	
	}
}

疑~~~ 程式本來就是要回 Call 那個 SSO 的 Web Service Method ,並傳入 User帳號(strUsrID)及 帳號的 Token 去驗證(strUsrID) ,

為什麼會有問題呢? 

Checkmarx 到底是如何找出這個問題呢?

我們可以查看 Checkmarx 中的「管理->掃描之設定->查詢閱覽器」中的設定,如下,

找到 「CSharp -> Cx預設Query -> CSharp_Medium_Threat -> XSRF」裡面的內容,

目前看到它的處理方式如下,

1.先看一下在 OnInit or Page_Init 有沒有加入那個 AntiXsrfToken 的驗證 (for WebForms)。
1.1.如果沒有的話,就會看看那些有用到 Client 端送上來參數的 (update, delete, insert) Method 是否有用 ValidateAntiForgeryToken 
1.2.如果沒有的話,就會看看那些有用到 Client 端送上來參數的 Web Service Method 名稱,是否有包含 IsValid、Get及 Check 
 

如果在上面都沒有的話,就認為有那個 XSRF 的 Issue 了哦! 

因為是 Single sign-on post 過來的,所以 Controller 中沒辦法加 ValidateAntiForgeryToken 。 Web Method 名稱又不在 Checkmarx 的認定之內,所以就出現那個問題了。

為了驗證是否為 Web Method 名稱的問題,於是請 Jun 哥先將那個 Web Method 從 sso.ChkSessionID 改成了 sso.CheckSessionID ,如下,

public void SSOLogin(string strUsrID, string strSID)
{
	strUsrID = AntiXssEncoder.HtmlEncode(strUsrID, true);
	var sso = new SSO.User();
	bool loginResult = sso.CheckSessionID("MyAP", strUsrID, strSID);
	if(loginResult){
		// 登入成功 ...
		
	}else{
		// 登入失敗 ...
	
	}
}

再掃一次就沒再出現那個問題了。

目前解法有3種,

1.跟客戶說明,希望客戶大人可以明白,有時候真的很怕 User 會說,反正就改到 Report 看不見 issue 為止,而不管我們說什麼 ^_ !

2.在 Checkmarx 中加入 SSO 的 Method Name Rule

3.SSO 的 Method 改符合 Checkmarx 認得的那個 Method Name

如果大家有其他的方式,也請跟我分享一下哦 ^_^

 

Hi, 

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

請大家繼續支持 ^_^