<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/mongodb.security.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'es',
  ),
  'this' => 
  array (
    0 => 'mongodb.security.script_injection.php',
    1 => 'Ataque por inyecci&oacute;n de scripts',
    2 => 'Ataque por inyecci&oacute;n de scripts',
  ),
  'up' => 
  array (
    0 => 'mongodb.security.php',
    1 => 'Seguridad',
  ),
  'prev' => 
  array (
    0 => 'mongodb.security.request_injection.php',
    1 => 'Ataques por inyecci&oacute;n de consultas',
  ),
  'next' => 
  array (
    0 => 'mongodb.mongodb.php',
    1 => 'MongoDB\\Driver',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'reference/mongodb/security.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="mongodb.security.script_injection" class="section">
  <h2 class="title">Ataque por inyección de scripts</h2>
  <p class="para">
   Si se utiliza JavaScript, asegúrese de que todas las variables que
   atraviesan la frontera PHP-JavaScript se pasen en el campo
   <code class="literal">scope</code> de <span class="classname"><a href="class.mongodb-bson-javascript.php" class="classname">MongoDB\BSON\Javascript</a></span>,
   y no se interpolen en la string JavaScript. Esto puede ocurrir cuando
   se utilizan cláusulas <code class="literal">$where</code> en las consultas, los
   comandos mapReduce y group, y en cualquier otro momento en que se pueda pasar
   JavaScript a la base de datos.
  </p>
  <p class="para">
   Por ejemplo, supongamos que tenemos un JavaScript para saludar a un usuario
   en los logs de la base de datos. Podríamos hacer:
  </p>
  <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$m </span><span style="color: #007700">= new </span><span style="color: #0000BB">MongoDB\Driver\Manager</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// No haga esto !!!<br /></span><span style="color: #0000BB">$username </span><span style="color: #007700">= </span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'field'</span><span style="color: #007700">];<br /><br /></span><span style="color: #0000BB">$cmd </span><span style="color: #007700">= new </span><span style="color: #0000BB">\MongoDB\Driver\Command</span><span style="color: #007700">( [<br />    </span><span style="color: #DD0000">'eval' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"print('Hello, </span><span style="color: #0000BB">$username</span><span style="color: #DD0000">!');"<br /></span><span style="color: #007700">] );<br /><br /></span><span style="color: #0000BB">$r </span><span style="color: #007700">= </span><span style="color: #0000BB">$m</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">executeCommand</span><span style="color: #007700">( </span><span style="color: #DD0000">'dramio'</span><span style="color: #007700">, </span><span style="color: #0000BB">$cmd </span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>

  <p class="para">
   Sin embargo, ¿qué pasa si un usuario malintencionado pasa JavaScript?
  </p>
  <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$m </span><span style="color: #007700">= new </span><span style="color: #0000BB">MongoDB\Driver\Manager</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// No haga esto !!!<br /></span><span style="color: #0000BB">$username </span><span style="color: #007700">= </span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'field'</span><span style="color: #007700">];<br /></span><span style="color: #FF8000">// $username equivale a "'); db.users.drop(); print('"<br /><br /></span><span style="color: #0000BB">$cmd </span><span style="color: #007700">= new </span><span style="color: #0000BB">\MongoDB\Driver\Command</span><span style="color: #007700">( [<br />    </span><span style="color: #DD0000">'eval' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"print('Hello, </span><span style="color: #0000BB">$username</span><span style="color: #DD0000">!');"<br /></span><span style="color: #007700">] );<br /><br /></span><span style="color: #0000BB">$r </span><span style="color: #007700">= </span><span style="color: #0000BB">$m</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">executeCommand</span><span style="color: #007700">( </span><span style="color: #DD0000">'dramio'</span><span style="color: #007700">, </span><span style="color: #0000BB">$cmd </span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>

  <p class="para">
   Ahora MongoDB ejecuta la string JavaScript
   <code class="literal">&quot;print(&#039;Hello, &#039;); db.users.drop(); print(&#039;!&#039;);&quot;</code>.
   Este ataque es fácil de evitar: utilice <code class="literal">args</code> para pasar
   variables de PHP a JavaScript:
  </p>
  <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$m </span><span style="color: #007700">= new </span><span style="color: #0000BB">MongoDB\Driver\Manager</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'field'</span><span style="color: #007700">] = </span><span style="color: #DD0000">'derick'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$args </span><span style="color: #007700">= [ </span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'field'</span><span style="color: #007700">] ];<br /><br /></span><span style="color: #0000BB">$cmd </span><span style="color: #007700">= new </span><span style="color: #0000BB">\MongoDB\Driver\Command</span><span style="color: #007700">( [<br />    </span><span style="color: #DD0000">'eval' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"function greet(username) { print('Hello, ' + username + '!'); }"</span><span style="color: #007700">,<br />    </span><span style="color: #DD0000">'args' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$args</span><span style="color: #007700">,<br />] );<br /><br /></span><span style="color: #0000BB">$r </span><span style="color: #007700">= </span><span style="color: #0000BB">$m</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">executeCommand</span><span style="color: #007700">( </span><span style="color: #DD0000">'dramio'</span><span style="color: #007700">, </span><span style="color: #0000BB">$cmd </span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>

  <p class="para">
   Esto añade un argumento al ámbito JavaScript, que se utiliza como argumento
   para la función <code class="literal">greet</code>. Ahora si
   alguien intenta enviar código malintencionado, MongoDB imprimirá inofensivamente
   <code class="literal">Hello, &#039;); db.dropDatabase(); print(&#039;!</code>.
  </p>

  <p class="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
   <em>cualquier</em> JavaScript en el servidor en primer lugar.
  </p>

  <p class="para">
   Se recomienda mantenerse alejado de la cláusula <a href="https://www.mongodb.com/docs/manual/reference/operator/query/where/#considerations" class="link external">&raquo;&nbsp;$where</a>
   en las consultas, ya que afecta significativamente el rendimiento. En la medida de lo posible, utilice operadores de consulta normales o el <a href="https://www.mongodb.com/docs/manual/core/aggregation-pipeline" class="link external">&raquo;&nbsp;Framework
   de agregación</a>.
  </p>

  <p class="para">
   Una alternativa a <a href="https://www.mongodb.com/docs/manual/core/map-reduce/" class="link external">&raquo;&nbsp;MapReduce</a>, que utiliza
   JavaScript, es el <a href="https://www.mongodb.com/docs/manual/core/aggregation-pipeline" class="link external">&raquo;&nbsp;Framework
   de agregación</a>. 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.
  </p>

  <p class="para">
   La <a href="https://www.mongodb.com/docs/manual/reference/command/eval/" class="link external">&raquo;&nbsp;comando eval</a>
    ha sido deprecado desde MongoDB 3.0, y también debe ser evitado.
  </p>
 </div><?php manual_footer($setup); ?>