2010-01-27 12 views
7

He realizado una votación sobre comentarios como el que tiene este sitio web (algo similar) y estoy un poco preocupado por el uso indebido posible de la solicitud http. Usted sabrá lo que quiero decir después de que te muestro el código cuestionable:Cómo hacer que mi código sea más seguro

$.ajax({ 
    type: 'POST', 
    url: 'http://localhost/comments/vote_down/' + post_id 
}); 

Ahora su todavía en el servidor local, pero se llega a la web con el tiempo. ¿Qué pasa si alguien acaba de hacer algún tipo de secuencia de comandos que will run n times esta url http://localhost/comments/vote_down/post_id.

Ni siquiera la autenticación de usuario es muy útil, simplemente modifica tu secuencia de comandos maliciosa para autenticarte y puedes hacerlo de nuevo. ¿Cómo puedo hacer que esta solicitud sea más segura? ¿Qué puedo hacer? agradecerá

EDITAR

veo algunas respuestas, no los que he estado buscando hasta ahora.

Tal vez estoy esperando demasiado, ¿hay alguna manera en que puedo rechazar esta solicitud directamente a cualquier persona que no sea redirigida desde localhost (o sitio web), después de que x intenta hacerlo?

¿Tal vez algún tipo de autenticación de encabezado? No me gusta mucho esa es la razón principal por la que pregunto.

EDITAR

también lo que he descubierto accidentalmente alrededor de un minuto o así lo hace, Estaba mirando mínimas algunas preguntas similares y mi Firebug estaba en, añadí una pregunta a favoritos .. vio la respuesta posterior de la consola 200 OK luego lo intenté como 10 veces solo para ver cuándo me rechazarán para hacer lo mismo otra vez ... eventualmente me aburrí ... así que si StackOverflow no resolvió eso ... ¿qué estoy tratando de hacer? =)

+1

No es necesario rechazar las solicitudes. Simplemente no debe ejecutar la lógica comercial relacionada con la votación. –

Respuesta

6

Como mínimo, puede asegurarse de que cada usuario solo pueda votar una vez.

  • Si el usuario no ha iniciado sesión, no pase la votación.
  • Si el usuario está conectado, restrinja la votación a un voto por comentario (si pueden cambiar el voto de arriba a abajo o no, depende de usted)
  • Si desea permitir que los usuarios no registrados voten, cierre con cookies y dirección IP y verificación de uso. (Lejos de prueba de balas, pero mantendrá algunos alborotadores a raya)

opciones adicionales:

  • implementar un código de imagen

En respuesta a tu edición:

Si está hablando de buscar una página de referencia válida, no tiene suerte. Eso es increíblemente fácil de falsificar. Puede implementar un control de token donde genere un hash que sea válido por X segundos y denegue todas las solicitudes con un hash no válido o caducado. Sin embargo, esto no impedirá que las personas voten varias veces.

En respuesta a su segunda edición:

Un código de estado de 200 sólo significa que la petición http tuvo éxito, lo que la aplicación lógica decidió que ver con la solicitud es un tema completamente distinto. Puede negar el voto y devolver un 200, al igual que puede devolver un 403 (que probablemente sería más apropiado en este caso).

+0

@Whover downvoted: publicar una razón sería bueno :) –

+0

Pero cada vez que lo hice obtuve el éxito aquí es "{" Success ": true," NewScore ": 2," Message ": null," LastVoteTypeId ": null}" –

+0

Eso no significa que la puntuación fue cambiado, un exitoso vuelve Upvote: { "éxito": true, "NewsCore": 2, "mensaje": "", "LastVoteTypeId": 2} Downvote: { "éxito": true, "NewsCore": 0 "mensaje": "", "LastVoteTypeId": 3} Nada sucede: { "éxito": true, "NewsCore": 1," Mensaje ": nulo," LastVoteTypeId ": nulo} –

0

Creo que necesita hacer un seguimiento de qué usuarios (autenticados) votaron en qué elementos, y permitir que cada usuario vote en cada artículo una sola vez.

0

Haga que el usuario inicie sesión y verifique si lo votaron arriba/abajo antes de lo cual requeriría una tabla de votos para contener un enlace con el usuario, con suerte a través de la ID.

Espero que esto ayude,

3

Usted va a tener que hacer algo más que almacenar el recuento de votos para un puesto de Identificación. Tendrá que guardar un registro para cada elenco de voto individual.

Una vez que su esquema de base está configurado para ello, se puede empezar a asociar información adicional con cada voto - una dirección IP, nombre de usuario, etc.

La mayoría de los sitios sólo permiten a los usuarios autenticados a votar, y sólo permiten un usuario para votar una vez por cualquier identificación postal dada. Stackoverflow va más allá y permite a los usuarios deshacer sus votos y modificarlos.

Si no es aceptable que un usuario sea autenticado antes de que pueda votar, puede ir por la dirección IP y luego reducir el número de votos para poder emitir desde esa IP en algún intervalo. Por ejemplo, una vez que se emite un voto de XXX.XXX.XXX.XXX, no puede votar de nuevo por otros 15 minutos. Esto no afectará Internet a las personas que están detrás de un proxy, pero reducirá la cantidad de juegos que se pueden hacer.

Puede ir aún más lejos y tratar de detectar a alguien que juega en el sistema y luego ponerlos en la lista negra por un tiempo.

+0

