Buscar..


Observaciones

Elegir entre GET y POST

Las solicitudes GET son las mejores para proporcionar los datos necesarios para representar la página y se pueden usar varias veces (consultas de búsqueda, filtros de datos ...). Son parte de la URL, lo que significa que se pueden marcar como favoritos y, a menudo, se reutilizan.

Las solicitudes POST, por otro lado, están destinadas a enviar datos al servidor solo una vez (formularios de contacto, formularios de inicio de sesión ...). A diferencia de GET, que solo acepta ASCII, las solicitudes POST también permiten datos binarios, incluidas las cargas de archivos .

Puedes encontrar una explicación más detallada de sus diferencias aquí .

Solicitar vulnerabilidades de datos

También mire: ¿cuáles son las vulnerabilidades en el uso directo de GET y POST?

La recuperación de datos de las superglobales $ _GET y $ _POST sin ninguna validación se considera una mala práctica, y abre métodos para que los usuarios puedan acceder o comprometer datos a través de inyecciones de código y / o SQL . Los datos no válidos deben ser revisados ​​y rechazados para prevenir tales ataques.

Los datos de solicitud deben escaparse dependiendo de cómo se usa en el código, como se indica aquí y aquí . En esta respuesta se pueden encontrar algunas funciones de escape diferentes para casos comunes de uso de datos.

Manejo de errores de carga de archivos

El $_FILES["FILE_NAME"]['error'] (donde "FILE_NAME" es el valor del atributo de nombre de la entrada del archivo, presente en su formulario) puede contener uno de los siguientes valores:

  1. UPLOAD_ERR_OK - No hay error, el archivo se cargó con éxito.
  2. UPLOAD_ERR_INI_SIZE : el archivo cargado excede la directiva upload_max_filesize en php.ini .
  3. UPLOAD_ERR_PARTIAL : el archivo cargado supera la directiva MAX_FILE_SIZE que se especificó en el formulario HTML.
  4. UPLOAD_ERR_NO_FILE : no se ha cargado ningún archivo.
  5. UPLOAD_ERR_NO_TMP_DIR - Falta una carpeta temporal. (Desde PHP 5.0.3).
  6. UPLOAD_ERR_CANT_WRITE - Error al escribir el archivo en el disco. (Desde PHP 5.1.0).
  7. UPLOAD_ERR_EXTENSION - Una extensión de PHP detuvo la carga del archivo. (Desde PHP 5.2.0).

Una forma básica de verificar los errores, es la siguiente:

<?php
$fileError = $_FILES["FILE_NAME"]["error"]; // where FILE_NAME is the name attribute of the file input in your form
switch($fileError) {
    case UPLOAD_ERR_INI_SIZE:
        // Exceeds max size in php.ini
        break;
    case UPLOAD_ERR_PARTIAL:
        // Exceeds max size in html form
        break;
    case UPLOAD_ERR_NO_FILE:
        // No file was uploaded
        break;
    case UPLOAD_ERR_NO_TMP_DIR:
        // No /tmp dir to write to
        break;
    case UPLOAD_ERR_CANT_WRITE:
        // Error writing to disk
        break;
    default:
        // No error was faced! Phew!
        break;
}

Lectura de datos POST

Los datos de una solicitud POST se almacenan en el superglobal $_POST en forma de una matriz asociativa.

Tenga en cuenta que el acceso a un elemento de una matriz no existente genera un aviso, por lo que la existencia siempre debe verificarse con las isset() o empty() , o el operador de fusión nula.

Ejemplo:

$from = isset($_POST["name"]) ? $_POST["name"] : "NO NAME";
$message = isset($_POST["message"]) ? $_POST["message"] : "NO MESSAGE";

echo "Message from $from: $message";
7.0
$from = $_POST["name"] ?? "NO NAME";
$message = $_POST["message"] ?? "NO MESSAGE";

echo "Message from $from: $message";

Leyendo datos GET

Los datos de una solicitud GET se almacenan en el superglobal $_GET en forma de una matriz asociativa.

