php - formulario - enviar json por post jquery
¿Cómo procesar las solicitudes AJAX de forma más segura en PHP? (4)
Ok, entonces quiero enviar solicitudes AJAX a mi sitio web desde mis juegos Flash para procesar datos, pero no quiero que las personas los descarguen, descompilen y luego envíen solicitudes falsas para que se procesen, así que estoy tratando de descubrir el forma más segura de procesar en los archivos PHP. Mi primera idea fue utilizar el módulo de Autorización incorporado de Apache para requerir un nombre de usuario y contraseña para acceder a las páginas en un subdominio separado de mi sitio web, pero luego tendría que incluir ese nombre de usuario y contraseña en la solicitud de AJAX de modo que parezca amable de inútil incluso intentarlo.
Mi opción actual parece bastante prometedora, pero quiero asegurarme de que funcione. Básicamente, solo comprueba la dirección IP que se envía utilizando REMOTE_ADDR para garantizar que sea la dirección IP en la que se ejecuta mi servidor.
<?
$allowed = new Array("64.120.211.89", "64.120.211.90");
if (!in_array($_SERVER[''REMOTE_ADDR''], $allowed)) header("HTTP/1.1 403 Forbidden");
?>
Ambas direcciones IP apuntan a mi servidor. Cosas que me preocupan
1) Si envío una solicitud desde Flash / ActionScript, ¿afectará eso a la dirección IP de alguna manera?
2) ¿Es posible que los usuarios malintencionados cambien la dirección IP que se envía con REMOTE_ADDR a una de mis direcciones IP?
¿Alguna otra forma de sugerir que podría ser más segura?
El REMOTE_ADDR será la dirección del cliente, por lo que no será de ayuda.
Si el cliente puede decodificarlo, podrá emularlo.
Solo espero que nadie esté tan desesperado por obtener un puntaje alto en sus juegos.
Supongo que es más fácil olfatear paquetes que descompilar el flash, por lo que valdría la pena encriptar los datos de alguna manera cuando los envíe.
Realmente he estado pensando en esto. La gente piratea los juegos para obtener el # 1 en el marcador, ¿correcto? Esa es la única razón, ellos quieren estar en la cima. Por lo tanto, he decidido deshacerme por completo del marcador global. Los usuarios, por supuesto, registrarán sus puntajes personales para que puedan competir contra ellos mismos, pero aparte de eso, cada juego simplemente otorgará a los usuarios un premio por realizar alguna tarea específica. De esa manera la puntuación es irrelevante. Ya sea que obtenga 1,000,000 o 1,000, aún obtiene el mismo premio. Esto disuadirá a los piratas informáticos porque sus esfuerzos no tienen sentido. Sí, aún puedo implementar algún tipo de seguridad de nivel inferior al transmitir datos al servidor a través de solicitudes AJAX, pero realmente no parece muy lógico que alguien piratee mi juego solo para obtener un premio que sea exactamente igual a cualquier otro. premio que alguien más ha recibido. Sé que parece que estoy evitando el problema, pero realmente no lo estoy. Me estoy enfrentando al verdadero problema de los hackers y estoy demoliendo su motivación para hackear el juego sin perder el sentido de la competencia. La mayoría de los hackers lo hacen para llamar la atención, para que puedan mirar el marcador y decir: ''Sí, he pirateado el juego para obtener ese puntaje''. Pero si solo tienen un pequeño ícono en su perfil, ¿a quién le va a importar?
ESOS IP son NSFW .
Tenga en cuenta que si alguien descompila su aplicación flash, la vuelve a compilar y luego la vuelve a colocar en su sitio utilizando Firebug o similar, todo su trabajo se desperdicia en la secuencia de pensamiento actual. La mejor forma de evitar el abuso será exigir tokens cifrados de un solo uso que envíe al inicializar el juego flash, y que requieran volver al POST. También deberías usar SSL. Pero incluso eso no detendrá a todos. La seguridad del juego flash es notoriamente difícil.
¡Respuesta concluida después de googlear mucho!
Paso-1: Genere el sistema Token para todos los servicios web:
Generando Token:
<?php
session_start();
$token = md5(rand(1000,9999)); //you can use any encryption
$_SESSION[''token''] = $token; //store it as session variable
?>
Paso 2: Úselo mientras envía una llamada ajax:
var form_data = {
data: $("#data").val(), //your data being sent with ajax
token:''<?php echo $token; ?>'', //used token here.
is_ajax: 1
};
$.ajax({
type: "POST",
url: ''yourajax_url_here'',
data: form_data,
success: function(response)
{
//do further
}
});
Paso 3: AHORA, aseguremos el archivo PHP manejador ajax con,
session_start(); //most of people forget this while copy pasting code ;)
if($_SERVER[''HTTP_X_REQUESTED_WITH''] == ''XMLHttpRequest'') {
//Request identified as ajax request
if(@isset($_SERVER[''HTTP_REFERER'']) && $_SERVER[''HTTP_REFERER'']=="http://yourdomain/ajaxurl")
{
//HTTP_REFERER verification
if($_POST[''token''] == $_SESSION[''token'']) {
//do your ajax task
//don''t forget to use sql injection prevention here.
}
else {
header(''Location: http://yourdomain.com'');
}
}
else {
header(''Location: http://yourdomain.com'');
}
}
else {
header(''Location: http://yourdomain.com'');
}
NOTA: LO SENTIMOS POR NESTED IF..ELSE, PERO AUMENTA LA COMPRENSIÓN. USTED PUEDE SIMPLIFICAR LOS TRES EN UNO SI NO. 85% de seguridad mejorada