我通常會創建參數化查詢以避免SQL注入攻擊。不過,我有這個特殊的情況下,我還沒有完全能夠做到這一點:此查詢是否存在SQL注入風險?如果是這樣,我該如何避免它?
public DataSet getLiveAccountingDSByParameterAndValue(string parameter, string value)
{
string sql = "select table_ref as Source, method as Method, sip_code as Code, " +
" from view_accountandmissed " +
" where " + parameter + " like @value " +
" order by time DESC ";
MySqlCommand cmd = commonDA.createCommand(sql);
cmd.Parameters.Add("@value", MySqlDbType.String);
cmd.Parameters["@value"].Value = "%" + value + "%";
MySqlDataAdapter objDA = commonDA.createDataAdapter(cmd);
DataSet objDS = new DataSet();
objDA.Fill(objDS);
return objDS;
}
正如你所看到的,我創建@value作爲參數,但如果我試圖做同樣的參數查詢將失敗。
那麼,這個查詢是否存在SQL注入的風險?另外,考慮到參數由設置DropDownList的SelectedValue(不是TextBox,所以輸入是有限的)。如果是這樣,我該如何改進這個查詢?
有一定的風險。設想一些惡意用戶通過瀏覽器開發工具修改你的輸入表單,並輸入類似'1 = 1; DROP TABLE important_table; ...'作爲參數值... – 2012-02-09 10:01:20
隨着網站(因爲它的標籤爲asp.net)不信任任何客戶端,因爲它可以用JS(包括下拉列表)修改。 – 2012-02-09 10:01:56
+1用於檢查。這肯定有一個SQL注入風險。 – Curt 2012-02-09 10:02:45