Tenga en cuenta que el acceso a un elemento de una matriz no existente genera un aviso, por lo que la existencia siempre debe verificarse con las isset() o empty() , o el operador de fusión nula.

Ejemplo: (para URL /topics.php?author=alice&topic=php )

$author = isset($_GET["author"]) ? $_GET["author"] : "NO AUTHOR";
$topic = isset($_GET["topic"]) ? $_GET["topic"] : "NO TOPIC";

echo "Showing posts from $author about $topic";
7.0
$author = $_GET["author"] ?? "NO AUTHOR";
$topic = $_GET["topic"] ?? "NO TOPIC";

echo "Showing posts from $author about $topic";

Lectura de datos POST sin procesar

Generalmente, los datos enviados en una solicitud POST son pares de clave / valor estructurados con un tipo MIME de application/x-www-form-urlencoded . Sin embargo, muchas aplicaciones, como los servicios web, requieren que se envíen datos sin procesar, a menudo en formato XML o JSON. Estos datos se pueden leer usando uno de dos métodos.

php://input es una secuencia que proporciona acceso al cuerpo de solicitud sin formato.

$rawdata = file_get_contents("php://input");
// Let's say we got JSON
$decoded = json_decode($rawdata);
5.6

$HTTP_RAW_POST_DATA es una variable global que contiene los datos POST sin procesar. Solo está disponible si la directiva always_populate_raw_post_data en php.ini está habilitada.

$rawdata = $HTTP_RAW_POST_DATA;
// Or maybe we get XML
$decoded = simplexml_load_string($rawdata);

Esta variable ha quedado en desuso desde la versión 5.6 de PHP y se eliminó en PHP 7.0.

Tenga en cuenta que ninguno de estos métodos está disponible cuando el tipo de contenido se establece en multipart/form-data , que se utiliza para cargar archivos.

Subiendo archivos con HTTP PUT

PHP proporciona soporte para el método HTTP PUT utilizado por algunos clientes para almacenar archivos en un servidor. Las solicitudes PUT son mucho más simples que una carga de archivos usando solicitudes POST y se ven algo así:

PUT /path/filename.html HTTP/1.1

En tu código PHP entonces harías algo como esto:

<?php
/* PUT data comes in on the stdin stream */
$putdata = fopen("php://input", "r");

/* Open a file for writing */
$fp = fopen("putfile.ext", "w");

/* Read the data 1 KB at a time
   and write to the file */
while ($data = fread($putdata, 1024))
  fwrite($fp, $data);

/* Close the streams */
fclose($fp);
fclose($putdata);
?>

También aquí puede leer interesantes preguntas / respuestas SO sobre recibir archivos a través de HTTP PUT.

Pasando matrices por POST

Generalmente, un elemento de formulario HTML enviado a PHP da como resultado un solo valor. Por ejemplo:

<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
    <input type="hidden" name="foo" value="bar"/>
    <button type="submit">Submit</button>
</form>

Esto resulta en el siguiente resultado:

Array
(
    [foo] => bar
)

Sin embargo, puede haber casos en los que desee pasar una matriz de valores. Esto se puede hacer agregando un sufijo similar a PHP al nombre de los elementos HTML:

<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
    <input type="hidden" name="foo[]" value="bar"/>
    <input type="hidden" name="foo[]" value="baz"/>
    <button type="submit">Submit</button>
</form>

Esto resulta en el siguiente resultado:

Array
(
    [foo] => Array
        (
            [0] => bar
            [1] => baz
        )

)

También puede especificar los índices de matriz, como números o cadenas:

<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
    <input type="hidden" name="foo[42]" value="bar"/>
    <input type="hidden" name="foo[foo]" value="baz"/>
    <button type="submit">Submit</button>
</form>

Lo que devuelve esta salida:

Array
(
    [foo] => Array
        (
            [42] => bar
            [foo] => baz
        )

)

Esta técnica se puede usar para evitar lapsos de post-procesamiento sobre la matriz $_POST , haciendo que su código sea más simple y conciso.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow