2012-01-21 29 views
9

Tôi có kinh nghiệm với việc bảo vệ các phép chèn sql trên MYSQL, nhưng tôi nên cẩn thận với MongoDB bằng trình điều khiển php? Trong hầu hết các trang, tôi nhận dữ liệu qua GET/POST và tìm kiếm/chèn hệ thống. Tôi tìm kiếm qua UDID/các trường khác và có thể chèn bất kỳ giá trị chuỗi nào. Ngoài ra tôi nhận được cookie của người dùng thông qua javascript.Các mối quan tâm về bảo mật khi sử dụng trình điều khiển PHP MongoDB

  1. Vì vậy, khi GET/POST, tôi sẽ thêm vào từng hàm htmlentities biến?

  2. Điều gì sẽ thay thế mysql_real_escape_string? Tôi có nên sử dụng nó không?

Vì vậy, ví dụ, khi làm

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

$downloads->insert($download); 

là OK này?

  1. Có cách nào để kiểm tra xem chuỗi có thực sự là UID không?

  2. Bất kỳ suy nghĩ nào khác tôi cần biết khi sử dụng MongoDB và PHP? Tôi nhận được cookie của tôi bằng cách sử dụng javascript, và tìm kiếm trong DB của tôi bằng cách sử dụng các tập tin cookie. Điều gì về điều đó?

Trả lời

5

Vì vậy, khi GET/POST, tôi thêm vào mỗi htmlentities chức năng biến?

Không cần. Tuy nhiên, bạn nên sử dụng htmlentities khi xuất dữ liệu do người dùng tạo ra cho trình duyệt, để ngăn chặn các cuộc tấn công XSS.

Điều gì sẽ thay thế mysql_real_escape_string? Tôi có nên sử dụng nó không?

Bạn không nên sử dụng mysql_real_escape_string vì nó dành cho MySQL. Không có gì thay thế điều này trên MongoDB, người lái xe sẽ chăm sóc thoát dữ liệu cho bạn.

Có cách nào để kiểm tra xem chuỗi có thực sự là UID không?

Cách duy nhất để xác thực là truy vấn MongoDB bằng chuỗi đó và kiểm tra xem nó có tồn tại không.

Bạn có thể tuy nhiên, xác nhận nếu định dạng là đúng:

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

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

Bất kỳ suy nghĩ khác tôi nên lưu ý khi sử dụng MongoDB và PHP? Tôi nhận được cookie của tôi bằng cách sử dụng javascript, và tìm kiếm trong DB của tôi bằng cách sử dụng các tập tin cookie. Điều gì về điều đó?

Không nhiều. Đối với bất kỳ ứng dụng web nào, bạn rất nản lòng khi lưu trữ dữ liệu nhạy cảm trong cookie, chẳng hạn như mã định danh người dùng, mật khẩu, v.v. vì chúng có thể dễ dàng được xử lý và sử dụng để truy cập vào các phần của ứng dụng của bạn nên bị hạn chế hoặc mạo danh người dùng khác .

+0

oops, loại bỏ UDID, tôi có nghĩa là UID (_id) ... –

+0

cố định cả ở đây và trong câu hỏi của bạn. :) – netcoder

+0

Cảm ơn bạn rất nhiều! Đó là âm thanh thực sự tốt. Ví dụ: khi thực hiện $ download = array ( 'url' => $ _GET ['url'] ); $ downloads-> insert ($ download); Điều này có ổn không? –

1

Btw tôi nghĩ rằng một cái gì đó là bị mất ví dụ

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

Trong Sql này trông như thế này

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

Cách tôi biết là hợp lệ để thoát sutiations này là để biết những gì loại dữ liệu bạn mong đợi và bỏ nó. Hy vọng câu trả lời hữu ích

0

Có, bạn cần phải trốn thoát!

Imagine mã như rằng:

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

Và yêu cầu là:

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

này sẽ vượt qua đăng nhập !!
Bạn phải chuyển đổi các giá trị GET/POST thành chuỗi.
Không cần phải thoát khỏi dấu ngoặc kép vv

Trong trường hợp của bạn, để ngăn chặn các mảng như 'url':

$download = array('url' => (string)$_GET['url']); 
$downloads->insert($download); 
Các vấn đề liên quan