SQL註入的問題

来源:https://www.cnblogs.com/HuiH/archive/2020/03/24/12559047.html
-Advertisement-
Play Games

首先,SQL語句應該考慮哪些安全性? 第一,防止SQL註入,對特殊字元進行過濾、轉義或者使用預編譯的SQL語句綁定變數。 第二,當SQL語句運行出錯時,不要把資料庫返回的錯誤信息全部顯示給用戶,以防止泄露伺服器和資料庫相關信息。 其次,什麼叫做SQL註入呢,如何防止呢? 舉個例子: 你後臺寫的Jav ...


首先,SQL語句應該考慮哪些安全性?

  第一,防止SQL註入,對特殊字元進行過濾、轉義或者使用預編譯的SQL語句綁定變數。

  第二,當SQL語句運行出錯時,不要把資料庫返回的錯誤信息全部顯示給用戶,以防止泄露伺服器和資料庫相關信息。

其次,什麼叫做SQL註入呢,如何防止呢?

舉個例子:

  你後臺寫的Java代碼拼的SQL如下: 

1 //該ename為前臺傳過來的一個查詢條件
2 public List getInfo(String ename){
3   StringBuffer buf = new StringBuffer();
4   buf.append("select empno,ename,deptno from emp where ename = "").append(ename).append("");
5   ...
6   ...          
7 }

  而前臺頁面有輸入框如下:

  職員姓名:                  

  該文本域對應上面方法的ename參數。

  如果用戶在查詢時向職員姓名文本域中輸入的是如下信息:

  'or'1'='1

  那麼這時就會涉及到SQL註入這個概念了。

上面的字元串傳到後臺後,與其他select等字元串拼成瞭如下的語句:

  select empno,ename,deptno from emp where ename=" or '1'='1'

上面的where條件是永遠成立的,如果你的表中有許可權限制,比如只能查詢本地市的信息,過濾條件中有地市過濾,不過因為輸入'or'1'='1字元串後,條件永遠成立,導致你能看到所有城市的職員信息,那就會產生許可權問題了,用戶能看到不該看到的信息。同理,如果是insert或者update等語句的話,通過SQL諸如會產生不可估量的問題。

 

這種不安全的情況是在SQL語句在拼接的情況下發生。

解決方法:

1、參數綁定。為了防範這樣“SQL註入安全”可以用預編譯(不要用拼接SQL字元串,可以用prepareStatement,參數用set方法進行填裝)。

 1 String sql="insert into userlogin values(?,?)";
 2 try{
 3   PrepareStatement ps = conn.prepareStatement(sql);
 4     for(int i=1;i<100;i++){
 5         ps.setInt(1,i);
 6         ps.setInt(2,8888);
 7         ps.executeUpdate();
 8     } 
 9     ps.close();
10     conn.close();      
11 }catch(SQLException e){
12     e.printStackTrace();
13 }

 2、檢查變數的數據類型和格式

  如果你的SQL語句市類似where id={$id}這種形式,資料庫里所有的id都是數字,那麼就應該在SQL被執行前,檢查確保變數id是int類型;如果是接受郵箱,那就應該檢查並嚴格確保變數一定是郵箱的格式,其他的類型比如日期、時間等也是一個道理。總結起來:只要是有固定格式的變數,在SQL語句執行前,應該嚴格固定格式去檢查,確保變數是我們預想的格式,這樣很大程度上可以避免SQL註入攻擊。

  比如,我們前面接受username參數例子中,我們的產品設計應該是在用戶註冊的一開始,就有一個用戶名的命名規則,比如5-20個字元,只能由大小寫字母、數據以及一些安全的符號組成,不包含特殊字元。此時我們應該有一個check_username的函數來進行統一的檢查。不過,仍然有很多例外情況並不能應用到這一准則,比如文章發佈系統,評論系統等必須要允許客戶提交任意字元串的場景,這就需要採用過濾等其他方案了。(使用正則表達式進行格式驗證!)

3、所有的SQL語句都封裝在存儲過程中

  所有的SQL語句都封裝在存儲過程中,這樣不但可以避免SQL註入,還能提高一些性能。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Linux下離線安裝Docker 一、基礎環境 1、操作系統:CentOS 7.3 2、Docker版本:18.06.1 官方下載地址(打不開可能很慢) 3、百度雲Docker 18.06.1地址:https://pan.baidu.com/s/1YdN9z72QutPkHBfLq06H1A 密碼: ...
  • 一 Flannel組件 1.1 flannel介紹 Kubernetes的網路模型假定了所有Pod都在一個可以直接連通的扁平網路空間中。若需要實現這個網路假設,需要實現不同節點上的Docker容器之間的互相訪問,然後運行Kubernetes。目前已經有多個開源組件支持容器網路模型。如Flannel、 ...
  • 一 CNM網路模型 1.1 網路模型 生產環境中,跨主機容器間的網路互通已經成為基本要求,更高的要求包括容器固定IP地址、一個容器多個IP地址、多個子網隔離、ACL控制策略、與SDN集成等。目前主流的容器網路模型主要有Docker公司提出的Container Network Model(CNM)模型 ...
  • 不知道各位第一次接觸linux系統是什麼時候,我是高中的時候在一篇技術推文中接觸到linux系統的,不同於windows系統的顯示界面和命令操作讓我很是感興趣。於是在當時還未熟悉電腦操作的情況下,手忙腳亂地亂鼓弄了一番。當時記得是準備在筆記本上裝雙系統的,結果不知道為什麼(可能是當時分區的時候不懂, ...
  • MySQL整理 這幾天整理了MySQL的知識點,還有一部分需要在梳理一下,圖上先寫這麼多吧。 未完待續…… ...
  • 從監控工具DPA中發現一個資料庫(SQL Server 2008 R2)的等待事件突然彪增,下鑽分析發現資料庫執行存儲過程sp_MailItemResultSets時,引起了非常嚴重的等待(High Wait),而主要的等待事件為PREEMPTIVE_OS_WAITFORSINGLEOBJEC。 如... ...
  • 2.3 NiFi Processor應用介紹對於NiFi的使用者來說,如果想要創建一個高效的數據流,那麼就需要瞭解什麼樣的單元處理器才最適合這個數據流。NiFi擁有大量的可以用於各種業務場景的單元處理器可供使用者挑選和使用,這些單元處理器主要提供例如系統之間數據的傳輸,數據的路由,數據的轉換、處理、... ...
  • 面試階段大家基本都會問一些mysql的題,具體的高深理論以後再慢慢補充,但是刷題是不可避免的,下麵直接上貨 創建/刪除表和索引系列 創建表 sql CREATE TABLE if not exists ( int(11) NOT NULL AUTO_INCREMENT, date DEFAULT N ...
一周排行
    -Advertisement-
    Play Games
  • 概述:這個WPF項目通過XAML繪製汽車動態速度表盤,實現了0-300的速度刻度,包括數字、指針,並通過定時器模擬速度變化,展示了動態效果。詳細實現包括界面設計、刻度繪製、指針角度計算等,通過C#代碼與XAML文件結合完成。 新建 WPF 項目: 在 Visual Studio 中創建一個新的 WP ...
  • 概述:在WPF中使用`WpfAnimatedGif`庫展示GIF動畫,首先確保全裝了該庫。通過XAML設置Image控制項,指定GIF路徑,然後在代碼中使用庫提供的方法實現動畫控制。這簡化了在WPF應用中處理GIF圖的過程,提供了方便的介面來管理動畫播放和暫停。 當使用 WpfAnimatedGif  ...
  • 您是否曾經訪問過一個網站,它需要很長時間載入,最終你敲擊 F5 重新載入頁面。 即使用戶刷新了瀏覽器取消了原始請求,而對於伺服器來說,API也不會知道它正在計算的值將在結束時被丟棄,刷新五次,伺服器將觸發 5 個請求。 為瞭解決這個問題,ASP.NET Core 為 Web 伺服器提供了一種機制,就 ...
  • 本章將和大家分享如何通過 Elasticsearch 實現自動補全查詢功能。 一、自動補全-安裝拼音分詞器 1、自動補全需求說明 當用戶在搜索框輸入字元時,我們應該提示出與該字元有關的搜索項,如圖: 2、使用拼音分詞 要實現根據字母做補全,就必須對文檔按照拼音分詞。在 GitHub 上恰好有 Ela ...
  • using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Windows.Forms; namespace OOP { pub ...
  • 概述:以上內容詳細介紹了在C#中如何從另一個線程更新GUI,包括基礎功能和高級功能。對於WinForms,使用`Control.Invoke`;對於WPF,使用`Dispatcher.Invoke`。高級功能使用`SynchronizationContext`實現線程間通信,確保清晰、可讀性高的代碼 ...
  • Nuget包 Microsoft.Extensions.Telemetry.Abstractions 包含的新的日誌記錄source generator,它支持使用[LogProperties]將整個對象作為State與日誌一起記錄。 我將展示一種方法來控制如何使用[LogProperties]對象 ...
  • 支持.Net/.Net Core/.Net Framework,可以部署在Docker, Windows, Linux, Mac。 常見的ORM技術(比如:Entity Framework,Dapper,SqlSugar,NHibernate,等…),它們不是在做Sql語句的程式化變種,就是在做Sq ...
  • 一、引言 在現代應用程式開發中,尤其是在涉及I/O操作(如網路請求、文件讀寫等)時,非同步編程成為了提高性能和用戶體驗的關鍵技術。C#作為.NET框架下的主流開發語言,提供了強大的非同步編程支持,通過async/await關鍵字,可以讓開發者以同步的方式編寫非同步代碼,極大地簡化了非同步編程的複雜性。本文將 ...
  • 一、引言 在.NET開發中,操作Office文檔(特別是Excel和Word)是一項常見的需求。然而,在伺服器端或無Microsoft Office環境的場景下,直接使用Office Interop可能會面臨挑戰。為瞭解決這個問題,開源庫NPOI應運而生,它提供了無需安裝Office即可創建、讀取和 ...