1. 程式人生 > >SQL註入詳解

SQL註入詳解

sql攻擊 -1 可能 die 註入 a-z rep 狀態 ||

SQL是一種將SQL代碼添加到輸入參數中,傳遞到SQL服務器解析並執行的一種攻擊手段

產生的原因

  •  web開發人員無法保證所有輸入都已經安全過濾
  •  攻擊者利用發送給SQL服務器的輸入數據,構造可執行的SQL代碼
  • 數據庫未做相應的安全配置

從哪裏尋找SQL註入的漏洞?

  •   識別web應用中的所有輸入點:GET,POST,Header信息
  •   了解哪些類型的請求會觸發異常:特殊字符
  • 檢查服務器響應中的異常:通過響應狀態碼判斷,例如404可能是因為GET不到資源,500可能是SQL語句出錯

如何進行SQL攻擊

  •   數字註入

   例如where語句後面加 id=-1 OR 1=1 ,這使得查詢條件永遠為真

  • 字符串註入

     例如符號 # 和 -- 都會起到註釋作用,SELECT * FROM user WHERE name = ‘james ‘#‘ AND password = ‘123123...‘這個語句在#符號後面的都被註釋了,其實就只查詢了name=‘james‘而已,--符號同理

預防SQL註入

  • 嚴格檢查輸入變量的類型和格式

根據id查詢文章,一般要判斷非空和非數字

if(empty($id) || is_int($id)){
     die(‘查詢錯誤‘);  
}

正則過濾

if(empty($name) || !preg_match
("/^[a-zA-Z0-9]{6,}$",$name)){ die(‘用戶名格式錯誤‘); }
  • 過濾和轉義特殊字符 addslashes() mysqli_real_escape_string()
  • 利用mysql的預編譯機制(參考手冊)
$db = mysqli_connect(‘localhost‘,$username,$pwd,$database);
$sql = "SELECT id,name FROM user WHERE name = ? AND password = ?";

$stmt = mysqli_prepare($db
,$sql); mysqli_stmt_bind_param($stmt,‘ss‘,$name,$password); mysqli_stmt_execute($stmt); mysqli_stmt_bind_result($stmt,$id,$name); mysqli_stmt_fetch($stmt);

SQL註入詳解