SQL註入詳解
阿新 • • 發佈:2017-11-12
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註入詳解