網站首頁 編程語言 正文
十大漏洞:SQL注入、跨站腳本、失效的訪問控制、失效的身份認真和會話、安全配置錯誤、敏感信息泄露、攻擊檢測與防范不足、跨站請求偽造、使用含有已知漏洞的組件、未受保護的APIs。在系統架構設計、技術選型和編碼階段就需要充分考慮安全性要求,避免各類Web應用安全漏洞。
SQL注入
1、原理
? ? ? SQL注入即是指web應用程序對用戶輸入數據的合法性沒有判斷,攻擊者可以在web應用程序中事先定義好的查詢語句的結尾上添加額外的SQL語句,以此來實現欺騙數據庫服務器執行非授權的任意查詢,從而進一步得到相應的數據信息。它不是利用操作系統的BUG來實現攻擊,而是利用程序員編程時的疏忽。
例如,一般用戶登錄用的SQL語句為:SELECT * FROM user WHERE username='admin' AND password='passwd',此處admin和passwd分別為用戶輸入的用戶名和密碼,如果程序員沒有對用戶輸入的用戶名和密碼做處理,就可以構造萬能密碼成功繞過登錄驗證,如用戶輸入' or 1#,SQL語句將變為:SELECT * FROM user WHERE username='' or 1#' AND password='','' or 1為TRUE,#注釋掉后面的內容,所以查詢語句可以正確執行。
另外,通過or或者and 與1=1、1=2等組合即可判斷是否存在SQL注入的漏洞,例如:
http://xxxxxxxx?id=xxx AND 1=1 --
http://xxxxxxxx?id=xxx AND 1=2 --
如果前一個能返回正常信息而后一個不能,則可以判定會有id注入的可能。因為后者即使id正常,1=2永遠無法成立。一反一正說明注入的語句可能會正常運行。
2、危害
- 繞過登錄或者獲取到系統管理員權限
- 注入時如果數據庫權限設置不當,可能會查看到數據庫系統表、數據,甚至可以非法增刪改查數據等
- 如果權限設置不當,注入木馬或者利用存儲過程擴展功能操作操作系統的shell,比如master.dbo.xp_cmdshell,從而控制整個服務器
- 注入過程如果錯誤沒有正確處理,則可能暴露整個系統文件夾結構
3、防范方法
- 所有的查詢語句都使用數據庫提供的參數化查詢接口,參數化的語句使用參數而不是將用戶輸入變量嵌入到SQL語句中。當前幾乎所有的數據庫系統都提供了參數化SQL語句執行接口,使用此接口可以非常有效的防止SQL注入攻擊。
- 對進入數據庫的特殊字符(’”<>&*;等)進行轉義處理,或編碼轉換。
- 確認每種數據的類型,比如數字型的數據就必須是數字,數據庫中的存儲字段必須對應為int型。
- 數據長度應該嚴格規定,能在一定程度上防止比較長的SQL注入語句無法正確執行。
- 網站每個數據層的編碼統一,建議全部使用UTF-8編碼,上下層編碼不一致有可能導致一些過濾模型被繞過。
- 嚴格限制網站用戶的數據庫的操作權限,給此用戶提供僅僅能夠滿足其工作的權限,從而最大限度的減少注入攻擊對數據庫的危害。
- 避免網站顯示SQL錯誤信息,比如類型錯誤、字段不匹配等,防止攻擊者利用這些錯誤信息進行一些判斷。
- 在網站發布之前建議使用一些專業的SQL注入檢測工具進行檢測,及時修補這些SQL注入漏洞。
具體在軟件開發層面,表現在以下:
- 前端表單進行參數格式控制;
- 后臺進行參數格式化,過濾所有涉及sql的非法字符;可通過攔截器統一攔截
//過濾 sql注解、關鍵字、符號等
static String reg = "(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|"+ "(\\b(select|update|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\\b)";
static Pattern sqlPattern = Pattern.compile(reg, Pattern.CASE_INSENSITIVE);//表示忽略大小寫
/***************************************************************************
?* 參數校驗@param str ep: "or 1=1"
?*/
public static boolean isSqlValid(String str) {
Matcher matcher = sqlPattern.matcher(str);
if (matcher.find()) {
System.out.println("參數存在非法字符,請確認:"+matcher.group());//獲取非法字符:or
return false;
}
return true;
}
- ?持久層使用參數化的持久化sql,使用預編譯語句集,切忌使用拼接字符串;例如spring的jdbcTemplate防止sql注入,mybatis防止sql注入,jpa防止sql注入。
String sql= "select * from user where name=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, name);
ResultSet rs = ps.executeQuery();
原文鏈接:https://blog.csdn.net/qq_31142237/article/details/122875456
相關推薦
- 2022-06-22 Android實現精美的聊天界面_Android
- 2022-07-24 .Net行為型設計模式之中介者模式(Mediator)_基礎應用
- 2022-06-01 kubernetes中的namespace、node、pod介紹_云和虛擬化
- 2022-05-23 Nginx工作模式及代理配置的使用細節_nginx
- 2021-12-07 Centos8搭建基于kdc加密的nfs_Linux
- 2022-06-28 ADO.NET防SQL注入與使用參數增刪改查_實用技巧
- 2023-07-26 webpack打包優化之減少代碼體積(Tree shaking、babel)
- 2022-08-05 淺析C++元組tuple類型_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支