Publico datos en un archivo PHP. Los datos POST y GET están vacíos, pero php://input muestra perfectamente los datos publicados.
¿Cómo es esto posible? ¿Y qué puedo hacer para comprobar/arreglar esto?
Este es mi código:
const myJSON = JSON.stringify(data); let result = myJSON.replace("[{","{"); result = result.replace("}]","}"); result = result.replace(/},{/g,","); var user = '{{ Auth::user()->name }}'; var l = document.getElementById("languages"); var langcode = l.value; var params = 'user='+user+'&lang='+langcode+'&data='+result; var url = "/public/test.php"; var xhr = new XMLHttpRequest(); xhr.open("POST", url, true); xhr.setRequestHeader('Content-type', 'application/json'); xhr.send(params);Ah, solución:
Cambio:
xhr.setRequestHeader('Content-type', 'application/json');dentro
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=UTF-8');Sé que ha encontrado una solución a su pregunta, pero me gustaría señalar que está haciendo cosas muy peligrosas aquí, que en el mejor de los casos corromperá sus datos y en el peor de los casos hará que su sitio sea vulnerable a la inyección de secuencias de comandos. .
Si no está enviando JSON, entonces no use JSON.stringify y luego manipule la cadena de esa manera. Si los datos contienen esas cadenas que está reemplazando, eso los corromperá, y si esos datos son ingresados por el usuario, permita la inyección de secuencias de comandos.
Supongo que {{ Auth::user()->name }} es un código del lado del servidor. Si el nombre de usuario contiene una comilla o cualquier cosa que no sea una cadena de JavaScript válida, esto romperá el JavaScript y posiblemente permitirá que un usuario malintencionado inyecte el script. Además: ¿Por qué está devolviendo el nombre de usuario en la solicitud? El servidor ya conoce el nombre de usuario. Esto parece que permitiría un uso malicioso para leer o escribir datos pertenecientes a otro usuario, si se manipula la solicitud.
No cree cadenas de consulta como esa usted mismo sin escapar de los datos. Esto rompe su secuencia de comandos si contiene caracteres que no están permitidos en las URL, lo que hace : { y } no son caracteres válidos en las URL. Utilice, por ejemplo, la API URLSearchParams para crear una cadena de consulta con escape adecuado.
Finalmente, no está realmente relacionado con la seguridad, pero la nueva API Fetch es más fácil de usar y más poderosa que la antigua XMLHttpRequest .