1
0
mirror of https://github.com/php/doc-es.git synced 2026-03-23 23:12:09 +01:00
Files
archived-doc-es/reference/mongodb/security.xml
2025-05-01 16:22:55 +02:00

181 lines
6.3 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 3e871fe7eab38f9b0398569c57a1dd0c21e69652 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="mongodb.security" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Seguridad</title>
<section xml:id="mongodb.security.request_injection">
<title>Ataques por inyección de consultas</title>
<para>
Si se pasan parámetros <literal>$_GET</literal> (o <literal>$_POST</literal>)
a las consultas, asegúrese de convertirlos en strings antes.
Los usuarios pueden insertar arrays asociativos en las consultas
GET y POST, que podrían convertirse en consultas $ no deseadas.
</para>
<para>
Un ejemplo bastante inofensivo: supongamos que se buscan las informaciones de un
usuario con la consulta <emphasis>http://www.example.com?username=bob</emphasis>.
La aplicación crea la consulta
<literal>$q = new \MongoDB\Driver\Query( [ 'username' => $_GET['username'] ])</literal>.
</para>
<para>
Esto funciona bien, pero alguien podría subvertirlo pasando
<emphasis>http://www.example.com?username[$ne]=foo</emphasis>, que PHP
transformará mágicamente en un array asociativo, transformando la consulta en
<literal>$q = new \MongoDB\Driver\Query( [ 'username' => [ '$ne' => 'foo' ] ] )</literal>,
que devolverá todos los usuarios cuyo nombre no es "foo" (todos los usuarios, probablemente).
</para>
<para>
Este es un ataque bastante fácil de contrarrestar: asegúrese de que los parámetros
<literal>$_GET</literal> y <literal>$_POST</literal> sean del tipo esperado
antes de enviarlos a la base de datos. PHP dispone de la función
<function>filter_var</function> para ayudar.
</para>
<para>
Tenga en cuenta que este tipo de ataque puede ser utilizado con cualquier interacción
con la base de datos que localice un documento, incluyendo actualizaciones,
upserts, eliminaciones y comandos findAndModify.
</para>
<para>
Ver <link xlink:href="&url.mongodb.dochub.security;">la documentación principal</link>
para más información sobre los problemas de tipo inyección SQL con MongoDB.
</para>
</section>
<section xml:id="mongodb.security.script_injection">
<title>Ataque por inyección de scripts</title>
<para>
Si se utiliza JavaScript, asegúrese de que todas las variables que
atraviesan la frontera PHP-JavaScript se pasen en el campo
<literal>scope</literal> de <classname>MongoDB\BSON\Javascript</classname>,
y no se interpolen en la string JavaScript. Esto puede ocurrir cuando
se utilizan cláusulas <literal>$where</literal> en las consultas, los
comandos mapReduce y group, y en cualquier otro momento en que se pueda pasar
JavaScript a la base de datos.
</para>
<para>
Por ejemplo, supongamos que tenemos un JavaScript para saludar a un usuario
en los logs de la base de datos. Podríamos hacer:
</para>
<programlisting role="php">
<![CDATA[
<?php
$m = new MongoDB\Driver\Manager;
// No haga esto !!!
$username = $_GET['field'];
$cmd = new \MongoDB\Driver\Command( [
'eval' => "print('Hello, $username!');"
] );
$r = $m->executeCommand( 'dramio', $cmd );
?>
]]>
</programlisting>
<para>
Sin embargo, ¿qué pasa si un usuario malintencionado pasa JavaScript?
</para>
<programlisting role="php">
<![CDATA[
<?php
$m = new MongoDB\Driver\Manager;
// No haga esto !!!
$username = $_GET['field'];
// $username equivale a "'); db.users.drop(); print('"
$cmd = new \MongoDB\Driver\Command( [
'eval' => "print('Hello, $username!');"
] );
$r = $m->executeCommand( 'dramio', $cmd );
?>
]]>
</programlisting>
<para>
Ahora MongoDB ejecuta la string JavaScript
<literal>"print('Hello, '); db.users.drop(); print('!');"</literal>.
Este ataque es fácil de evitar: utilice <literal>args</literal> para pasar
variables de PHP a JavaScript:
</para>
<programlisting role="php">
<![CDATA[
<?php
$m = new MongoDB\Driver\Manager;
$_GET['field'] = 'derick';
$args = [ $_GET['field'] ];
$cmd = new \MongoDB\Driver\Command( [
'eval' => "function greet(username) { print('Hello, ' + username + '!'); }",
'args' => $args,
] );
$r = $m->executeCommand( 'dramio', $cmd );
?>
]]>
</programlisting>
<para>
Esto añade un argumento al ámbito JavaScript, que se utiliza como argumento
para la función <literal>greet</literal>. Ahora si
alguien intenta enviar código malintencionado, MongoDB imprimirá inofensivamente
<literal>Hello, '); db.dropDatabase(); print('!</literal>.
</para>
<para>
Utilizar argumentos ayuda a prevenir la ejecución de entradas malintencionadas por
la base de datos. Sin embargo, se debe asegurar de que el código no
devuelva ni ejecute la entrada de ninguna manera. Es preferible evitar ejecutar
<emphasis>cualquier</emphasis> JavaScript en el servidor en primer lugar.
</para>
<para>
Se recomienda mantenerse alejado de la cláusula <link
xlink:href="&url.mongodb.docs;reference/operator/query/where/#considerations">$where</link>
en las consultas, ya que afecta significativamente el rendimiento. En la medida de lo posible, utilice operadores de consulta normales o el <link xlink:href="&url.mongodb.docs;core/aggregation-pipeline">Framework
de agregación</link>.
</para>
<para>
Una alternativa a <link
xlink:href="&url.mongodb.dochub.mapreduce;">MapReduce</link>, que utiliza
JavaScript, es el <link
xlink:href="&url.mongodb.docs;core/aggregation-pipeline">Framework
de agregación</link>. A diferencia de Map/Reduce, utiliza un lenguaje idiomático para construir consultas, sin tener que escribir y utilizar el enfoque JavaScript más lento que Map/Reduce requiere.
</para>
<para>
La <link
xlink:href="&url.mongodb.docs;reference/command/eval/">comando eval</link>
ha sido deprecado desde MongoDB 3.0, y también debe ser evitado.
</para>
</section>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->