前陣子在同事在詢問程式中透過 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:從零開始的軟體開發生活」
請大家繼續支持 ^_^