PHP中該怎樣防止SQL注入?

2021-06-22 04:43:16 字數 3642 閱讀 6163

如果使用者輸入的資料在未經處理的情況下插入到一條sql查詢語句,那麼應用將很可能遭受到sql注入攻擊,正如下面的例子:

1

2

3

$unsafe_variable=$_post['user_input'];

mysql_query("insert into `table` (`column`) values ('".$unsafe_variable."')");

因為使用者的輸入可能是這樣的:

1

value'); drop table table;--

那麼sql查詢將變成如下:

1

insertinto`table` (`column`)values('value');droptabletable;--')

應該採取哪些有效的方法來防止sql注入?

使用預處理語句和引數化查詢。預處理語句和引數分別傳送到資料庫伺服器進行解析,引數將會被當作普通字元處理。這種方式使得攻擊者無法注入惡意的sql。 你有兩種選擇來實現該方法:

1、使用pdo: 1

2

3

4

5

6

7

$stmt=$pdo->prepare('select * from employees where name = :name');

$stmt->execute(array('name'=>$name));

foreach($stmtas$row)

2、使用mysqli: 1

2

3

4

5

6

7

8

9

$stmt = $dbconnection->prepare('select * from employees where name = ?');

$stmt->bind_param('s', $name);

$stmt->execute();

$result = $stmt->get_result();

while($row = $result->fetch_assoc())

注意,在預設情況使用pdo並沒有讓mysql資料庫執行真正的預處理語句(原因見下文)。為了解決這個問題,你應該禁止pdo模擬預處理語句。乙個正確使用pdo建立資料庫連線的例子如下:

1

2

3

4

$dbconnection=newpdo('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8','user','pass');

$dbconnection->setattribute(pdo::attr_emulate_prepares, false);

$dbconnection->setattribute(pdo::attr_errmode, pdo::errmode_exception);

在上面的例子中,報錯模式(attr_errmode)並不是必須的,但建議加上它。這樣,當發生致命錯誤(fatal error)時,指令碼就不會停止執行,而是給了程式設計師乙個捕獲pdoexceptions的機會,以便對錯誤進行妥善處理。 然而,第乙個setattribute()呼叫是必須的,它禁止pdo模擬預處理語句,而使用真正的預處理語句,即有mysql執行預處理語句。這能確保語句和引數在傳送給mysql之前沒有被php處理過,這將使得攻擊者無法注入惡意sql。了解原因,可參考這篇博文:pdo防注入原理分析以及使用pdo的注意事項。 注意在老版本的php(<5.3.6),你無法通過在pdo的構造器的dsn上設定字符集,參考:silently ignored the charset parameter。

當你將sql語句傳送給資料庫伺服器進行預處理和解析時發生了什麼?通過指定佔位符(乙個?或者乙個上面例子中命名的 :name),告訴資料庫引擎你想在**進行過濾。當你呼叫execute的時候,預處理語句將會與你指定的引數值結合。 關鍵點就在這裡:引數的值是和經過解析的sql語句結合到一起,而不是sql字串。sql注入是通過觸發指令碼在構造sql語句時包含惡意的字串。所以,通過將sql語句和引數分開,你防止了sql注入的風險。任何你傳送的引數的值都將被當作普通字串,而不會被資料庫伺服器解析。回到上面的例子,如果$name變數的值為 』sarah』; delete from employees ,那麼實際的查詢將是在 employees 中查詢 name 字段值為 』sarah』; delete from employees 的記錄。 另乙個使用預處理語句的好處是:如果你在同一次資料庫連線會話中執行同樣的語句許多次,它將只被解析一次,這可以提公升一點執行速度。 如果你想問插入該如何做,請看下面這個例子(使用pdo):

1

2

3

$preparedstatement = $db->prepare('insert into table (column) values (:column)');

$preparedstatement->execute(array('column'=> $unsafevalue));

PHP中該怎樣防止SQL注入

如果使用者輸入的資料在未經處理的情況下插入到一條sql查詢語句,那麼應用將很可能遭受到sql注入攻擊,正如下面的例子 unsafe variable post user input mysql query insert into table column values unsafe variable...

php 防止sql注入

標題起的名字很大其實這裡只說乙個簡單的方法 防止sql注入的方法有很多,這裡要說的其實就是漏洞演練平台dvwa裡的一種方式 直接看high級別的就可以了 id get id id stripslashes id id mysql real escape string id if is numeric...

php防止sql注入

所謂sql注入,是由表單提交時,後台拼接 sql語句造成的。如此,會給系統帶來很大的破壞,甚至導致整個資料庫被清掉,或刪除。因此必須做好防注入操作。關於這個問題,成熟的方案有很多,現在總結如下 一,從根源上解決問題,也就是在接受表單提交時,要特別注意sql拼接處理可能帶來的影響,避免給黑客留下突破口...