2012-01-21 20 views
9

Tengo experiencia en asegurar inyecciones SQL en MySQL, pero ¿qué debo tener cuidado con MongoDB usando el controlador php? En la mayoría de las páginas obtengo datos a través de GET/POST y buscando/insertando el sistema. Busco a través de UDID/otros campos, y puedo insertar cualquier valor de cadena. También obtengo cookies del usuario a través de javascript.Problemas de seguridad durante el uso del controlador MongoDB PHP

  1. Así que cuando GET/POST, estoy agregando a cada función variable htmlentities?

  2. ¿Qué reemplazaría mysql_real_escape_string? ¿Debo usarlo?

Así, por ejemplo, cuando se hace

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

$downloads->insert($download); 

¿Está bien?

  1. ¿Hay alguna forma de comprobar si una cadena es realmente un UID?

  2. ¿Alguna otra cosa que deba saber al usar MongoDB y PHP? Obtengo mis cookies usando javascript y buscando en mi DB usando las cookies. ¿Qué hay de eso?

Respuesta

5

Así que cuando GET/POST, estoy añadiendo a cada función htmlentities variable?

No es necesario. Sin embargo, debe usar htmlentities al enviar datos generados por el usuario a un navegador para evitar ataques XSS.

¿Qué reemplazaría mysql_real_escape_string? ¿Debo usarlo?

No debe usar mysql_real_escape_string como es para MySQL. Nada reemplaza esto en MongoDB, el controlador se encarga de escanear los datos por usted.

¿Hay alguna forma de comprobar si una cadena es realmente un UID?

La única forma de validar es consultar a MongoDB con esa cadena y verificar si existe.

Sin embargo, puede validar si el formato es correcto :

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

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

Cualquier piensan más que debería tener en cuenta cuando se utiliza MongoDB y PHP? Obtengo mis cookies usando javascript y buscando en mi DB usando las cookies. ¿Qué hay de eso?

No mucho. Al igual que con cualquier aplicación web, se desaconseja almacenar datos confidenciales en las cookies, como identificadores de usuario, contraseñas, etc., ya que pueden atenuarse fácilmente y utilizarse para acceder a partes de su aplicación que deberían restringirse o suplantar a otros usuarios. .

+0

Uy, retire UDID, me refería a UID (_id) ... –

+0

fijo tanto aquí y en tu pregunta. :) – netcoder

+0

¡Muchas gracias! Eso suena realmente bien. Entonces, por ejemplo, al hacer $ download = array ( 'url' => $ _GET ['url'] ); $ downloads-> insert ($ download); ¿Esto está bien? –

1

Por cierto creo que algo se pierde por ejemplo

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

en SQL esto se parece a esto

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

La forma en que sé es válida para escapar de este sutiations es saber qué tipo de datos que esperar y lanzarlo. Espero que la respuesta haya sido útil

0

Sí, necesitas escapar!

Imagínese que un código como:

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

y la solicitud es:

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

Esto pasará el inicio de sesión !!
Debe convertir los valores GET/POST a cadena.
No hay necesidad de escapar de las cotizaciones, etc.

En su caso, para evitar que las matrices como 'url':

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