昨天無意中發現一個 table t_jiaozhu,我應該不可能建這個 table。用 google 一查果然問題出來了,這種 security 的問題稱 SQL injection。
例如 php 中
$sql_query = " SELECT * FROM aaaa WHERE NAME='$user_post'";
$user_post 是 使用者 input 的 text。
如果 $user_post = "';CREATE TABLE ggyy (zz integer) --"
則實際執行的內容是
SELECT * FROM aaaa WHERE NAME='';CREATE TABLE ggyy (zz integer) --'
上面是一個合法的 SQL statement,最後的 '會因為 -- 被當成 comment,第二個被灌入的 CREATE TABLE 就會被執行 。
解決的方式最簡單的方法是用
$user_post = addslashes($user_post)
加上 '\ ' 以避免 string 被截斷。
Postgresql 為何允許 create table,這要查一下。
SELECT * FROM aaaa WHERE id=$a
$a 是一個字串一樣可以被這樣惡搞,這邊也可以用 ctype_digit 檢查是否為合法的數字。