Datos de la forma exacta.

He estado buscando mucho en Google pero todavía no tengo una respuesta, así que decidí hacer esta pregunta aquí: ¿Hay alguna forma en PHP de verificar que los datos que recibo en algún script sean del formulario específico en la página? Estoy preguntando porque todos pueden ver el nombre del script que estoy usando para guardar los datos en mi base de datos, por lo que si alguien puede averiguar la URL completa, también puede enviar algunos datos falsos al script y necesito una condición, que el proceso de guardado se active solo cuando los datos provienen del formulario adecuado en mi página.

Estoy usando jQuery para llamar a la función AJAX, así que básicamente si hago clic en el botón “enviar”, se activa el método $ .POST () para llamar al script para guardar los datos.

Gracias tomas

Use fichas para verificar si la solicitud es válida

Siempre puede agregar algún tipo de token de seguridad al enviar datos:

Los tokens pueden extenderse fácilmente para muchos usos diferentes y cubren un área amplia cuando se trata de verificar si alguna solicitud es válida, por ejemplo, podría dejar abiertos sus formularios no críticos para el público, pedir a los usuarios que obtengan sus claves secretas de alguna página ( forzándolos para abrir esa página ) y luego usar esas teclas para identificarlas al enviar datos.

Por supuesto, todo esto puede ser completamente transparente para el usuario, ya que puede proporcionar claves de la página principal a través de cookies ( o cookies de sesión, no importa aquí, ni más ni menos seguridad, ya que las claves del servidor deben cambiar después de su uso e invalidar dentro de un tiempo específico). cuando cambia la identidad del usuario ).
En este ejemplo de uso, solo el usuario que abrió la primera página puede enviar datos al servidor.

Otro caso es cuando las cookies se regalan en la misma página que contiene un formulario para enviar datos al servidor. Cada usuario que abra una página tendrá sus claves para enviar datos de inmediato, sin embargo, si alguien intenta realizar una solicitud desde el exterior, fallará.
Ver OWASP Cross Site Request Forgery
y codinghorror.com Blog CSRF y Usted

¿Solo con AJAX?

Aquí está mi respuesta a otra pregunta, esta respuesta cubre diferentes métodos para insertar datos adicionales en la solicitud de ajax: Liftweb: cree un formulario que pueda enviarse tradicionalmente y con AJAX (vea más detenidamente

$.ajax({ ... data: /* here */ ... 

Actualmente estoy usando tokens de esta manera:

Formulario utilizado para presentar

Esta entrada oculta se puede agregar al formulario, no es un requisito, ya que puede usar los métodos descritos anteriormente en otra respuesta .

  

Función generateFormId ()

Simplemente genere una cadena aleatoria y guárdela en el almacenamiento de la sesión

 function generateFormId() { // Insert some random string: base64_encode is not really needed here $_SESSION['FORM_ID'] = 'FormID'.base64_encode( uniqid() ); // If you want longer random string mixed with some other method just add them: //$_SESSION['FORM_ID'] = 'FormID'.base64_encode( crypt(uniqid()).uniqid('',true) ); return $_SESSION['FORM_ID']; } 

Procesando los datos del formulario enviado

 if (!isset($_SESSION['FORM_ID']) || $_SESSION['FORM_ID'] != $_POST['formid']) { // You can use these if you want to redirect user back to form, preserving values: //$_SESSION['RELOAD_POST'] = $_POST; //$_SESSION['RELOAD_ID'] = uniqid('re'); echo 'Form expired, cannot submit values.'; //echo 'Go back and try again'; exit(1); // <== Stop processing in case of error. } 

Si necesita comprobar qué formulario está enviando los datos

Luego, simplemente puede agregar un prefijo al generar ID y verificar ese prefijo al procesar los datos del formulario.

Este es el caso cuando un script php trata con muchas formas diferentes.


Recuerde que la única respuesta definitiva para prevenir a los usuarios malvados es desconectar todos los cables de su servidor ...

Este es un tema interesante, pero le falta un punto importante: un robot de spam / mal usuario también puede bombardear su base de datos utilizando esa página de formulario específica (!).

Entonces, la pregunta no es cómo verificar si la solicitud proviene de esa página o no, la pregunta es cómo verificar si es un usuario regular o un robot / spammer / bot.

Hazlo con un captcha, como http://www.recaptcha.net

En caso de que malinterprete un poco la pregunta: si desea asegurarse de que la solicitud proviene de un usuario “real”, tendrá que trabajar con un sistema de inicio de sesión / sistema de usuario y verificar la ID / contraseña del usuario (a través de db o sesiones) cada Tiempo que desea hacer una solicitud de db.

Puede verificar que la página se está solicitando a través de AJAX y verifique esto:

 strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest' 

También puedes consultar el HTTP_REFERER .

Pero parece que está tratando de proteger una página que procesa datos vulnerables. Esto requiere algo más que las dos cosas anteriores. Recomiendo googlear ‘CSRF Forgery’ para obtener más información sobre esto.

Estos son algo que deberías echar un vistazo.

  1. Capthcas.
  2. Verificación de referencia.
  3. Utilice POST que GET. [Still Curl puede automatizarlo.]