[第十一週] 什麼是SQL Injection及防範


駭客的填字遊戲,是一種攻擊行為。
在輸入的字串之中夾帶SQL指令,在未防範下,那麼這些夾帶進去的惡意指令就會被資料庫伺服器誤認為是正常的SQL指令而執行,因此遭到破壞或是入侵,進而竊取資料。

原本的程式碼:

select * from users where username= '%s' and password = '%s', $username

如果改成以下,可以拿到全部的users資料:

// 1=1 永遠都是 true
select * from users where username= '' or 1=1#,

所以如果駭客只要輸入 username 為 ' or 1=1# 及 password 為 123,即可拿到全部的 users 資料

// # 為註解,所以 # 之後的都被當作註解,不會執行
// 如果 username 是空字串,或是 1=1, 就會 select users 的全部資料
select * from users where username= '' or 1=1#' and password = '123', $username

原本新增留言的程式碼:

insert into comments(nickname, content) 
 values('%s', '%s')

如果輸入 nickname:a, content:'),('admin','test') ,就可以一次新增兩筆留言,一筆是 a 留得空字串, 另一筆是 admin 留的 test。

insert into comments(nickname, content) 
 values('a', ''),('admin','test')')

Prepared Statement

可以防止 SQL注入攻擊
原本的登入程式碼可以改成:

  $sql = "insert into users(nickname, username, password) 
    values(?, ?, ?)";
  $stmt = $conn->prepare($sql);
  $stmt->bind_param('sss', $nickname, $username, $password);
  $result = $stmt->execute();






Related Posts

前言

前言

React 基礎:關於性能優化

React 基礎:關於性能優化

Web Component 實戰

Web Component 實戰




Sponsored



Comments