SQL注入(SQL Injection)攻擊原理與防御措施

SQL是一種代碼注入技術,可使攻擊者修改應用程序向數據庫提供的查詢。 迄今為止,最常見和最嚴重的應用 程序安全威脅總是隱藏在與數據庫有某些連接的網絡應用 程序中。 通過這種 SQL 注入,攻擊者可以繞過登錄程序,獲取、更改甚至更新數據庫,執行管理程序,或進行其他變種操作。

了解 SQL 注入

要解釋什么 是 SQL 注入,就必須了解 SQL 的一些基本原理。 事實上,它已成為處理和虛擬操作這些數據庫的通用語言。 它用于查詢、插入、更新和刪除數據庫記錄,幾乎所有網絡應用程序都使用它來訪問數據庫;它可以在 PHP、 Python、 Java、 PIA Utah VPN 和 . NET中編寫 。

在網絡應用程序中,用戶需要通過表單、搜索框或 URL 等方式在系統中輸入信息,所有這些輸入信息通常都用于動態構建 SQL 查詢。 這是因為,如果用戶輸入的 SQL 查詢字符串沒有經過適當的檢查和消毒,攻擊者就可以通過在預期的 SQL 查詢字符串中注入惡意 SQL 語句來改變 SQL 查詢字符串的性質。

SQL 注入示例

舉例來說,在登錄一個典型的網絡應用程序時,用戶需要輸入用戶名和密碼。 用來驗證憑據的實際 SQL 查詢如下:

SELECT * FROM users WHERE username = 'user_input' AND password = 'password_input';

如果應用程序直接使用用戶的輸入值而不進行任何消毒處理,攻擊者就可以輸入類似這樣的內容。

  • 用戶名' OR '1'='1
  • 密碼' OR '1'='1

由此產生的 SQL 查詢將是

SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '' OR '1'='1';

這樣,攻擊者就能繞過驗證碼,暢通無阻地訪問系統

大家看這段代碼,其實特別簡單,就是我在沒有賬號和密碼的時候,用這段代碼來打開數據庫,這樣如果彈出“已經被sql注入” ,那么就代表我通過代碼層的注入。

大家一眼就可以看出來我的用戶名是1’ or ‘1’='1 密碼也是,結果是_:_

那么說明了,你的數據庫危險了,因為這個用戶名和密碼根本不存在。
那么這就是一個簡單的后臺身份驗證繞過了漏洞。
驗證繞過漏洞就是’or’='or’后臺繞過漏洞,利用的就是AND和OR的運算規則,從而造成后臺腳本邏輯性錯誤。

后臺查詢語句是: sql=‘select admin from user_info where userid=’ ‘’ & txtuser.text & ‘’’ & ’ and pwd=’ & ‘’’ & txtpassword.text & ‘’', 那么我使用1’or ‘1’='1(這里1可是其他的一些數)來做用戶名密碼的話,那么查詢就變成了: select admin from user_info where userid='1’or ‘1’=‘1’ and pwd='1’or ‘1’=‘1’
這樣的話,根據運算規則,這里一共有4個查詢語句,那么查詢結果就是 假or真and假or真,先算and 再算or,最終結果為真,這樣就可以進到后臺了。

這種漏洞存在必須要有2個致命的條件。

我們可以從這里入手,進行防護。

阻止 SQL 注入的方法

第一種:這種查詢是賬號和密碼是在一個sql語句中,如果一旦分開就不會被注入。
sql=“select * from admin where username='”&username&‘&"passwd=’"&passwd&’
如果一旦賬號密碼是分開查詢的,先查帳號,再查密碼,這樣的話就沒有辦法了。

我解決的代碼時這樣的:
txtsql = “select * from user_Info where userid= '” & TxtUserName.Text & “'”
Set mrc = ExecuteSQL(txtsql, msgtext)

If mrc.EOF Then
MsgBox “沒有這個用戶,請重新輸入用戶名!”, vbOKOnly + vbExclamation, “警告”
TxtUserName.SetFocus
Else
If Trim(mrc.Fields(1)) = Trim(TxtPassword.Text) Then
OK = True
mrc.Close
Me.Hide
UserName = Trim(TxtUserName.Text)

Else
MsgBox “密碼錯誤,請重新輸入!”, vbOKOnly + vbExclamation, “警告”
TxtPassword.SetFocus
TxtPassword.Text = “”
End If