- Stackoverfl va más allá de eso y permite a los usuarios deshacer sus votos y reformularlos. Me gusta este ... y estoy intentando hacerlo también –

+1

No puedo recomendar la restricción por dirección IP, ya que bloquearás muchos usuarios legítimos. Las grandes empresas, los parques de oficinas y los rascacielos a menudo NAT a una sola dirección IP, y de hecho los ISP de algunos países enrutan todo el tráfico a través de un servidor proxy que reemplaza la IP con la IP del Proxy. De acuerdo en almacenar un voto en contra de un usuario, parece que la única manera infalible de resolver esto es requiriendo un usuario autenticado. – realworldcoder

0

Puede usar CAPTCHA (recomiendo reCAPTCHA, ya que contribuye a la digitalización de trabajos impresos al mismo tiempo) para eliminar al menos los votos basados ​​en bots. Para evitar múltiples votos humanos, considere contar basándose en un identificador semi único, como la dirección IP más la cadena del agente de usuario del navegador o algo así. O valide el voto basado en la cuenta del usuario (y obviamente ponga un CAPTCHA en su página de registro de usuario).

1

Debe autenticar mediante un token.

Potencialmente, podría imprimir un <img src="http://localhost/comments/vote_down/1"> y comenzar a emitir votos de los usuarios que están accediendo a mi sitio.

Lo que debes hacer es una validación del lado del servidor, digamos que va a validar contra un hash MD5 (md5(1) = c4ca4238a0b923820dcc509a6f75849b)

http://localhost/comments/vote_down/1?hash=c4ca4238a0b923820dcc509a6f75849b 

Ahora en su servidor debe hash de la post_id y comprobar si el hash params coincide, si lo hace, luego permite votar.

Pero entonces todavía podía simplemente mantener la califican de spam de los usuarios sin saber a través de <img src="http://localhost/comments/vote_down/1?hash=c4ca4238a0b923820dcc509a6f75849b">

Lo que usted tiene que hacer es hash tanto el post_id y user_id (de la sesión), que forma una almohadilla de un usuario de won No será lo mismo para otro.

User: 1 
Post_id: 1 
md5(11) = 6512bd43d9caa6e02c990b0a82652dca 

User: 2 
Post_id: 1 
md5(12) = c20ad4d76fe97759aa27a0c99bff6710 

Obviamente, usted debe salar la función hash, pero incluso sin ella, su aplicación va a ser bastante segura de esa manera.

+0

¡Qué buena idea! : D –

+0

No veo lo que esto te lleva a la asociación de una identificación de usuario con un registro de votos. Parece ser una complicación adicional para ninguna funcionalidad adicional. –

+1

Esto aún permite que un único usuario haga una solicitud válida más de una vez. Si establece el valor hash exclusivo por carga de página y expira el hash una vez que se emite el voto, está configurado. – sfrench

1

Espero que esto sirva de alguna manera para ayudar a responder su pregunta. Echa un vistazo a este sitio web: https://panopticlick.eff.org/. Básicamente, lo que hace es tratar de identificarte en función de tus diversas configuraciones de sistema, fuentes instaladas, capacidades del navegador, zona horaria, etc. Lo acabo de enviar a mi oficina y, hasta ahora, todos somos únicos.

Ahora bien, este método no es del todo seguro, porque se puede falsificar toda esta información, simplemente cambiando los datos que se envía al servidor en cada solicitud, pero que tendría que saber que su página web utiliza esta técnica con el fin de nivelar un ataque (seguridad a través de la oscuridad).

Creo que me inclinaría a tener un enfoque de varios niveles para el problema. Como ninguno de los métodos es completamente seguro, todo lo que puedes hacer es apilarlos.

  • No permita que la gente vote a menos que hayan activado las cookies
  • Implementar CAPTCHA para los usuarios que no estén conectados en
  • usuarios del perfil basado en los valores hash de la configuración del sistema instalado (hash de los tipos de letra, capacidades de navegador, zona horaria, etc.)
  • tener un sistema de inicio de sesión para que los usuarios pueden iniciar sesión votar

Ahora, cuando alguien vota, que almacena su identificación de usuario (si se han conectado), sus valores hash del sistema y su co okie en contra de su voto. Esto evitará que los usuarios que hayan iniciado sesión voten, cierren sesión y vuelvan a votar de forma anónima, porque los hash de sus sistemas y las cookies (si no se han molestado en borrarlos) ya estarán vinculados a un voto.

Otra cosa que puede hacer es hacer un tripwire para detectar si la votación de una publicación en particular se está golpeando en una dirección en particular. Si recibe un martillazo (digamos, 20 votos por minuto durante 10 minutos, y un gran porcentaje de esos votos han sido en la misma dirección), trate de perfilar los votos hacia arriba mirando la dirección IP, los hashes del sistema, etc. Basado en un porcentaje arbitrario de posibles aciertos maliciosos, puede bloquear la votación en esa publicación durante 15 minutos.

Ninguno de estos métodos es completamente seguro y, por el simple hecho de ser conciso, he omitido algunas cosas que puede hacer para ampliar fácilmente esta idea. Pero creo que un enfoque de múltiples niveles es clave. Claro, algún día un usuario realmente determinado a quien no le importe resolver captchas todo el día podría encontrar una forma de manipular su sistema, pero mientras tenga registros realmente buenos, podrá perfilar este ataque y responder a él.

Esperanza esto ayuda

Saludos Iain

Cuestiones relacionadas