第一次發貼請教一下,Fortify掃到以下程式碼「cmd.Parameters.AddWithValue("@keyword", "%" + keyword.Text + "%");」那一行有Access Control:Database的風險,我看這風險是讓使用者查看未經授權的資料,只是下面已經有用「User_No」險制權限內的資料才能查到,而且另一個查詢條件卻沒有掃到風險!?
第二段程式碼的「cmdupd.Parameters.AddWithValue("@licence", licence.Text.ToString());//有風險」也是一樣,似乎前端是input的才會有風險...
請問這種應該怎麼調整避免這風險?
謝謝
if (build.SelectedValue != "" && build.SelectedValue != "-1")
{
cmd.Parameters.AddWithValue("@build", build.SelectedValue);//無風險
strWhere += " and build_id = @build";
}
if (keyword.Text != "")
{
cmd.Parameters.AddWithValue("@keyword", "%" + keyword.Text + "%");//有風險
strWhere += " and build_license like @keyword";
}
cmd.Parameters.AddWithValue("@User_No", Session["User_No"].ToString());
cmd.CommandText = string.Format(@"
select build_licence
,dt
,build_id
from build c (nolock)
where 1=1
and exists (select * from Permission p where c.Su_No = p.Su_No and p.user_no = @user_no)
{0}", strWhere);
SqlCommand cmdupd = new SqlCommand();
cmdupd.Parameters.AddWithValue("@licence", licence.Text.ToString());//有風險
cmdupd.Parameters.AddWithValue("@corp", corp.SelectedValue.ToString());//無風險
每個字串 .Trim()
licence.Text.ToString().Trim()
Fortify 是看 Source code 的,在你的 case 裡面它只要認出來 DbParameter 的 Value 是 User 直接輸入後代入 (ex: TextBox) 的就會給你風險標籤
就算有正確使用參數化查詢,系統掃描後符合外部輸入後直接帶入 DbParameter 還是會給你警告