確定SQL注入死透了麼?
很長一段時間,我認為後端開發,在安全性上最容易出問題的地方就在於SQL注入。透過 where 1=1
這種魔幻的SQL寫法,就可以很容易的對一個有問題的系統進行攻擊,以至於最終演進出sqlmap
這樣的神器存在。
後來的fastjson
刷新了我的認知,這個框架也算是對網路安全概念的一種推動。連不懂技術的老闆,都知道fastjson快的要命
,身為程式設計師安全概念就得到了一次提升。
推薦(免費):sql
#為什麼對sql注入情有獨鍾?因為開發人員和SQL打交道的地方太多了。甚至有的專門開發報表的同學,寫的SQL行數,比寫的程式碼行數還多!
問題是。很久很久以前,早在10年前,就有人在喊SQL注入已經死掉了,但時至今日,還是有一大批的SQL注入教學和SQL注入的案例。
SQL注入是漏洞之王,這可不是吹的。
當然在這方面,PHP的貢獻最大,Java甘拜下風。
SQL注入流行的原因,就是開發人員對自己太有自信了,或是使用的工具太原始了,沒有經過框架層進行一次過濾。如果你用了Java界的MyBatis或JPA,發生SQL注入的可能性就變的非常的低。現在PHP也有了類似thinkphp
一樣的框架,代表著能搞的SQL注入漏洞已經越來越少了。
但不代表著沒有,只是門檻提高了。我們以MyBatis為例,看看到底還能不能發生SQL注入。
MyBatis仍然存在SQL注入
使用Mybatis的同學,第一個接觸的概念,就是#和
$
的區別。這兩個符號非常的像Shell中的魔幻符號,但好在只有兩種情況。
# 代表的是使用sql預編譯方式,安全可靠
$
代表著使用的是拼接方式,有SQL注入的風險
例如下面這個xml配置,就是一個絕對安全的寫法。因為整個#{id}
會被替換成?
。
<select id="queryAll" resultMap="resultMap"> SELECT * FROM order WHERE id = #{id} </select>
但可惜的是,有些場景,並不能使用預編譯方式(或你只是不知道或懶)。像一些程式碼重構,把表名/列名/排序等字段,動態傳入的時候,不可避免的就需要SQL拼接的方式,SQL注入還是有搞頭。
但更容易發生問題的,還是LIKE
和IN
等類似的語句。
下面是兩句Like模糊查詢的寫法,實際測試會發現,使用##竟然不好使了,會報錯,需要使用sql拼接的
$
。問題由此發生。
SELECT * FROM order WHERE name like '%#{name}%' //会报语法错 SELECT * FROM order WHERE name like '%${name}%' //可以运行
而正確的寫法,應該使用函數拼接。但是工期壓死人,在不知不覺間,大多數人就選擇了簡單的寫法。畢竟功能第一嘛,也是體現工作量最主要的方式。
SELECT * FROM order WHERE name like concat(‘%’,#{name}, ‘%’) //正确的写法
同樣的問題,存在於IN
語句。
in (#{tag}) //报错 in (${tag}) //可以运行
既然幾個字元就可以運行,當然沒人選擇下面複雜的寫法。
tag in <foreach collection="tag" item="item" open="("separatosr="," close=")"> #{tag} </foreach>
還有order by,千萬不要掉以輕心,不小心就會萬劫不復。
SELECT * FROM order order by createDate #{sortType} //报错 SELECT * FROM order order by createDate ${sortType} //正常
這種情況下,就需要把sortType搞成白名單了。不就一個ASC和DESC了,你給我傳一個長長的串,是怎麼回事?
#總結
SQL注入在2021年,依然存在,只不過門檻提高了。現在SQL注入減少,都是框架的功勞,和程式設計師的水平沒半毛關係。 sql拼接的情況永遠不會消失,因為這是最快、最簡單的方式,會讓人欲罷不能。無數的外包項目,十幾年躺屍不動的系統比比皆是,寄望在框架層全部消滅SQL注入,是一個夢想。
因為它的對手,是人性的懶惰。誰也無法戰勝它。
以上是確定SQL注入死透了麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Nginx是一個快速、高效能、可擴展的Web伺服器,它的安全性是Web應用程式開發中不可忽略的問題。尤其是SQL注入攻擊,它可以對網路應用程式造成巨大的破壞。在本篇文章中,我們將討論如何使用Nginx來防範SQL注入攻擊,以保護網路應用程式的安全。什麼是SQL注入攻擊? SQL注入攻擊是一種利用網路應用程式漏洞的攻擊方式。攻擊者會在網路應用程式中註入惡

PHPSQL注入漏洞的偵測與修復概述:SQL注入是指攻擊者利用網頁應用程式對輸入進行惡意注入SQL程式碼的一種攻擊方式。 PHP作為一種廣泛應用於Web開發的腳本語言,被廣泛用於開發動態網站和應用程式。然而,由於PHP的靈活性和易用性,開發者常常忽略了安全性,導致了SQL注入漏洞的存在。本文將介紹如何偵測和修復PHP中的SQL注入漏洞,並提供相關程式碼範例。檢

Laravel開發注意事項:防止SQL注入的方法與技巧隨著互聯網的發展和電腦技術的不斷進步,Web應用程式的開發也變得越來越普遍。在開發過程中,安全性一直是開發者不可忽視的重要議題。其中,防止SQL注入攻擊是開發過程中需要特別關注的安全性問題之一。本文將介紹幾種Laravel開發中常用的方法和技巧,幫助開發者有效地防止SQL注入。使用參數綁定參數綁定是Lar

0x01前言概述小編又在MySQL中發現了一個Double型資料溢位。當我們拿到MySQL裡的函數時,小編比較有興趣的是其中的數學函數,它們也應該包含一些資料型態來保存數值。所以小編就跑去測試看哪些函數會出現溢位錯誤。然後小編發現,當傳遞一個大於709的值時,函數exp()就會造成一個溢位錯誤。 mysql>selectexp(709);+-----------------------+|exp(709)|+----------- ------------+|8.218407461554972

在網路安全領域裡,SQL注入攻擊是一種常見的攻擊方式。它利用惡意用戶提交的惡意程式碼來改變應用程式的行為以執行不安全的操作。常見的SQL注入攻擊包括查詢操作、插入操作和刪除操作。其中,查詢操作是最常被攻擊的一種,而防止SQL注入攻擊的一個常用的方法是使用PHP。 PHP是一種常用的伺服器端腳本語言,它在web應用程式中的使用非常廣泛。 PHP可以與MySQL等關係

PHP程式設計技巧:如何防止SQL注入攻擊在進行資料庫操作時,安全性是至關重要的。 SQL注入攻擊是一種常見的網路攻擊,它利用了應用程式對使用者輸入的不正確處理,從而導致惡意的SQL程式碼被插入並執行。為了保護應用程式免受SQL注入攻擊的影響,我們需要採取一些防範措施。使用參數化查詢參數化查詢是最基本、最有效的防範SQL注入攻擊的方法。它透過將使用者輸入的值與SQL查詢

PHP表單過濾:SQL注入防範與過濾引言:隨著網路的快速發展,Web應用程式的開發變得越來越普遍。在Web開發中,表單是最常見的使用者互動方式之一。然而,表單提交資料的處理過程中存在著安全風險。其中,最常見的風險之一就是SQL注入攻擊。 SQL注入攻擊是一種利用網路應用程式對使用者輸入資料處理不當而導致攻擊者能夠執行非授權資料庫查詢的攻擊方式。攻擊者透過在

提昇系統安全性:MyBatis防範SQL注入攻擊的技巧隨著資訊科技的不斷發展,資料庫應用已成為現代軟體系統中不可或缺的一部分。然而,隨之而來的是資料庫安全性問題,其中最常見且危害嚴重的恐怕非SQL注入攻擊莫屬。 SQL注入攻擊是指攻擊者透過在輸入欄位中插入惡意SQL程式碼,從而能夠非法取得資料庫中的資訊或破壞資料庫的完整性。為了防範SQL
