PHP中 簡單的SQL注入分析

SQL注入原理:就是經過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。

如下介紹SQL注入方式:

首先建表以下:
1 create database sqltest charset utf8
2 
3 create table test (
4 id int,5 name varchar(10),
6 age tinyint unsigned
7 )engine=myisam charset=utf8

插入數據以下php

咱們分紅字段爲數值類型和字符串類型兩種方式進行測試:sql

1、下面開始測試字段爲數值類型時的sql注入,sql語句:
1 $id= $_GET['tid'];
2 $sql = "select * from test where id = $id";

查找id爲1的記錄,在瀏覽器中輸入並執行以下數據庫

能夠看到,此時只查詢到1條記錄,查詢結果上面顯示的是自動拼接好的sql字符串。繼續,將瀏覽器URL中的tid=1 換成tid=1 or 1=1測試,結果以下瀏覽器

此時全部的記錄都被查出來了,這是針對字段爲數值類型時 的sql注入方式,爲了不被注入咱們能夠將代碼:服務器

$id= $_GET['tid'];

改爲以下:測試

$id= $_GET['tid'] + 0;

原理:當數據庫中字段爲數值類型時,無論你的參數多麼險惡,+0後都老老實實變成數值類型。spa

 

 2、測試字段爲數值類型時的sql注入,sql語句:.net

$name = $_GET['name'];
$sql1 = "select * from test where name = '$name'";

查找name爲test1的記錄,在瀏覽器中輸入並執行以下:code

只查到一條記錄,這是正確的。如今把URL中 name=test1 換成 name=test1' or 1=1--'   測試以下:blog

全部記錄都被查出來了。從上圖顯示的sql語句能夠看出where後面的表達式 name = 'test1' or 1=1--' 恆爲真(--將其後面的字符串都省略掉)

針對上面的sql注入 咱們能夠經過將瀏覽器中接受來的字符轉義的方式避免,在php中 能夠採用魔術引號的方法,將PHP.ini文件中的參數magic_quotes_gpc置爲ON

例如: 瀏覽器中name = test1‘ or 1=1--',通過轉義後獲得的sql字符串變爲:

select * from test where name = 'test1\' or 1=1--\''

再次查詢變爲:

這時查不到任何結果,字符串的引號是成對出現的,通過轉義後 sql 把test\' or 1=1--\'做爲一個字符串,而不是像上述把 'test' 做爲一個字符串。

這只是最簡單的sql注入,更深的後面再研究吧

相關文章
相關標籤/搜索