Trabajar directamente con $ _POST ¿es seguro?

0

Trabajo con php durante unas semanas y me disculpo si la pregunta es tan banal y tonta. Pero busque scrypt php aquí y sepa que algunos prefieren verificar los valores recibidos de un formulario directamente con $ _POST, mientras que otros primero mueven el contenido de $ _POST a las variables y luego realizan las comprobaciones apropiadas utilizando las variables. Desde el punto de vista de la seguridad, ¿hay diferencias o no cambia nada?

Este es un ejemplo de scrypt que trabaja directamente con $ _POST:

if(isset($_POST['test'])) { if(strlen($_POST['test'])>=200) { echo "ok" } else { echo "no!" } }

Y este es un ejemplo de script que trabaja con variables:

if(isset($_POST['test'])) { $test = $_POST['test']; if(strlen($test)>=200) { echo "ok" } else { echo "no!" } }

    
pregunta J. Doe 06.09.2017 - 22:17
fuente

1 respuesta

0

Sus ejemplos no ilustran el problema (y tampoco siguen ningún estilo PHP estándar que yo sepa). Es poco probable que vea el problema hasta que llegue a más de 100 líneas de código.

(No obtengo tu referencia a Scrypt).

Hay 2 problemas que aborda esta pregunta: el del alcance y el de la modificación de datos. $ _POST es un superglobal por lo que los datos están siempre en el alcance sin ser declarados explícitamente en un bloque. Esto tiene ciertas ventajas, por ej. Siempre sabes dónde encontrarlo. Pero confiar en los datos que desea procesar y estar presente en $ _POST al escribir un método o función significa que no puede reutilizar ese método para otros datos.

Siempre que se asegure de no cambiar el valor original, siempre puede consultar la versión canónica. p.ej. si se produce un error en el procesamiento y desea registrar las entradas y, por ejemplo, un seguimiento de pila.

El siguiente código sería muy mal programado:

foreach ($_POST as $name=>$value) {
   $_POST['name']=mysqli_real_escape_string($connection, $value);
}

En caso de duda, la regla de oro es

  • validar entrada
  • transformar salida

$ _POST, de hecho, todos los superglobales excepto $ _SESSION, son entradas.

Seguir las convenciones y aplicar buenas prácticas de programación hace que el código sea más manejable, más fácil de revisar y resistente a los errores, por lo que es menos probable que tenga efectos secundarios inesperados (es decir, vulnerabilidades).

Si hubieras preguntado esto, por ejemplo, Stackoverflow, entonces supongo que algún error habría señalado que la desreferenciación de un superglobal es más lenta que una variable local. De la misma manera que escupir en el océano eleva el nivel del agua. Sin embargo, aunque creo que esta es una pregunta sobre seguridad, sospecho que podría obtener mejores comentarios en un foro diferente.

    
respondido por el symcbean 06.09.2017 - 23:11
fuente

Lea otras preguntas en las etiquetas