close
1.正則表達式限制用戶輸入
2.不使用動態拼裝SQL
(X)Ex. ‘Select * from tb_name where par=“+str+”; ‘
(O)string querySql = “select * from [tb_name] where id=@id”;
       SqlCommand com = new SqlCommand(querySql, conn);
       com.Parameters.AddWithValue(“@id”, idParam);
3.每個應用單獨權限連接數據庫
4.機密資料hash加密
5.SQL異常訊息應包裝為簡短提示

C# 改善辦法

在Web.config文件下面增加一個如下標籤:

         <appSettings>

      < add key="safeParameters" value="OrderID-int32,CustomerEmail-email,ShippingZipcode-USzip" />

  < /appSettings>

其中key是 < saveParameters>後面的值為”OrderId-int32”等,其中”-“前面表示參數的名稱比如:OrderId,後面的int32表示數據類型。
 

Global.asax中增加下面一段:

protected void Application_BeginRequestObject sender, EventArgs e{

  String[] safeParameters = System.Configuration.ConfigurationSettings.AppSettings["safeParameters"].ToString().Split(‘,’);

  forint i= 0 ;i < safeParameters.Length; i++{

  String parameterName = safeParameters[i].Split('-’)[0];

  String parameterType = safeParameters[i].Split('-’)[1];

  isValidParameter(parameterName, parameterType);

  }

  }

  public void isValidParameterstring parameterName, string parameterType{

  string parameterValue = Request.QueryString[parameterName];

  ifparameterValue == nullreturn;

  ifparameterType.Equals("int32“)){

  if!parameterCheck.isInt(parameterValue)) Response.Redirect("parameterError.aspx“);

  }

  else if parameterType.Equals("USzip“)){

    if(!parameterCheck.isUSZip(parameterValue)) Response.Redirect("parameterError.aspx“);

  }

  else if (parameterType.Equals("email“)){

  if!parameterCheck.isEmail(parameterValue)) Response.Redirect("parameterError.aspx“);

}

  }

 

使用字符串過濾類

 

          /**//// < summary>

  /// 分析用戶請求是否正常

  /// < /summary>

  /// < param name="Str">傳入用戶提交數據< /param>

  /// < returns>返回是否含有SQL注入式攻擊代碼< /returns>

  private static bool ProcessSqlStrstring Str,int type

  {

         string SqlStr;

         SqlStr = "'|and|exec|insert|select|delete|update|count|*|chr|mid|master|truncate|char|declare";

         bool ReturnValue = true;

         try

       {

            If Str != ""

           {  

                 Str=str.toLowerCase();//轉小寫

                  string[] anySqlStr = SqlStr.Split(’|’);

                 foreach (string ss in anySqlStr)

                 {

                   If Str.IndexOf(ss)>=0

                   {

                     ReturnValue = false;

                   }

                 }

             }

           }

        catch

       {

           ReturnValue = false;

       }

          return ReturnValue;

     }

 

 參考來源:   C#防SQL注入代碼的實現方法

 

arrow
arrow
    文章標籤
    資安
    全站熱搜

    程式小試身手 發表在 痞客邦 留言(0) 人氣()