看板 PHP 關於我們 聯絡資訊
※ 引述《gname ((′口‵)↗︴<><...<><)》之銘言: : ※ 引述《walilecow (三重捷運套房頂讓)》之銘言: : : 如果是數字的話建議使用intval : : 如果是字串建議使用addslashes : : 例如: "SELECT * FROM table_name WHERE id=".intval($_GET['id']) : : "SELECT * FROM `user` WHERE name=\"".addslashes($_GET['name'])."\"" : 看到底下的推文就忍不住來回一下文了...XD : 有人提到說 mysql_real_escape_string() 比較安全, 其實這個並不盡然啊... : 因為攻擊是多樣性的... : http://0rz.tw/5G3PW : 這一篇是歷時了四年的討論串, 雖然只有二頁, 而且後面快離題了...XD : 裡面所舉的一個例子: : PHP Code: : $sub = mysql_real_escape_string("%something"); // still %something : mysql_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'"); addslashes 的確是被設計來跳脫字串的,官方文件也是這樣寫 不過文件也很清楚的寫到 It's highly recommended to use DBMS specific escape function. (e.g. mysqli_real_escape_string() for MySQL or pg_escape_string() for PostgreSQL), but if the DBMS you're using does't have an escape function and the DBMS uses \ to escape special chars, you can use this function 所以,還是用 native 的方法會好些。 至於 mysql_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'"); ^ 這種寫法其實不是很好,除非是為了故意製造問題(非預期的查詢結果)。 比較好的方法是用 prepare/execute 來 bind param, bind result 。 而且 LIKE 不是這樣用的。 % 應該在變數那邊就加上去,而非放在 SQL 敘述本身 以你的 SQL 敘述為例,在 prepare/execute 的情況下,語法會被改寫成 SELECT * FROM messages WHERE subject LIKE '?%' 這樣,但你馬上就會發現 在 prepare 階段程式就會爛掉,根本無法執行。所以當進行 LIKE 查詢的時候 寫法依然是 SELECT * FROM messages WHERE subject LIKE ? 即可,然後 % 放在 param 一起 bind 進去才是比較好的方法。 http://php.net/manual/en/pdo.prepared-statements.php (這一頁是給 PDO 的文件,但範例很清楚,觀念大同小異,有提到相同用法) 至於這樣會不會被 SQL Injection ,你可以自己把範例貼一貼作個實驗就知道。 : 這裡引發的又是另外一種的攻擊...(3F的回文中所引用到的PDF檔有詳細的說明) : (建議把那篇PDF載下來閱讀) : ==========我是分隔線============ : 以我自己的實務經驗,addslashes再配合一些變數條件限定其實就蠻夠用了... : 之前被很多資安廠商掃過,也沒有跳出過什麼問題出來...(不過也不代表絕對沒問題 囧) : (機器掃瞄總是比較笨的...XD) : 心得:多花點時間,多弄些條件限定(過濾),被攻擊的可能性就會少了一點~ php 的 MySQL extension 相較之下是很陽春的東西,但很可惜中文教科書上都只有 介紹這個,我是建議使用 MySQLi 或是 PDO 或是一些開放原始碼的 DBI 會好很多。 畢竟都已經 2011 了.. XD -- The Internet: where men are men, women are men, and children are FBI agents. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.220.104.63 ※ 編輯: roga 來自: 61.220.104.63 (03/10 01:54)
shadowjohn:感謝大大的建議 03/10 02:05
gname:受教了...^^ 03/10 09:24
roga:不敢當, 互相討論. 03/10 11:01