SQL註入的問題

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

首先,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註入,還能提高一些性能。


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

更多相關文章
  • 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 ...
一周排行
  • 在上篇文章中我們已經知道了多線程是什麼了,那麼它到底可以幹嘛呢?這裡特別聲明一個前面的委托沒看的同學可以到上上上篇博文查看,因為多線程要經常使用到委托。源碼 一、非同步、同步 1.同步(在計算的理解總是要你措不及防,同步當線程做完一件事情之後,才會執行後續動作),同步方法慢,只有一個線程執行,非同步方法 ...
  • 本文主要是講解stopwatch對程式運行時間的準確測量 僅僅介紹裡面的StartNew()方法,Restart()方法和ElapsedMilliseconds { get;}屬性 public void StartNew():作用是對新的 System.Diagnostics.Stopwatch ...
  • 一、引言 RabbitMQ是Rabbit Message Queue的簡寫,但不能僅僅理解其為消息隊列,消息代理更合適。RabbitMQ是一個由 Erlang 語言開發的AMQP(高級消息隊列協議)的開源實現,其內部結構如下: RabbitMQ作為一個消息代理,主要和消息打交道,負責接收並轉發消息。 ...
  • TerminalMACS(Terminal Manager And Check System) 遠程終端管理和檢測系統 本文同步更新地址:https://dotnet9.com/11429.html 一、本系統可監控多種終端資源: 移動端 Android iOS PC端 Windows Linux ...
  • 首先,好消息是Goole將於2020年2月份發佈Chrome 80版本。本次發佈將推進Google的“漸進改良Cookie”策略,打造一個更為安全和保障用戶隱私的網路環境。 壞消息是,本次更新可能導致瀏覽器無法向服務端發送Cookie。如果你有多個不同功能變數名稱的應用,部分用戶很有可能出現會話時常被打斷的 ...
  • 在偶然一次調試某程式時,遇到提示: 無法載入程式集*****.XmlSerializers.dll,文件找不到(Could not load file or assembly ****.XmlSerializers.dll , FileNotFoundException...)。於是嘗試在項目屬性中 ...
  • 在上一篇abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之五(四十一) 文章中實現了入庫管理的列表頁面,並實現了控制器的代碼。在今天我們學習如何在前端實現新增入庫單信息界面。 ...
  • 面向對象 面向對象是一個抽象的概念,其本質就是對事物以抽象的方式建立對應的模型。 簡單來講,比如我有一隻鋼筆,那麼我就可以通過分析,可以得到 這隻鋼筆的材第是塑料,品牌是個雜牌 ,裡面裝的墨是黑色的,可以用。這時候就能建立一個鋼筆的模型,它在這裡應該有這些屬性: 圖是一個不正確的UML類圖,但是可以 ...
  • 在ASP.NET MVC中有四種過濾器類型 Action 1、在ASP.NET MVC項目中,新建文件夾Filter,然後新建類MyCustormFilter,繼承自ActionFilterAttribute類,我們來看下ActionFilterAttribute類有如下四個方法,從命名我應該就可以 ...
  • 你需要瞭解的 HTTP Status Code Intro 現在前後端分離的開發模式越來越流行,後端負責開發對應的 API,前端只需要 關註前端頁面的數據展示和前端邏輯即可。 對於前後端分離這種開發模式,我個人還是比較喜歡的,因為這樣可以讓更專業的人做更專業的事情,後端專註於做 API 的開發設計, ...
x