第二種方法:如果加密了,一旦被MD5加密或者其他加密方式加密的,那么密碼就不會是完整的,那么就不存在這樣的錯誤了。
如果一個用戶提供的字段并非一個強類型,或者沒有實施類型強制,就會發生這種形式的攻擊。當在一個SQL語句中使用一個數字字段時,如果程序員沒有檢查用戶輸入的合法性(是否為數字型)就會發生這種攻擊。例如:
  statement := "SELECT * FROM user_info WHERE userid = " & id_text & “;”
   從這個語句可以看出,id_text是一個與“userid”字段有關的數字。不過,如果終端用戶選擇一個字符串,就繞過了對轉義字符的需要。例如,將id_text設置為:1;DROP TABLE users,它會將“users”表從數據庫中刪除,SQL語句變成:SELECT * FROM User_Info WHERE UserID= 1;DROP TABLE users;好滴,那么你的數據庫就會遭受不可恢復的刪除。

第三種方法:那么我們就可以通過傳參的方法,來解決這中sql注入:
如果自己編寫防注代碼,一般是先定義一個函數,再在里面寫入要過濾的關鍵詞,如select ; “”;from;等,這些關鍵詞都是查詢語句最常用的詞語,一旦過濾了,那么用戶自己構造提交的數據就不會完整地參與數據庫的操作。

Function SafeRequest(ParaName,ParaType)
‘— 傳入參數 —
‘ParaName:參數名稱-字符型
‘ParaType:參數類型-數字型(1表示以上參數是數字,0表示以上參數為字符)
Dim ParaValue
ParaValue=Request(ParaName)
If ParaType=1 then
If not isNumeric(ParaValue) then
Response.write “參數” & ParaName & “必須為數字型!”
Response.end
End if
Else
ParaValue=replace(ParaValue,"’“,”’’")
End if
SafeRequest=ParaValue
End function

為防止 SQL 注入,您需要遵循編碼準則、正確管理數據庫并實施安全措施。以下是一些降低 SQL 注入風險的策略:

1.使用預處理語句(參數化查詢)

預處理語句確保用戶輸入純粹作為數據處理,而不是作為 SQL 命令的組成部分。
這種方法允許數據庫區分 SQL 查詢結構和數據本身,確保任何輸入都不能修改查詢結構。

例如,在 PHP 中使用 PDO(PHP 數據對象):

$stmt = $pdo-&gt;prepare('SELECT * FROM users WHERE username = :username AND password = :password');<br>
$stmt-&gt;execute(['username' =&gt; $username_input, 'password' =&gt; $password_input]);

在本例中,:username:password是用戶輸入的占位符,它們會被用戶提供的實際值安全地替代。數據庫引擎將輸入作為純數據處理,因此任何惡意輸入都不會造成危害。

2.輸入驗證和消毒

始終對用戶輸入進行驗證和消毒,確保其符合預期格式。例如,如果輸入應該是一個整數,那么在處理之前就應該檢查數據類型。

在 Python 中,您可能會使用正則表達式來驗證輸入:

import re<br>
<br>
def validate_input(user_input):<br>if re.match("^[a-zA-Z0-9_]+$", user_input):<br>return True<br>else:<br>return False

該功能只允許使用字母數字字符和下劃線,從而降低了 SQL 注入的風險。

3.使用 ORM(對象關系映射)庫

ORM 庫抽象了數據庫交互,允許開發人員使用編程語言語法與數據庫交互,而不是直接使用 SQL 查詢。
通過自動安全地處理查詢構造,這一抽象本質上可防止 SQL 注入。

例如,在Django(一種 Python 網絡框架)中,你不需要編寫原始 SQL,而是像這樣與數據庫交互:

user = User.objects.get(username=user_input)

Django 的 ORM 可自動處理查詢結構并防止 SQL 注入。

4.限制數據庫權限

只授予應用程序必要的最低數據庫權限。如果應用程序不需要刪除記錄,就不要授予它DELETE權限。這種最小權限原則可以減少攻擊者發現 SQL 注入漏洞時造成的破壞。

5.使用網絡應用防火墻(WAF)

WAF 可以在惡意輸入到達應用程序之前將其過濾掉,從而檢測并阻止常見的 SQL 注入嘗試。WAF 是一個額外的安全層,是對編碼實踐的補充。

6.錯誤處理和報告

避免向最終用戶顯示詳細的數據庫錯誤信息。相反,在服務器端記錄這些錯誤,并向用戶顯示通用錯誤信息。這種做法可以防止攻擊者深入了解你的數據庫結構。

