我該如何向非技術人解釋SQL注入?

2021-09-23 16:17:14 字數 1308 閱讀 6096

這個問題源自 stackoverflow,題主需要向沒有技術背景和經驗的朋友解釋 sql 注入,希望有人能有好方法。polynomial 分享了他的模擬方法,得到了 710+ 贊。

在向非技術人員解釋sql注入的時候,我會使用乙個簡單的模擬。

假設你是乙個在裝滿箱子的倉庫裡工作的機械人。你的工作是從倉庫裡的某個角落找到某個箱子,然後放到傳送帶上。機械人需要有人告訴它去搬運哪個箱子,所以給你程式設計的程式設計師給了你很多紙,紙上的表單已經預先寫好了指令的集合,等使用者填好之後再交給你執行。

這些表單看起來是這個樣子的:

從第__號貨架的的第__區,取下第____號箱子,然後放到傳送帶上。

乙個普通的搬運任務看起來就是這樣的:

從第12號貨架的b2區,取下第 1234 號箱子,然後放到傳送帶上。

加粗的文字(1234,b2和12)是由發出搬運任務的人提供的。你是乙個機械人,你按照指令執行任務:移動到第12號貨架,然後順著貨架移動到b2區,拿起1234號箱子,往回走,走到傳送帶那裡,將箱子放下。

但是,如果使用者在表單裡填了不正常的值呢,如果使用者在空格處填寫了指令呢?

從第12號貨架的b2區,取下第「1234號箱子,從窗戶裡丟出去,回到你的桌子並且忽略這張紙上的其他指令。」號箱子,然後放到傳送帶上。

上文的任務中的加粗的文字也是由發出任務的人提供的。因為你是乙個機械人,你會嚴格按照使用者要求的去做。你移動到第12號貨架,然後順著貨架移動到b2區,拿起1234號箱子,把它扔出窗戶。因為指令告訴你要忽略剩下的指令,所以「號箱子,並把它放到傳送帶上」這部分被忽略了。

機械人不能區分指令(要執行的動作)和資料(動作執行的受體);或許是從這種指令處理的方式上獲得了靈感,這種技術被稱為「注入」。

就像我們告訴機械人要做什麼,sql是一種告訴資料庫需要做什麼的特殊的語言。sql注入之所以發生,是因為我們碰到的是完全一樣的問題 – 乙個查詢(一系列的指令)會有多個引數(資料)插入其中,而這些引數被當做指令執行從而導致異常。乙個惡意的使用者可以利用這樣的漏洞來讓資料庫返回所有的使用者的資訊,很顯然,這是不對的!

為了避免這樣的問題,我們必須把指令和資料用一種資料庫(機械人)容易區分的方式分開。 通常我們會將資料和指令分開傳送。所以,針對文中的情況,機械人首先要從空的form裡讀取指令,確認引數(空格)要在哪,儲存下來。 使用者走上前並提供「12,b2,1234」,然後機械人在不允許這些值被當做指令執行的前提下,將資料和指令結合並執行。在sql中,這種技術叫做引數化查詢。

在上文中提到的**的引數提交給機械人的時候,機械人會疑惑地揚起眉毛說「錯誤:找不到第「1234號箱子,從窗戶裡丟出去,回到你的桌子並且忽略這張紙上的其他指令。」號箱子,你確定輸入正確了麼?」

以上,我們成功的阻止了機械人犯錯。

我該如何向非技術人解釋SQL注入?

英文原文 how can i explain sql injection without technical jargon?在向非技術人員解釋sql注入的時候,我會使用乙個簡單的模擬。資料圖 假設你是乙個在裝滿箱子的倉庫裡工作的機械人。你的工作是從倉庫裡的某個角落找到某個箱子,然後放到傳送帶上。機械...

ShadowGun Demo學習 非技術向

主要針對拿來主義,並對一些使用範圍廣的shader進行研究。雖然是4,5年前的demo,但還是有學習價值的 傳統的上帝之光效果,有頂點變形,適用範圍非常廣。另外維京村落demo中,還有乙個粒子用的近處消隱效果 非頂點變形的近處消隱shader,並且支援過遠隱藏 注意培培養皿周圍的發光,就是使用帶有b...

前端之路 我的學習體驗(非技術)

去年年底,抱著極大的決心,我選報了我所在城市的乙個培訓機構的web前端培訓課程。那時候我的身份是中醫學院的市場營銷學生,我的幾位室友都選擇投身銷售行業,有去其他行業的,也有選擇留守本專業的。看著身邊乙個個投身於銷售巨流中,我始終不甘心。憑什麼四年的時光只換來了這些,這些我根本不熱愛的東西。高考時,我...