¿Son suficientes las declaraciones preparadas?
PreparedStatements no son suficientes por sí mismos.
Debería revisar su código y preguntarse qué es necesario y qué es posible. Recorra tanto el cliente como el servidor, y vea qué datos se envían, si es posible modificarlos, y qué hace. Mira qué cosas puedes hacer.
No puedo ver el resto de su código, pero a primera vista, este código parece ser vulnerable a múltiples Direct Object Reference exploits. Es posible que esté insertando valores en la base de datos sin verificar si estos valores son válidos, o si deberían modificarse, o si el usuario está incluso autorizado para cambiar esos valores.
INSERT INTO fcomments (poster, lid, post_id, comment, time_stamp)
VALUES(user_id, lid, post_id, comment, timeNow
El hecho de que vincules estas variables no significa que no sean explotables. Probemos un caso de prueba. Hagamos algunos casos de prueba de ajax (supongo que 'lid' es una cantidad de upvote): callAjaxDatabaseUpdate(post_id, lid);
Ahora llamémoslo: callAjaxDatabaseUpdate(25, 100)
;
Esperas que sea exactamente como lo ingresaron, así :
INSERT INTO fcomments (poster, 100, 25, comment, time_stamp)
VALUES(user_id, lid, post_id, comment, timeNow
¿Qué pasa si cambio los datos en tránsito? :(
Preguntas que debes hacerte
Veamos sus parámetros enlazados:
$insertQuery->bindParam(':user_id',$user_id);
$insertQuery->bindParam(':lid',$lid);
$insertQuery->bindParam(':post_id',$post_id);
$insertQuery->bindParam(':comment',$comment);
$insertQuery->bindParam(':timeNow',$timeNow);
¿El usuario debería poder enviar el user_id
? ¿Debería enviarse el lid
? Todo esto parece material que el usuario podría cambiar si lo está enviando a través del cliente.
Digamos que quieres hacer una publicación, ¿verdad? Vamos a hacer una publicación entonces:
postDataToForum(user_id, lid, post_id, comment);
Debido a que sabe quién está conectado en ese momento, puede tomar su user_id
y usarlo para enviar elementos en su declaración de SQL, etc. No es gran cosa, ¿verdad?
Bueno, hay un problema potencial con eso: puedo presionar F11 e ir a la consola del desarrollador y cambiar esos valores, o podría usar un programa como TamperData
para Firefox para averiguar qué se está enviando y luego modificar en tránsito.
Así que esperas esto:
postDataToForum(23, 100, 450, "Hi everyone");
Pero el intruso busca en su lista de usuarios, o incluso utiliza un número aleatorio, y altera los datos:
// user_id = 1 = admin.
postDataToForum(1, 100, 450, "I have altered the input. Pray I do not alter it further.");
Y luego muestra que el administrador ha publicado, en lugar del usuario. Este DOR
exploit podría estar en todas partes en su aplicación web. En el caso de su upvote, el usuario podría haber ingresado "-1", y usted no lo verificó.