
As of #codechange hemos implementado, cada día, mejoras en MYETV seguridad; primer trabajo fue el servicio de autenticación explicado en el#security capítulo y luego hemos refinado las capacidades de los desarrolladores para crear seguridad exclusiva para nuestro sitio web. Los desarrolladores hicieron una actualización cada vez que encontramos algún tipo de vulnerabilidades; esto es extremadamente útil para hacer que el algoritmo se fije en la mosca, este es el momento de enfocarnos en cómo hemos asegurado páginas cliente-side que deben comunicarse con el lado del servidor (como llamadas ajax y actualizaciones post/get). De hecho, hemos dividido las dos operaciones: GET (datos enviados por consultas) y POST (datos enviados por un formulario).
En el primer caso (GET) el usuario debe seguir estos puntos para solicitar con éxito la página:
- Authenticate (cuando lo solicite)
- Control de encabezado para estar seguro de que se llama sólo a través de Javascript
- I/O guarda en un lugar seguro del disco duro el timetamp y las informaciones sobre el usuario, aplastado con SHA512; cada vez que se solicita una página cliente-side el sistema puede contar la fecha y cuántas veces se solicita la página en un período específico de tiempo; usted podría ser prohibido temporalmente si solicita la página demasiado tiempo en un período especificado de segundos
- Un token generalmente enviado por consulta y es el SHA1 o SHA512 (depende de lo mucho más rápido que la solicitud debe ser) hah de la sesión del usuarioID
- Esta ficha debe coincidir con la sesión original del usuario, cuando el usuario haga cualquier solicitud de lado del servidor
- Si el partido de ficha, entonces se le permite hacer una simple solicitud de GET
Como solicitud GET significa cualquier solicitud que no toque bases de datos o I/O de los discos duros y provenga de consultas.
En el segundo caso (POST) el usuario debe seguir estos puntos para solicitar con éxito la página:
- Authenticate (cuando lo solicite)
- Control de encabezado para estar seguro de que se llama sólo a través de Javascript
- I/O guarda en un lugar seguro del disco duro el timetamp y las informaciones sobre el usuario, aplastado con SHA512; cada vez que se solicita una página cliente-side el sistema puede contar la fecha y cuántas veces se solicita la página en un período específico de tiempo; usted podría ser prohibido temporalmente si solicita la página demasiado tiempo en un período especificado de segundos
- Un primer token generalmente enviado por GET (querystring) y es el hash SHA1 o SHA512 de la sesión del usuarioID
- Un segundo token enviado por POST (form) y es la cripta aes256 del hash con SHA1 o SHA512 (depende de lo mucho más rápido que debe ser la solicitud) de la sesiónID del usuario, más información adicional como fecha y otros (criptado sólo con aes256 y paquete con toda la solicitud)
- Estas dos fichas deben coincidir con el sesiónID original del usuario, y las informaciones adicionales se descifran
- Si el partido de ficha, entonces se le permite hacer una simple solicitud de GET
- Con la fecha previamente codificada podemos controlar la interacción de los usuarios cada segundo y podemos aprobar o no ciertas acciones limitándolas con el tiempo
- Cuando todo se desembolsa con éxito (tokens e información adicional), sólo necesita un par de segundos para hacer una solicitud de servidor normal y entonces este acceso será obfuso para el futuro
Como solicitud POST significa cualquier solicitud que viene por un formulario y/o toque cualquier base de datos o I/O de los discos duros.
Control de cabeceras del lado del servidor:
//Restrict access ajax sólo ...
define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) " sensible strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
si (!IS_AJAX) {
die('Acceso restringido');
}
$pos = strpos($_SERVER['HTTP_REFERER'],getenv('HTTP_HOST'));
si($pos====false){
die('Acceso restringido');
}Este es un código del lado del servidor (PHP) le dará una idea sobre cómo se verifican los encabezados; esto es una seguridad adicional pero los encabezados pueden ser picados fácilmente para que podamos implementar otra capa de seguridad como abajo.
Control de disco duro I/O
// número de solicitudes de página permitidas para el usuario
define("CONTROL_MAX_REQUESclientside", 1);
// intervalo de tiempo para comenzar a contar solicitudes de página (segundos)
define("CONTROL_REQ_TIMEOUTclientside", 1);
// segundos para castigar al usuario que ha excedido en hacer solicitudes
define("CONTROL_BAN_TIMEclientside", 10);
//usuario IP
if(empty($_SERVER["REMOTE_ADDR]):
define("USER_IPclientside", sanitizeUSERIPclientside(hash('sha512','clientside'.session_id()))));
más:
definir("USER_IPclientside", sanitizeUSERIPclientside(hash('sha512', 'clientside'.$_SERVER["REMOTE_ADDR])));
endif;
// directorio de escritura para mantener los datos del script reemplazar "[directory]" con una carpeta segura en el disco duro
define("SCRIPT_TMP_DIRclientside", "[directory]");
define("CONTROL_DBclientside", "[directory2]");
define("CONTROL_LOCK_DIRclientside", "[directory3]");
define("CONTROL_LOCK_FILEclientside", "[directory4]".sanitizeUSERIPclientside(hash('sha512', USER_IPclientside)));
@mkdir(CONTROL_LOCK_DIRclientside);
@mkdir(SCRIPT_TMP_DIRclientside);
//Mostrar el error si existe algún error
(file_exists(CONTROL_LOCK_FILEclientside)) {}
si (time()-filemtime(CONTROL_LOCK_FILEclientside)
// este usuario ha completado su castigo
unlink(CONTROL_LOCK_FILEclientside);
Si no
// demasiadas solicitudes
eco "Demasiadas peticiones";
touch(CONTROL_LOCK_FILEclientside);
morir;
}
}
función antiflood_countaccessCLIENTSIDE() {}
// Contando solicitudes y última vez de acceso
$control = Array();
si (file_exists(CONTROL_DBclientside)) {}
$fh = fopen(CONTROL_DBclientside, "r");
$control = array_merge($control, (array)unserialize(fread($fh, filesize(CONTROL_DBclientside))));
fclose($fh);
}
si (isset($control[USER_IPclientside])) {}
si (time()-$control[USER_IPclientside] ["t"]
$control[USER_IPclientside]["c"]++;
Si no
$control[USER_IPclientside] ["c"] = 1;
}
Si no
$control[USER_IPclientside] ["c"] = 1;
}
$control[USER_IPclientside] ["t"] = tiempo();
si ($control[USER_IPclientside] ["c"] CONTROL_MAX_REQUESclientside) {
// este usuario hizo demasiadas peticiones dentro de un período muy corto de tiempo
$fh = fopen(CONTROL_LOCK_FILEclientside, "w");
fwrite($fh, USER_IPclientside);
fclose($fh);
}
// escribir tabla de control actualizada
$fh = fopen(CONTROL_DBclientside, "w");
fwrite($fh, serialize($control));
fclose($fh);
}
//sanitizing user IP or sessionID for the name of the file to write on disco
función sanitize USERIPclientside($theuserIP) {
//sanitizar el usuario o ID de sesión
$userIP = str_replace(array('[\', \']), '', $theuserIP);
$userIP = preg_replace('/\[.*\]/U', '', $userIP);
$userIP = preg_replace('/ afectadas(amp)?#?[a-z0-9]+;/i', '-', $userIP);
$userIP = htmlentities($userIP, ENT_COMPAT, 'utf-8');
$userIP = preg_replace('/culos([a-z])(acute habituml habitcirc habitgrave WordPresscedil habitslash habittilde habitcaron imperlig socorresquo);/i', '\1', $userIP );
$userIP = preg_replace(array('/[^a-z0-9]/i', '/[-]+/') , '-', $userIP);
retorno strtolower(trim($userIP, '-));
}este es un código de algoritmo lado del servidor (PHP) y escribirá en un lugar seguro de los discos duros el número de veces que se envía la solicitud, el timetamp y algunas informaciones únicas de esta solicitud hashed con SHA512 (como el nombre del archivo); cuando el número de veces superado o el timetamp es diferente del especificado, la solicitud fallará en absoluto y se muestra un error. Este algoritmo es un poco complicado y funciona solo, con el número dado de segundos y las carpetas correctas en el disco duro, sin ninguna otra intervención humana.
Tokens autation
$token1 = urlencode(sha1(session_id())); //con AES256 CRYPT $token2 = AES256CRYPT(sha1(session_id()),"[initialvectorkey]"); / WITHOUT aes 256 CRYPT //$token2 = sha1(session_id());
definimos el valor de las fichas en el ejemplo anterior.
id="nombre de esta forma" nombre="nombre de esta forma" método="post" Identificar el tipo de entrada="hidden" id="token2" nombre="token2" valor="¿Se realizó? Php echo $token2 ? / Identificar el tipo="hidden" id="tokentimestamp" nombre="tokentimestamp" valor="¿Seguido? php echo time(); ? id="text" id="ANOTHERVALUE" nombre="ANOTHERVALUE" valor="esto es un valor" / título ■/formulado
Esto arriba es un ejemplo de una solicitud POST; en combinación cuando se despide la solicitud POST, una solicitud GET también se despide (con javascript ajax) con una consulta como esa:
// Descargue la petición a /form.php (no camino real, sólo por ejemplo)
solicitud = $.ajax({
url: "form.php?token1=¿tratado? php echo $token1 ?
tipo: "post",
datos: serializados Datos
});de esta manera los dos tokens son enviados desde el cliente a los scripts lado servidor listos para ser emparejados.
Coincide con las fichas
$token1GETVAR = urldecode($_GET['token1']);
//con AES256 CRYPT
$token2POSTVAR = AES256DECRYPT($_POST['token2'], "[initialvectorkey]");
//sin AES256 CRYPT
//$token2POSTVAR = $_POST['token2'];
$token1PHPVAR = sha1(session_id());
$token2PHPVAR = sha1(session_id());
si($token2POSTVAR!= $token2PHPVAR TENIDO TENIDO $token1GETVAR != token1PHPVAR):
die(' obedeci class="fa fa-exclamation-triangle" título="Error: Acceso restringido. Inténtelo de nuevo más tarde" aria-hidden="true" indica/i Confía');
endif;La página solicitada manejará el emparejamiento de las fichas y descifrará todas las informaciones adicionales para asegurarse de que la solicitud sea de una fuente autorizada (en el código anterior sólo vemos la coincidencia de las fichas).

De esta manera tenemos un completamente personalizado y exclusivo póliza segura para aplicar a todas las solicitudes de fuente no confiada: esto reduce drásticamente los riesgos de XSS u otros ataques similares del lado cliente de fuentes no confiadas. Tenga en cuenta: como para fines de seguridad no podemos revelar el código cripto que encripta y descifra información con AES256; este código reside en un lugar seguro de los discos duros y fuera de la raíz del sitio web. El cifrado/descifrado con AES256 es un práctica adicional para estar seguro de que las informaciones pasadas son confiables.
Esto no será una protección ddos, sino una protección lateral del servidor cuando los datos se envían de una fuente no confiada (como códigos del lado del cliente). Todos los datos se transfieren con ssl 128 bit por lo que las transferencias seguras de datos es un trabajo de los navegadores.
Este flujo de seguridad es resultado de años de estudio y aplicación; con este sistema nadie, excepto quién está autorizado a hacerlo por la página anterior, puede acceder a las páginas del lado cliente.
El A.P.I. se construye para el acceso público y sólo implementa una pequeña parte de este sistema de seguridad, a ser alcanzado de todos sin restricciones. A principios de enero de 2018, el “A.P.I. V1” será deprecado y sólo un par de funciones estarán disponibles a través de ellos (no más información de usuarios públicos o información de contenidos públicos); de esta manera los puntos finales públicos se reducirán drásticamente y la información será más segura. Seguiremos desarrollando el MYETV sin ningún endpoint público expuesto.
¡Eso es todo, amigos! Todos sus comentarios son apreciados y gracias a leer eso y hacer MYETV siempre mejor, más rápido y más seguro. Muchas gracias.
¡Hasta pronto, amigos!
