※ 引述《JYHuang (夏天到了,冷不起來了說)》之銘言:
: ※ 引述《foxzgerald (O⊥M)》之銘言:
: : 另外. $sql 字串最好先脫序. 特別是這些查詢字串中的一些變數來自於使用者輸入
: : ($_POST 或是 $_GET 之類的) .. 如果不先脫序. 很容易被 sql injection 攻擊
: : 相關資訊請看 mysql-query 的第二個範例.或者 google :)
: 請問,所謂的脫序是不是泛指將$sql中的特殊符號(例如 ' )
: 做註記處理 (變成\')。
: 使人無法透過url和表單中的變數去中斷並改變mysql_query($sql)的執行結果?
: 透過mysql_escape_string就可以阻絕掉基本的sql injection嗎?
基本上是的。更安全的做法是依照各種變數的屬性制定不同的 filter,
以身分證字號為例:常用的檢測方式便能夠避免 SQL injection。
因此,若使用者輸入的資料天生具備可過濾的特徵,最好先過濾掉,
而 mysql_real_escape_string() 則當作輔助措施。
mysql_real_escape_string() 除了具有阻絕 sql injection的效果外,
由於 binary 檔案(如:圖檔、影片...etc)可能含有脫序字元,
因此直接 insert 進 db 時,小則會發生錯誤、大則引起災難,
此點也必須要注意。
另外要注意的是:PHP.ini 中 magic_quotes_gpc/magic_quotes_sybase 是否開起。
因為這兩個會自動脫序....有時會因為這功能的美意幫了倒忙
http://tw.php.net/manual/en/function.mysql-real-escape-string.php
此點在『Example 1402. A "Best Practice" query』中有詳細範例。
: 另外,我還是看不太懂mysql_escape_string和mysql_real_escape_string的差異
: 是差別在mysql_real_escape_string可以引用參照字嗎?
: 謝謝 :)
這兩個應該是一樣的東西,我剛去查
http://tw.php.net/manual/en/function.mysql-escape-string.php
的 ChangeLog 發現:
Version Description
-----------------------------------------------------------------------
4.3.0 This function became deprecated, do not use this function.
Instead, use mysql_real_escape_string().
mysql_escape_string() 已經不建議使用;建議改用 mysql_real_escape_string()
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.119.199.121
※ 編輯: foxzgerald 來自: 140.119.199.121 (05/11 00:48)