2012-11-09 163 views
0

可能重複:
Best way to prevent SQL injection?目錄路徑添加到數據庫

我想提出一個文件系統,用戶只能將指明文件和不應該上傳,只是使用javascript和輸入文件類型捕獲文件名。

問題是,當我把它執行查詢插入...該文件的路徑是這樣的:

C:\用戶\文件\ test.php的

問題這裏是\字符,因爲它省略了PHP中的下一個字符。所以它保存爲:C:usersfilestest.php在數據庫中。

我還有一個輸入框,用戶特異性,他們想要的文件...所以磨片他們寫道:

C:\查詢不執行,因爲\字符。

有什麼想法?

+1

你描述的是SQL注入的一個低級別的形式。防止它,因爲這標誌着**一個嚴重的問題**你有:?防止SQL注入的最佳方式(http://stackoverflow.com/q/60174/367456) – hakre

+0

謝謝你,這是一個系統在公司內部使用(內聯網)它不會公開。但我會看看這個帖子來增加安全性。感謝 – user1812695

+0

@ user1812695 - 它沒關係,它不公開。員工可能會不滿。他們可能受到基於社會工程學的攻擊(只需將其粘貼到您的地址欄中!)。他們可以犯錯誤。他們可以輸入包含特殊字符的完美數據,並導致SQL中斷。 – Quentin

回答

1

您可以使用\\儘管單\

+0

太棒了,所以你推薦str_replace到所有\\到/然後當顯示替換回來? – user1812695

+0

沒有時,你會獲取它,它將是單\ \只,因爲雙只用於保存只。 –

+0

但問題是我不能保存到數據庫,因此插入完成後字符會丟失。 – user1812695

1

如果你正確地逃脫你想插入字符串,你不會有與\消失的問題。實際上MySQL是將單個反斜線視爲轉義字符串。

因此,像這樣:

$path_string_escaped = mysqli_real_escape_string($db_connection, $path_string); 

並使用您的插入$path_string_escaped

注意,這與讓$path_string_escaped看起來像C:\\users\\files\\test.php。然後,MySQL將使用反斜槓將C:\users\files\test.php寫入數據庫。從數據庫讀取以修改字符串時,不需要執行任何操作。

你始終應該逃避用戶提供的或用戶可訪問的數據,你會被寫入到數據庫中。

這也是一個很好的例子,爲什麼,即使使用準備好的語句,你還是應該逃避用戶可訪問的數據,當你用繩子交易可能包含MySQL的轉義序列你正在寫爲DB。雖然使用預準備語句可以防止實際的注入攻擊,但是當字符串中已經存在MySQL轉義序列時,它無法按照打算的方式實際將數據寫入數據庫。