| adm | Find | login register |
site admin joined: 2007-08-09 posted: 675 promoted: 16 bookmarked: 5 Taiwan |
昨天無意中發現一個 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 檢查是否為合法的數字。 edited: 2
| |||||||
eliu joined: 2007-08-09 posted: 11478 promoted: 617 bookmarked: 187 新竹, 台灣 |
原來 Mandriva 內定是使用 security 最弱的設定,在這種情況下,任何 local 的 connect 所被請求的身份都會被允許,這包含來自 apache 的PHP pg_connect,我是用 superuser 去 connect,所以被允許 create table。其實不需要superuser,只要被SQL injection 插入 DELETE FROM xxxx,這個 xxxx 很容易被猜中,整個站就掛了,所以定期 backup 是一定要的。 /var/lib/pgsql/data/pg_hba.conf
# "local" is for Unix domain socket connections only edited: 1
| |||||||
site admin joined: 2007-08-09 posted: 675 promoted: 16 bookmarked: 5 Taiwan |
|
| adm | Find | login register |