cht電腦資訊SQL DB
adm Find login register

差點資料被毀了

site admin
1 差點資料被毀了
Promote 0 Bookmark 02007-12-18quote  

昨天無意中發現一個 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
2
Promote 0 Bookmark 02007-11-23quote  

原來 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
local   all         all                               trust
# IPv4 local connections:
host    all         all         127.0.0.1/32          trust

edited: 1
site admin
3
Promote 0 Bookmark 02007-11-23quote  

guest 除了線上統計外,其餘的不需要 DELETE。

login 的 user 則有些 table 不用 DELETE。

這樣弄應該會更安全。 

CC: PHP
cht電腦資訊SQL DB
adm Find login register
views:12870