web開發中常見的安全漏洞及避免方法

一、安全攻擊html

    一、SQL、HTML、JS、OS命令注入web

    二、XSS跨站腳本攻擊,利用站內信任的用戶,在web頁面插入惡意script代碼正則表達式

    三、CSRF跨站請求僞造,經過假裝來自信任用戶的請求來利用受信任的網站。sql

    四、目錄遍歷漏洞數據庫

    五、參數篡改windows

    六、會話劫持安全

二、防止攻擊的措施總結服務器

1) 對用戶輸入的數據進行全面安全檢查或過濾,尤爲注意檢查是否包含SQL 或XSS特殊字符。cookie

   驗證用戶輸入的數據,包括值、類型、範圍等等,用驗證控件進行驗證 RequiredFieldValidator RangeValidator RegularExpressionValidator網絡

   這些檢查或過濾必須在服務器端客戶端都進行。客戶端服務端都要進行驗證,客戶端爲了提升用戶體驗,服務端才能夠有效防止威脅

2)不要使用管理員權限的數據庫鏈接,不要使用動態拼接sql

3)機密信息加密,不能使用明文

4)每一個頁面加載時,對用戶合法性進行判斷。

5)登陸後session中的敏感信息須要加密,避免在永久cookies中存儲敏感信息,重要的cookie標記爲http only

6)發送敏感信息時使用SSL、POST方式,儘可能使用新型web HSTS安全協議

7)不要直接拋出異常的詳細信息給用戶,異常返回友好的頁面,防止用戶看到敏感信息

8)在服務器與網絡的接口處配置防火牆,用於阻斷外界用戶對服務器的掃描和探測。

9)限制網站後臺訪問權限,如:禁止公網IP訪問後臺;禁止服務員使用弱口令。

10)關閉windows的8.3格式功能。DOS系統下的命令方式爲8.3格式,即文件名不超過8個字符,擴展名不超過3個字符。形如:???.exe 。

       如今Windows系統文件名長度最長可達255個字符了。

11)限制敏感頁面或目錄的訪問權限。

12)項目發佈前使用使用漏洞掃描軟件,如IBM appScan,UnisWebScanner,對安全性進行評估。

安全漏洞及防止:

一、sql注入漏洞
     一、在框架中內置對有害語句及符號的過濾,如insert ‘ update,在基類進行過濾,這樣子類就不用關心也能夠避免這些經常使用的攻擊了

      

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

/// <summary>

       /// 過濾 Sql 語句字符串中的注入腳本

       /// </summary>

       /// <param name="source">傳入的字符串</param>

       /// <returns>過濾後的字符串</returns>

       public static string SqlFilter(string source)

       {

           if (string.IsNullOrEmpty(source))

           {

               return "";

           }

           //單引號替換成兩個單引號

           source = source.Replace("'""''");

           source = source.Replace("\"""");

           source = source.Replace("&""&amp");

           source = source.Replace("<""&lt");

           source = source.Replace(">""&gt");

           source = source.Replace("delete""");

           source = source.Replace("update""");

           source = source.Replace("insert""");

 

           //半角封號替換爲全角封號,防止多語句執行

           source = source.Replace(";"";");

 

           //半角括號替換爲全角括號

           source = source.Replace("(""(");

           source = source.Replace(")"")");

 

           ///////////////要用正則表達式替換,防止字母大小寫得狀況////////////////////

 

           //去除執行存儲過程的命令關鍵字

           source = source.Replace("Exec""");

           source = source.Replace("Execute""");

 

           //去除系統存儲過程或擴展存儲過程關鍵字

           source = source.Replace("xp_""x p_");

           source = source.Replace("sp_""s p_");

 

           //防止16進制注入

           source = source.Replace("0x""0 x");

           return source;

       }


     二、堅持使用參數化方式賦值
     三、不要直接拋出異常的詳細信息給用戶,異常返回友好的頁面,防止用戶看到數據庫的細節,關閉了Web.Config的CustomErrors的時候,可能就不會看到。
         <system.web>
              <compilation debug="true" targetframework="4.0" />
         </system.web>
二、XSS又叫CSS--Cross Site Script 跨站腳本攻擊
     一、清理用戶輸入,過濾js代碼,過濾特殊字符
          [1] <>(尖括號)     [5] ;(分號)
          [2] "(引號)           [6] ()(括號)
          [3] '(單引號)         [7] &(& 符號)
          [4] %(百分比符號) [8] +(加號)
     二、使用HttpUitility及AntiXSSLibrary類庫中的方法對html代碼進行處理

           賦值不會彈框 this.lblName.Text = Encoder.HtmlEncode("<script>alert('OK');</script>");

編碼方法 使用場景
HtmlEncode(String) 不受信任的HTML代碼。
HtmlAttributeEncode(String) 不受信任的HTML屬性
JavaScriptEncode(String) 不受信任的輸入在JavaScript中使用
UrlEncode(String) 不受信任的URL
VisualBasicScriptEncode(String) 不受信任的輸入在VBScript中使用
XmlEncode(String) 不受信任的輸入用於XML輸出
XmlAttributeEncode(String) 不 受信任的輸入用做XML屬性


三、用戶信息用MD5加密
    

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

#region MD5加密

 

 /// <summary>

 /// 獲取MD5哈希值

 /// </summary>

 /// <param name="Text">字符串</param>

 /// <returns>MD5哈希值</returns>

 public static string GetMd5Hash(string Text)

 {

     MD5 md5 = MD5.Create();

     byte[] data = md5.ComputeHash(Encoding.Default.GetBytes(Text));

     StringBuilder builder = new StringBuilder();

     for (int i = 0; i < data.Length; i++)

     {

         builder.Append(data[i].ToString("x2"));

     }

     return builder.ToString();

 }

 

 /// <summary>

 /// 驗證MD5哈希值

 /// </summary>

 /// <param name="Text">字符串</param>

 /// <param name="TextHash">哈希值</param>

 /// <returns>相同返回True,不一樣返回False</returns>

 public static bool VerifyMd5Hash(string Text, string TextHash)

 {

     string hash = GetMd5Hash(Text);

     StringComparer comparer = StringComparer.OrdinalIgnoreCase;

     if (0 == comparer.Compare(hash, TextHash))

     {

         return true;

     }

     else

     {

         return false;

     }

 }

 

 #endregion

  

四、在頁面加載時判斷用戶是否登陸,若是沒有登陸則轉到登陸界面,每一個頁面繼承基類BaseControl
 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

protected override void OnActionExecuting(ActionExecutingContext filterContext)

      {

          //身份驗證

          if (CurrentUser == null)

          {

              string request = System.Web.HttpContext.Current.Request.Headers.Get("X-Requested-With");

 

              if (string.Compare(request, "XMLHttpRequest"true) == 0)

              {

                  filterContext.Result = new JsonResult { Data = "登陸超時,請刷新頁面!" };

                  filterContext.HttpContext.Response.ContentType = "text/plain;charset=UTF-8";

                  filterContext.HttpContext.Response.Status = "403 Internal Server Error";

                  filterContext.HttpContext.Response.StatusCode = 403;

              }

              else

              {

                  filterContext.Result = new RedirectResult("~/Login/SessionOutTime");

              }

          }

      }

  

參見:

Web的脆弱性:各類注入、攻擊

Web開發常見的幾個漏洞解決方法

PHP開發中常見的安全問題詳解和解決方法(如Sql注入、CSRF、Xss、CC等)

 

https://www.cnblogs.com/xiaochun126/p/5113371.html

相關文章
相關標籤/搜索