2012-06-19 11 views
6

Recientemente me encontré con esta línea en un script PHP:

$_REQUEST['start_date']=$date; 

¿Se permite o útil en cualquier forma de asignar algo a la variable $ _REQUEST mundial súper? Si hay un $ _COOKIE ['start_date'], ¿esto cambiará el valor de la cookie?

+0

Sí, la asignación es completamente válida, aunque no puedo entender su uso – gopi1410

+2

¿Por qué no probarlo y ver qué pasa? Así es como aprendes a codificar. – vascowhite

+0

Podrías hacer eso, sí. ¿No sabes por qué lo harías? Por cierto. Simplemente podría intentar y ejecutar el código; P – Bono

Respuesta

6

Sí, está permitido y puede ser útil por una serie de razones.

  • Depuración - Si, por alguna razón se quiere "forzar" un determinado parámetro de la petición, se puede establecer un valor en los $_REQUEST, $_GET, o $_POST matrices. Esto anularía cualquier valor enviado por la página solicitante, que puede ser deseado.
  • , ya que vamos a hacer algo con toda la matriz - si se quiere, por ejemplo, todos los json_encode$_REQUEST pares de valores clave , así como algunos valores adicionales, podría ser más rápido para simplemente "agregar" valores a $_REQUEST de esta manera, luego pasar $_REQUEST a json_encode().

Con respecto a su pregunta acerca de $_COOKIE, no, no puede cambiar el valor de una cookie de esa manera, solo acceda a ella.

Nota del autor: El siguiente ejemplo fue agregado como una edición sugerida y aprobada a mi respuesta original. Y aunque puede funcionar, existen mejores formas de proteger su sitio de ataques de inyección (por ejemplo, prepared statements). En mi humilde opinión, un programador prudente debe considerar seriamente estos enfoques antes de confiar en el siguiente código.

Piense en evitar ataques de inyección SQL en su sitio web. Ese código simple dejará de ellos para todos los $_REQUEST variables (por ejemplo mysqli):

function injectionwall($dbinterface) 
{ 
    foreach($_REQUEST as $key => $data) 
    { 
     $_REQUEST[$key]=$dbinterface->real_escape_string($data); 
    } 
} 

Todos $_REQUEST variables son ahora seguro de usar :)

+0

RE: "Nota del autor" - Tiene mucha razón para agregar esa advertencia. Realmente apoyaría la eliminación de ese ejemplo, ya que en realidad es una práctica MUY mala de muchas maneras. Debe haber un ejemplo más seguro (aunque estoy luchando por pensar en uno útil). – Robbie

0

¿Está permitido o es útil de alguna manera asignarle algo al super global $ _REQUEST variable?

Sí, está permitido, pero no es útil.

Si hay un $ _COOKIE ['start_date'], ¿esto cambiará el valor de la cookie?

No, el uso setcookie http://php.net/manual/en/function.setcookie.php

Todas estas variables globales sólo súper simples matrices globales.

+4

Estoy completamente en desacuerdo con la afirmación de que "es Inútil". – jedwards

+0

@jedwards Tiene que usar esta variable súper global con cuidado, porque puede reescribir datos primarios sin saberlo. Si U usa esto, U tiene que saber cómo funciona. Creo que no lo hizo ' – Sergey

+0

Además del comentario de @jedwards, ¿no podrías usar esa variable para almacenar algo a nivel de controlador y recuperarlo a nivel de vista (dado que le das al nombre param un nombre bastante "único" para que no colisiona con algo)? Este parece un muy buen ejemplo de cómo puede ser útil, ¿estoy equivocado? – reallynice

3

creo una respuesta más apropiada es "Sí, está permitido, pero considérelo una mala práctica, así que evite una mejor calidad de programación ".

Por qué se permitió (y probablemente el punto de su pregunta):

  • superglobals se establecen en el inicio de la ejecución del programa y luego no cambian de otra manera (a menos que hacerlo). Entonces sus cambios son permanentes y fácilmente visibles en cualquier otra función. Así que adelante, edita como quieras.

Pero - ¿por qué es mejor evitar:

  • por lo general es una buena práctica para saber cuáles son sus variables son y de dónde vienen. Supongamos que tiene una función que "asegura" todas sus entradas manipulando $ _REQUEST. Cuando llega a usar $ _REQUEST, nunca puede estar seguro de si se ejecutó su función "make safe". Si se hacen pruebas unitarias, esto se vuelve especialmente problemático. Si vuelve a asignar $ _REQUEST a otra variable, puede rastrear el alcance de esa variable más fácilmente. Incluso si haces que la otra variable sea "global", entonces sabes que es seguro que existe. (A la baja, puede estar desperdiciando memoria/poder de programación para algunas aplicaciones extremadamente pesadas, pero está muy lejos de eso si hace esta pregunta.)

  • Si modifica $ _REQUEST, NO está editando $ _POST, $ _GET o $ _COOKIE; esto puede generar confusión si desea cambiar su código a $ _POST como en el futuro (por ejemplo, los datos que cree que "se han hecho seguros" no lo serán).

Por último, dos notas rápidas sobre el uso de $ _REQUEST en general:

  • $ _REQUEST es una combinación de $ _COOKIE, $ _POST y $ _GET (y HTTP_POST_FILES $ en versiones anteriores). Pero usted no sabe cuál tendrá prioridad a menos que lea el archivo php.ini - http://www.php.net/manual/en/ini.core.php#ini.variables-order. ¡Así que no confíe en que $ _POST tenga prioridad sobre $ _GET!

  • Otra razón para usar $ _POST, $ _GET o $ _COOKIE si puede: - Hace que sea más fácil para un futuro desarrollador depurar su código ya que saben de dónde espera que provenga la variable. Pero a veces es apropiado para $ _REQUEST si realmente no le importa si el valor proviene de una cookie, get o post.

Descargo de responsabilidad: sí, uso $ _REQUEST, y sí, lo he modificado para evitar algunas situaciones. Solo digo que no, si quieres ser un mejor programador.

Cuestiones relacionadas