sql注入方式及如何有效避免

2022-08-26 06:12:08 字數 2467 閱讀 1804

首先提及sql注入這個題目,也許大家會笑笑,覺得這是一件比較低階的攻擊方式,但事實上,正是這種不屑,就可能會導致我們**資料庫伺服器被攻擊,甚至伺服器許可權都被提走,這種例子,以不鮮見。以下是我在寫orm時sql注入這塊,所研究的心得,分享給大家,有可能說的不對,還望大家指正。

先來看下這段sql

$query = 'select * from user where name =" '.$name.' "';

這樣的sql是我們經常有寫的,

然後$name = ' ";delete from user where name="mini -- ";';

這裡' 後面跟乙個空格,其實沒有,是wile看的更清楚些

如此,這就是是乙個sql注入,先截斷了我們定義好的"符號,自定義乙個"使之於我們定義好的第乙個"配對,這樣後面的輸入串,就非乙個sql字串了,就成功完成sql注入

這種截斷引號的注入方式非常常見,當然引號包括單引號於雙引號,注入者,必須要完成與sql語句的前乙個引號,成功配對,才可能完成注入,這裡所說的成功配置指的是,如果 我們這裡

where name =" ' .$name. ' " 注入者,就必須只有用"號才能成功配對,截斷本該是字串的引數,

如果這塊是 where name =' " .$name. " ' 單引號來標識的字串,那麼注入者,只可能用單引號來截斷,完成注入

注意上面提到的sql語句,變數拼接語法所涉及到的單引號或雙引號,這只是語法形式,拼接完成後,並不會保留

前面說到的是,截斷引號方式的注入方法,還有一種是根本不需要截斷引號就可以完成注入的方式,

比如說,如下sql 

$query = 'select * from '.$user.' where name ="zhangyan" ';

其中$user = 'user;delete from user where name="mini";--';

如此這個變數本來就不在乙個字串中,當然,注入時,不用引號配對來截斷,直接;結束上乙個sql然後寫我們的注入sql語句就ok

所以,有效的避免sql注入,並不僅僅是在where條件後。

如何來有效的避免sql注入呢,

這裡只說pdo,

1.首先pdo提供quote方法,來轉義所有的輸入的引數

但是使用quote方法需要注意的是,它認為所有輸入的引數都是字串形式輸出,所以在拼接sql是,自定義的sql語句就不用在加上 字串表示符了(單引號或者雙引號) 比如說where name ='.$name 

直接如此就ok 。這裡出現的單引號是為了拼接變數的語法形式,並不是字串中的引號

2.第二種方式是使用prepare來於執行你的sql語句,之後再進行填充你的輸入引數,以此來保證不會出現截斷整體sql的行為,但並不是說sql語句就完全能夠防止sql注入,比如如下

$preparesql = 'select * from '.$user.' where name =:name';

$sth = $dbh->prepare($preparesql);

$sth->execute(array(':name' => 'zhangsan'));

這裡的$user 還是和之前一樣 $user = 'user;delete from user where name="mini";--';

這樣在預執行的時候,sql注入就已經發生了,網上都說pdo能夠防止sql注入,這完全是不對的說法,

其實是否能完全防止sql語句,在於你是怎樣用 的,比如說,我們把所有的輸入引數,都經過轉義後,才拼接到sql語句中,如果是用prepare,我們把所有輸入引數都放在execute中,而不是拼接在prepare時,如此就能有效的防範sql注入,

其實關於網上說pdo能夠防止sql注入,這句話應該這樣說,pdo能夠提供給更好的方法來防止sql注入。

其他鏈結資料庫方式,只要做好輸入欄位的轉義工作,也一樣能夠有效的防止sql的注入

其實所謂欄位的轉義工作,在sql語句裡面,可以參照於pdo的quote方法,吧所有輸入欄位都當做字串的輸出,並且對所有引號進行轉義,這樣就能有效的防止,sql語句的注入。

3.對整個sql語句進行直接轉義。

也許你回這樣想,直接對整個sql語句進行轉義,這樣就開發者就不用單獨提出所輸入的字段了,也許你沒這樣想過,但至少我這樣想過,但是這種方式是不對的,如下

這裡就不以指令碼的形式表現了,直接是sql語句形式

select * from user where name = /"zh/"angyan/"

如果是對整個sql語句進行直接轉義,最終傳送給mysql的就是這樣一句sql。

可以執行下,就知道,失敗。

因為第一次轉義和第二次轉義的",正好會完成引號的配對,這樣後面的字元就不是一種字串方式了,在此之前,sql語句已經被截斷,也就是說這種方式,是不會解決sql注入的。

最後總結一句:想從根本上解決sql注入,其實在於開發者的個人意識,根本上說什麼框架不能完美的解決這個問題,即使是從框架方法解決,開發者也必須要把輸入資料按照框架的約定放在我特定的規則裡面,才能完美的解決sql注入隱患。

避免SQL注入

sql注入攻擊 sql injection 簡稱注入攻擊,是web開發中最常見的一種安全漏洞。可以用它來從資料庫獲取敏感資訊,或者利用資料庫的特性執行新增使用者,匯出檔案等一系列惡意操作,甚至有可能獲取資料庫乃至系統使用者最高許可權。而造成sql注入的原因是因為程式沒有有效過濾使用者的輸入,使攻擊者...

避免SQL注入

sql注入攻擊 sql injection 簡稱注入攻擊,是web開發中最常見的一種安全漏洞。可以用它來從資料庫獲取敏感資訊,或者利用資料庫的特性執行新增使用者,匯出檔案等一系列惡意操作,甚至有可能獲取資料庫乃至系統使用者最高許可權。而造成sql注入的原因是因為程式沒有有效過濾使用者的輸入,使攻擊者...

24 SQL注入是什麼,如何避免SQL注入?

sql 注入 sql injection 是發生在 web 程式中資料庫層的安全漏洞,是 存在最多也是最簡單的漏洞。主要原因是程式對使用者輸入資料的合法性沒有判斷和處理,導致攻擊者可以在 web 應用程式中事先定義好的 sql 語句中新增額外的 sql 語句,在管理員不知情的情況下實現非法操作,以此...