marzo 21, 2018

¿Bug en WordPress al poner título php: // input?

Introducción

Ya van 2 veces que me pasa esto, pero no entiendo la razón. Lo que pasa es muy raro: escribo php://input en el título, y al dar click en vista previa me sale el error 403. Bueno, de hecho me sale el 404 pero es porque no encontró el 403.

Descripción del problema

Lo he probado en 2 sitios (es decir, 2 instalaciones de WordPress) que tengo en el mismo servidor. No sé si sea mi servidor o WordPress, pero esto pasa:

Agregar entrada con título que contiene php://input

Agregar entrada con título que contiene php://input

Ahí pongo el título tal y como se ve. Al hacer click en Vista previa, esto se muestra:

Error al cargar vista previa

Error al cargar vista previa

Ni idea de lo que pueda ser, pero lo documento aquí por si alguien algún día sabe la razón de esto. Yo supongo que no debe haber una razón específica, ya que el título debería ser validado y “curado” pero al menos saldría una advertencia, y esto hace que no salga nada.

Por cierto, cuando lo pongo separado de las dos diagonales, no pasa nada. Es decir…

php://input => malo

php // input => bueno

Acceder a php // input en PHP con CodeIgniter

Introducción

No sé si sólo yo lo hago, pero cuando es necesario mandar datos complejos (no simples formularios) podemos utilizar JSON para serializarlos y luego hacer el proceso inverso del otro lado.

Pero del otro lado no leeremos a $_POST sino al stream php://input. En php puro lo hacemos con file_get_contents, pero si estamos utilizando un framework, lo tenemos que hacer a su manera.

Hoy veremos cómo obtener datos del stream php://input en CodeIgniter.

Leer php://input con la propiedad raw_input_stream

Es muy, muy fácil. Simplemente accedemos a la propiedad raw_input_stream de input. Y con eso tenemos. Así se hace:

Con eso ya podemos des-serializarlos. En mi caso, utilizo JSON, así que llamaría a la función json_decode y listo, tendría los objetos/arreglos tal y como los mandé del lado del cliente.

La ventaja que ofrece este método es que, según la documentación, podemos leerlo en cualquier momento; ya que php://input sólo puede ser leído una vez.