2009-11-27 57 views
3

我正在看看如何正確地轉義來自外部世界的數據,然後才能將其用於應用程序控制,存儲,邏輯......這種事情。轉義用戶數據,沒有魔術引號

很明顯,在PHP 5.3.0+版本中很快棄用了magic quotes指令,並且在php6中刪除了這個指令,對於那些希望升級並進入新語言特性的用戶,同時維護舊版代碼(don我們喜歡它..)。

但是,我沒有看到的一件事是關於理論/最佳實踐的討論,一旦您保護了數據後應如何處理 - 例如,是否使用斜線存儲?我個人認爲保持逃脫在DB數據並不是一個好的做法,但希望聽到的討論,最好讀一些案例研究..

從PHP手冊中的某些鏈接僅供參考:

PHP Manual - mysql_real_escape_string

PHP Manual - htmlspecialchars

等等等等

任何提示嗎?

+3

你說的「例如,存儲有或沒有斜線」的事實使我相信你可能有一個錯誤的正確轉義的概念。如果你正確地進行轉義,那麼發送到需要斜線的數據庫的字符串將會擁有它們,但實際上並不存儲在數據庫中。如果您在數據庫中看到斜線,則數據不正確地逃脫。 – longneck 2009-11-27 16:42:57

+0

請解釋更多longneck - mysql會在插入前刪除轉義符嗎?有關於此的網頁嗎?但是你是對的 - 我想我在過去的某個時候忽略了這一點,現在試圖趕上。 – dmp 2009-11-27 16:49:54

+0

mysql_real_escape_string不會轉義斜槓等。它使SQL查詢的字符串安全。 – William 2009-11-27 16:51:14

回答

6

看看準備好的語句。我知道在MySQL中這工作得很好,並且是一種將數據存入數據庫的安全形式。它也有一些性能優勢。

http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html

我有更多的資源,如果你有興趣。

希望這是你在找什麼,tc。

編輯:

有一件事我可以補充的是在準備好的語句組合使用過濾器。例如,要檢查該值是否是使用FILTER_SANITIZE_STRING的值,或者是您使用FILTER_SANITIZE_EMAIL的電子郵件。

這節省了一些代碼量,並且工作得很好。之後您可以隨時使用自己的方法檢查數據,但可以使用很多過濾器。

+0

謝謝,將通讀! – dmp 2009-11-27 16:51:56

+0

我一直在尋找這個 - 你提到了更多的資源,如果你有機會,我會欣賞一些鏈接!再次感謝提示。 – dmp 2010-03-05 12:14:46

+0

看看這兩個鏈接: http://net.tutsplus.com/tutorials/php/getting-clean-with-php/和http://net.tutsplus.com/tutorials/other/top-20- mysql-best-practices/ 一個如果對於php和一個對於mysql,只是一些最佳實踐,享受! – 2010-03-05 23:21:29

0

很簡單。在將數據插入數據庫之前,所有傳入的數據都應該通過mysql_real_escape_string()。例如,如果你知道某些東西需要是一個整數,那麼在插入它之前將其設置爲一個整數,等等。記住,這只是爲了阻止SQL注入。 XSS和數據驗證是不同的。

如果您希望成爲電子郵件,那麼在將其插入數據庫之前,您顯然需要對其進行驗證。

htmlentities()清理數據,意味着它修改的數據。我認爲你應該始終將原始數據存儲在數據庫中,並且當你抓取這些數據時,選擇你想如何消毒的數據。

我喜歡使用以下函數作爲mysql_real_escape_string()函數的「包裝器」。

function someFunction($value) 
{ 
    if (is_int($value) || is_float($value)) { 
     return $value; 
    } 
    return "'" . mysql_real_escape_string((string) $value) . "'"; 
} 

如果該值是一個浮點或整數,那麼在運行mysql_real_escape_string()沒有意義的。在將值傳遞給mysql_real_escape_string()之前,我將該值轉換爲字符串的原因是因爲有時該值可能不是字符串。

不是一個字符串值的例子:

http://localhost/test.php?hello[]=test

內test.php的,你在$ _GET運行mysql_real_escape_string() [ '你好']希望你好是一個字符串。那麼,因爲人將值設置爲數組,它實際上會引起通知,因爲hello不是字符串。

+0

你的回答並不完全清楚。你的建議是不要使用htmlentities? – markus 2009-11-27 16:40:55

+0

他的建議是在數據庫存儲之前始終使用mysql_real_escape_string – 2009-11-27 16:42:43

+0

將數據存儲在數據庫中時?是的,我的建議是不使用htmlentities。如果我向瀏覽器輸出數據,那是用戶數據,那麼是的,我會通過htmlentities來運行它。有時我可能不想要某些情況下,關鍵是我有這種選擇,當我訪問該數據。 – William 2009-11-27 16:43:45

2
  • 使用運行查詢時逃逸數據的正確方法: mysql_real_escape_string,準備查詢,等等...在數據庫不變

  • 使用轉義的正確的方法

  • 存儲數據輸出數據: htmlspecialchars等。

+0

謝謝,沒有足夠的人意識到數據需要雙方因不同原因而逃脫。 SQL注入已經變得不那麼令人擔憂了,似乎很多人都明白這一點,但XSS已經變得越來越普遍了,我很高興看到像加倫這樣的人談論它,以及如何預防它。 – 2009-11-28 00:09:46

1

對於數據庫插入,解決方案是使用bind variables。通常,任何時候當你發現自己逃脫任何事情(shell命令,db命令塊,用戶提供的html等等的參數)時,它表明你沒有使用正確的函數調用(例如,使用system,當你可以使用exec的多參數形式),或者你的框架是有缺陷的。在缺陷框架下工作的標準方法是加強它,以便您可以回到不考慮引用。

思考逃跑的程度和引用的級別可能很有趣,但如果你真的喜歡那些在空閒時間玩Tcl的遊戲。對於真正的工作,除非你正在設計一個供其他人使用的庫,否則你不應該考慮引用,在這種情況下,你應該引用正確,讓用戶避免引用思考。 (並且你應該非常仔細地記錄你準確地引用了什麼類型的引用)

2

對於數據庫工作,檢查參數化查詢和預處理語句。 PDOmysqli對此很有幫助。

Htmlspecialchars是在html文檔中顯示一些文本的正確工具。

而且,正如您所提及的php 5.3,您可以訪問在處理用戶數據時必須使用的filter functions