En PHP / CodeIgniter, ¿cuál es la mejor manera de verificar si los datos de publicación HTML son lo que espera (si el usuario ha manipulado los valores HTML)?

tl; dr: lea sobre las técnicas de protección de falsificación de solicitudes entre sitios (CSRF) , por ejemplo, en el sitio web de OWASP: Hoja de trucos de prevención de falsificación de solicitudes entre sitios (CSRF)

Tenga en cuenta que para su aplicación web , las solicitudes POST iniciadas mediante el envío de un formulario en el navegador web y mediante el uso manual de CURL en la consola, los sockets HTTP en otro servidor o una llamada AJAX desde otra página web no se pueden distinguir . Esto es por diseño .

Si desea asegurarse de que la solicitud POST se inicia desde el formulario específico en su sitio web, la protección tradicional es el token de protección CSRF . Cuando el navegador solicita la página con un formulario web, antes de representar su HTML, genere una cadena única, agréguela al formulario en el campo oculto y recuerde su valor. Después de recibir los datos enviados, verifique que se pasó el token y que su valor es el que recordaba. Puede pasar el token en cookies y / o encabezados, si no desea utilizar campos de formulario ocultos por algún motivo.

De esta manera, será mucho más difícil hacer esa solicitud POST utilizando cualquier software de cliente que no sea la página web con el formulario. Sin embargo, no piense que es una defensa del 100%, ya que un experto en pruebas de penetración puede imitar el navegador real sin muchos problemas utilizando otros medios de automatización, y no tiene la posibilidad de evitarlo por completo.

Gracias por A2A!

No conozco PHP y CodeIgniter, pero el principio general es: no confíes en nada enviado por el cliente

Escapa de todo, usa transformaciones, busca inyecciones, asume que lo que se envía tiene la intención de piratear o romper algo .

Es bueno que estés pensando en estas preguntas de seguridad como nuevo desarrollador.

Lo primero que hay que decir es que un enfoque RESTful típico de la estructura del sitio web no sería incluir estos ID como campos de entrada, sino incluirlos en la URL que se publicará. Por ejemplo, http://mysite.com/users/5/posts/5 . Pero esto es aparte de su problema de seguridad porque otro desarrollador web aún podría entrar, cambiar la url a la que va y meterse con los registros de otro usuario. Asumiré que no está buscando revisar todo el funcionamiento de su sitio, así que hablemos en relación con su enfoque actual.

Para empezar, puede configurar estos campos de ID para que estén ocultos. Esto detendrá el juego accidental y casual con él.

Y luego, para el problema real, no hay forma de evitarlo: para mantenerlo seguro, debe proporcionar a su sitio un sistema de autenticación de inicio de sesión como CodeIgniter 3 Authentication – Community Auth. Una vez que haya hecho esto, no necesitará enviar la ID de usuario al navegador y volverla a ver porque ya sabrá la ID del usuario que inició sesión. En cuanto a la ID del proyecto, no es un problema si alguien cambia manualmente la ID a otro proyecto de su propiedad. Para proteger los que no poseen, sí, debe ejecutar esa verificación y enviar un error 403: prohibido o 404: no encontrado si intentan actualizar uno al que no tienen acceso.