mirror of
https://github.com/php/doc-es.git
synced 2026-03-23 23:12:09 +01:00
181 lines
6.3 KiB
XML
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
|
|
-->
|