在 .NET 中,您可以使用 try-catch 塊來處理 SQL 錯誤:

try<br>
{<br>// Database operations<br>
}<br>
catch (SqlException ex)<br>
{<br>// Log error details<br>Logger.Log(ex);<br>// Show a generic message to the user<br>Response.Write("An error occurred. Please try again later.");<br>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73243.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73243.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73243.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【算法】十大排序算法(含時間復雜度、核心思想)

以下是 **十大經典排序算法** 的時間復雜度、空間復雜度及穩定性總結&#xff0c;適用于面試快速回顧&#xff1a;排序算法對比表 排序算法最佳時間復雜度平均時間復雜度最差時間復雜度空間復雜度穩定性核心思想冒泡排序O(n)O(n)O(n)O(1)穩定相鄰元素交換&#xff0c;大數沉底…

LVS的 NAT 模式實現 3 臺RS的輪詢訪問

使用LVS的 NAT 模式實現 3 臺RS的輪詢訪問 1.配置 RS&#xff08;NAT模式&#xff09;2. 配置 LVS 主機&#xff08;僅主機、NAT模式&#xff09;2.1 配置僅主機網卡&#xff08;192.168.66.150/24 VIP &#xff09;2.2 配置 NAT 網卡&#xff08;192.168.88.6/24 DIP&#xff…

一、MySQL8的my.ini文件

MySQL8.0.11的安裝版本my.ini配置文件默認存放在&#xff1a;C:/Program Files/MySQL/MySQL Server 8.0/ 目錄下&#xff1b;而MySQL8.0.11綠色免安裝版本是沒有my.ini配置文件&#xff0c;用戶可以自行構建后&#xff0c;再通過my.ini進行數據庫的相關配置 一、MySQL8.0.11默…

微調這件小事:訓練集中的輸入數據該作為instruction還是input?從LLaMA-Factory的源碼中尋找答案吧~

在之前的博文中,我們已經了解了LLaMA-Factory框架執行各類任務的流程。今天,我們將深入探討SFT微調過程中關于數據集的兩個關鍵問題: 數據集中的instruction和input是如何結合起來生成大模型可以理解的輸入的?instruction是不是就是system prompt呢?(之所以會問這個問題,…

nacos-actuator漏洞

1、nacos配置文件添加以下配置 vim application.properties# 添加以下配置項 management.endpoints.enabled-by-defaultfalse management.server.port-12、重啟Nacos systemctl restart nacos3、驗證 打開地址http://ip:port/nacos/actuator查看是否有敏感信息輸出&#xff0…

extern關鍵字的用法

目錄 總述 一、聲明外部變量 二、聲明外部函數 三、實現模塊化編程 四、與"C" 連用&#xff0c;實現C和C的混合編程 五、注意事項 六、疑點補充&#xff08;你可能會有和我一樣的疑問&#xff1f;&#xff09; 總述 在C和C中&#xff0c;extern關鍵字用于聲明外…

Jboss漏洞再現

一、CVE-2015-7501 1、開環境 2、訪問地址 / invoker/JMXInvokerServlet 出現了讓下載的頁面&#xff0c;說明有漏洞 3、下載ysoserial工具進行漏洞利用 4、在cmd運行 看到可以成功運行&#xff0c;接下來去base64編碼我們反彈shell的命令 5、執行命令 java -jar ysoserial-…

Android平臺毫秒級低延遲HTTP-FLV直播播放器技術探究與實現

一、前言 在移動互聯網蓬勃發展的今天&#xff0c;視頻播放功能已成為眾多Android應用的核心特性之一。面對多樣化的視頻格式和傳輸協議&#xff0c;開發一款高效、穩定的視頻播放器是許多開發者追求的目標。FLV&#xff08;Flash Video&#xff09;格式&#xff0c;盡管隨著H…

BUAA XCPC 2025 Spring Training 2

C \color{green}{\texttt{C}} C [Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] 給定一棵以 1 1 1 為根的樹&#xff0c;記 a i a_{i} ai? 表示節點 i i i 的權值&#xff0c; lca( i , j ) \text{lca(}i,j) lca(i,j) 表示節…

MySQL 中,分庫分表機制和分表分庫策略

在 MySQL 中,分庫分表是一種常見的數據庫水平擴展方案,用于解決單庫單表數據量過大導致的性能瓶頸問題。通過將數據分散到多個數據庫或表中,可以提高系統的并發處理能力、降低單點故障風險,并提升查詢性能。 一、分庫分表的作用 提升性能: 分散數據存儲和查詢壓力,避免單…

組件日志——etcd

目錄 一、簡介 二、安裝【Ubuntu】 安裝etcd 安裝CAPI 三、寫一個示例 3.0寫一個示例代碼 3.1獲取一個etcd服務 3.2獲取租約(寫端操作) 3.3使用租約(寫端操作) 3.4銷毀租約(寫端操作) 3.5獲取etcd服務中的服務列表(讀端操作) 3.6監聽狀態變化(讀端操作) 一、簡介 Et…

python網絡爬蟲開發實戰之網頁數據的解析提取

目錄 1 XPath的使用 1.1 XPath概覽 1.2 XPath常用規則 1.3 準備工作 1.4 實例引入 1.5 所有節點 1.6 節點 1.7 父節點 1.8 屬性匹配 1.9 文本獲取 1.10 屬性獲取 1.11 屬性多值匹配 1.12 多屬性匹配 1.13 按序選擇 1.14 節點軸選擇 2 Beautiful Soup 2.1 簡介…

理解操作系統(一)馮諾依曼結構和什么是操作系統

認識馮諾依曼系統 操作系統概念與定位 深?理解進程概念&#xff0c;了解PCB 學習進程狀態&#xff0c;學會創建進程&#xff0c;掌握僵?進程和孤?進程&#xff0c;及其形成原因和危害 1. 馮諾依曼體系結構 我們常?的計算機&#xff0c;如筆記本。我們不常?的計算機&am…

Tomcat常見漏洞攻略

一、CVE-2017-12615 漏洞原理&#xff1a;當在Tomcat的conf&#xff08;配置?錄下&#xff09;/web.xml配置?件中添加readonly設置為false時&#xff0c;將導致該漏洞產 生&#xff0c;&#xff08;需要允許put請求&#xff09; , 攻擊者可以利?PUT方法通過精心構造的數據包…

快速求出質數

要快速判斷一個數是否為質數&#xff0c;可以采用以下優化后的試除法&#xff0c;結合數學規律大幅減少計算量&#xff1a; 步驟說明 處理特殊情況&#xff1a; 若 ( n \leq 1 )&#xff0c;不是質數。若 ( n 2 ) 或 ( n 3 )&#xff0c;是質數。若 ( n ) 能被 2 或 3 整除&…

Linux上位機開發實戰(camera視頻讀取)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】 關于linux camera&#xff0c;一般都是認為是mipi camera&#xff0c;或者是usb camera。當然不管是哪一種&#xff0c;底層的邏輯都是v4l2&#x…

高性能緩存:使用 Redis 和本地內存緩存實戰示例

在現代高并發系統中&#xff0c;緩存技術是提升性能和降低數據庫壓力的關鍵手段。無論是分布式系統中的Redis緩存&#xff0c;還是本地高效的本地內存緩存&#xff0c;合理使用都能讓你的應用如虎添翼。今天&#xff0c;我們將基于go-dev-frame/sponge/pkg/cache庫的代碼示例&a…

Python實現deepseek接口的調用

簡介&#xff1a;DeepSeek 是一個強大的大語言模型&#xff0c;提供 API 接口供開發者調用。在 Python 中&#xff0c;可以使用 requests 或 httpx 庫向 DeepSeek API 發送請求&#xff0c;實現文本生成、代碼補全&#xff0c;知識問答等功能。本文將介紹如何在 Python 中調用 …

山東大學數據結構課程設計

題目&#xff1a;全國交通咨詢模擬系統 問題描述 處于不同目的的旅客對交通工具有不同的要求。例如&#xff0c;因公出差的旅客希望在旅途中的時間盡可能地短&#xff0c;出門旅游的旅客則期望旅費盡可能省&#xff0c;而老年旅客則要求中轉次數最少。編織一個全國城市間的交…

深入理解倒排索引原理:從 BitSet 到實際應用

倒排索引是一種極為重要的數據結構&#xff0c;它能夠高效地支持大規模數據的快速查詢&#xff0c;本文將深入探討倒排索引的原理&#xff0c;借助 BitSet 這種數據結構來理解其實現機制&#xff0c;并通過具體的JSF請求條件示例來展示其在實際應用中的運算過程。 BitSet&#…