sql注入是我們在程式開發過程中經常要注意的問題,屬於發生於應用程式之資料庫層的安全漏洞,通過構建特殊的輸入作為引數傳入web應用程式,而這些輸入大都是sql語法裡的一些組合,通過執行sql語句進而執行攻擊者所要的操作,其主要原因是程式沒有細緻地過濾使用者輸入的資料,致使非法資料侵入系統。
簡而言之,是在輸入的字串之中注入sql指令,在設計不良的程式當中忽略了檢查,那麼這些注入進去的指令就會被資料庫伺服器誤認為是正常的sql指令而執行,因此遭到破壞。
這是乙個簡單的資料表:
create table `user` (
`id` int(10) not null auto_increment,
`name` varchar(50) not null,
`password` varchar(50) not null,
`age` smallint(3) not null,
`is_admin` tinyint(1) not null,
primary key (`id`)
) engine=innodb auto_increment=4 default charset=utf8;
insert into `user` values (『1′, 『tom』, 『2313sdf』, 』10』, 『0』);
insert into `user` values (『2′, 『lucy』, 『sdff234′, 『5』, 『0』);
insert into `user` values (『3′, 『teacher wang』, 『salfdjlkvjaldf』, 』24』, 『1』);
請看下面這些sql語句:
$sql=」select * from user where name=』$name』 and password=』$password';」;
情況一:
若使用者通過表單提交的資訊是:
$name = 「tom』 or 『1』=』1″;
$password = 「test」;
資料在未經檢驗處理的情況下,導致原本的sql字串被解析為:
select * from user where name=』tom』 or 『1』=』1′ and password=』test';
sql執行結果為:
我們在沒有輸出正確密碼的情況下,拿到了「tom」的資訊,即用「tom」的身份登入了**。
情況二:
若使用者通過表單提交的資訊是:
$name = 「『 or name!=」 and is_admin=1 or 『1』=』1″;
$password = 「test」;
資料在未經檢驗處理的情況下,導致原本的sql字串被解析為:
select * from user where name=」 or name!=」 and is_admin=1 or 『1』=』1′ and password=』test';
sql執行結果為:
我們在沒有輸出正確使用者名稱及密碼的情況下,拿到了「teacher wang」的資訊,即用「teacher wang」的身份登入了**。
情況三:
若使用者通過表單提交的資訊是:
$name = 「『 ; delete from user;'」;
$password = 「test」;
資料在未經檢驗處理的情況下,導致原本的sql字串被解析為:
select * from user where name=」 ; delete from user;」 and password=』test';
sql執行結果為:
悲劇了,user表資料被清空了
如何防範sql注入攻擊:
php**實現:
function mysql_prepare_for_request($value, $type = 「string」)
//配置連線有效資料庫
$con = mysql_connect ( 『localhost』, 『root』, 『root』 );//填寫正確的使用者名稱,密碼
if (! $con)
$return = mysql_real_escape_string ( $return );
mysql_close ( $con );
break;
case 「number」 :
if (! is_numeric ( $return ))
break;
default :
$return = 「」;
break;
}return $return;
}//情況一:使用者輸入
$name = 「tom』 or 『1』=』1″;
$password = 「test」;
$sql=」select * from user where name=』$name』 and password=』$password';」;
echo 「危險:」.$sql.」
」;//資料轉義過濾
$name = mysql_prepare_for_request ( $name, 『string』 );
$password = mysql_prepare_for_request ( $password, 『string』 );
$sql=」select * from user where name=』$name』 and password=』$password';」;
echo 「安全:」.$sql.」
」;//情況二:使用者輸入
$name = 「『 or name!=」 and is_admin=1 or 『1』=』1″;
$password = 「test」;
$sql=」select * from user where name=』$name』 and password=』$password';」;
echo 「危險:」.$sql.」
」;//資料轉義過濾
$name = mysql_prepare_for_request ( $name, 『string』 );
$password = mysql_prepare_for_request ( $password, 『string』 );
$sql=」select * from user where name=』$name』 and password=』$password';」;
echo 「安全:」.$sql.」
」;//情況三:使用者輸入
$name = 「『 ; delete from user;'」;
$password = 「test」;
$sql=」select * from user where name=』$name』 and password=』$password';」;
echo 「危險:」.$sql.」
」;//資料轉義過濾
$name = mysql_prepare_for_request ( $name, 『string』 );
$password = mysql_prepare_for_request ( $password, 『string』 );
$sql=」select * from user where name=』$name』 and password=』$password';」;
echo 「安全:」.$sql.」
」;輸出結果:
危險:select * from user where name=』小明』 or 『1』=』1′ and password=』test';
安全:select * from user where name=』小明\』 or \』1\』=\』1′ and password=』test';
危險:select * from user where name=」 or name!=」 and is_admin=1 or 『1』=』1′ and password=』test';
安全:select * from user where name=』\』 or name!=\』\』 and is_admin=1 or \』1\』=\』1′ and password=』test';
危險:select * from user where name=」 ; delete from user;」 and password=』test';
安全:select * from user where name=』\』 ; delete from user;\」 and password=』test';
sql防注入解決辦法
sql防注入步驟 1.什麼是sql注入?我理解的sql注入就是一些人可以通過惡意的引數輸入,讓後台執行這段sql,然後達到獲取資料或者破壞資料庫的目的!舉個簡單的查詢例子,後台sql是拼接的 select from test where name 引數傳遞 前台jsp頁面要求輸入name,那麼黑客可...
Sql Server 注入防止辦法
一般的黑客攻擊sql server時,首先採用的方法是執行master擴充套件儲存過程xp cmdshell命令來破壞資料庫,為了資料庫安全起見,最好禁止使用xp cmdshell xp cmdshell可以讓系統管理員以作業系統命令列直譯器的方式執行給定的命令字串,並以文字行方式返回任何輸出,是乙...
防止SQL注入解決方案
sql注入就是通過把sql命令插入到web表單提交或輸入網域名稱或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的sql命令。對於很多 都有使用者提交表單的埠,提交的資料插入mysql資料庫中,就有可能發生sql注入安全問題,那麼,如何防止sql注入呢?針對sql注入安全問題的預防,需時刻認定使用者...