2012-01-21 84 views
9

我有保護MYSQL數據庫注入的經驗,但是我應該小心使用php驅動程序的MongoDB?在大多數頁面中,我通過GET/POST和搜索/插入系統獲取數據。我通過UDID /其他字段搜索,並可以插入任何字符串值。我也通過javascript獲取用戶的cookies。使用MongoDB PHP驅動程序時的安全問題

  1. 所以當GET/POST,我添加到每個變量htmlentities功能?

  2. 什麼會取代mysql_real_escape_string?我應該使用它嗎?

因此,例如,做

$download = array('url' => $_GET['url']); 

$downloads->insert($download); 

當這樣行嗎?

  1. 有沒有辦法檢查一個字符串是否真的是一個UID?

  2. 任何其他想法我應該知道什麼時候使用MongoDB和PHP?我確實使用javascript獲取cookie,並使用cookie在我的數據庫中進行搜索。那個怎麼樣?

回答

5

所以當GET/POST,我添加到每個變量ヶ輛功能?

不需要。但是,在將用戶生成的數據輸出到瀏覽器時,您應該使用htmlentities,以防止XSS攻擊。

什麼會取代mysql_real_escape_string?我應該使用它嗎?

您不應該像使用mysql_real_escape_string那樣使用MySQL。在MongoDB上沒有任何東西可以替代這個,驅動程序負責爲你轉換數據。

有沒有辦法來檢查一個字符串是否真的是一個UID?

唯一的方法是驗證它是用該字符串查詢MongoDB並檢查它是否存在。

但是,可以驗證,如果格式正確

$id = '4f1b166d4931b15415000000'; 
$a = new MongoId($id); 
var_dump($a->{'$id'} == $id); // true 

$id = 'foo'; 
$a = new MongoId($id); 
var_dump($a->{'$id'} == $id); // false 

任何其他想使用的MongoDB和PHP時,我應該知道?我確實使用javascript獲取cookie,並使用cookie在我的數據庫中進行搜索。那個怎麼樣?

並不多。對於任何Web應用程序,您都非常沮喪地將敏感數據存儲在Cookie中,例如用戶標識符,密碼等,因爲它們可以輕鬆調節並用於訪問應該限制應用程序的某些部分,或者模擬其他用戶。

+0

哎呀,刪除UDID,我的意思是UID(_id)... –

+0

固定都在這裏並在你的問題。 :) – netcoder

+0

非常感謝!這聽起來很不錯。因此,例如,當做 $ download = array( 'url'=> $ _GET ['url'] ); $下載專區 - >插入($下載); 可以嗎? –

1

順便說一句,我認爲東西被遺漏例如

yourdomain.com/login?username=admin&passwd[$ne]=1 

在SQL它看上去是這樣

SELECT * FROM collection 
    WHERE username="admin", 
    AND passwd!=1 

我知道的方法是有效的擺脫這種sutiations是要知道什麼類型的數據你期待並施展它。 希望答案很有用

0

是的,你確實需要逃脫!

想象一下這樣的代碼是:

<?php 
$login = $users->findOne([ 
    'user_id' => $_GET['uid'], 
    'password' => $_GET['password'] 
]); 
?> 

而且要求是:

https://example.com/login?uid=3&password[$neq]=xxx 

這將通過登錄!
您必須將GET/POST值轉換爲字符串。
無需逃避報價等

你的情況,以防止數組作爲 'URL':

$download = array('url' => (string)$_GET['url']); 
$downloads->insert($download);