checkdnsrr - php async http request
¿Qué tan seguro es HTTP_ORIGIN? (6)
HTTP es un protocolo de texto plano. La estructura de cuerpo / encabezado de TODA la solicitud se puede falsificar para decir lo que quieras.
Quiero saber si una llamada HTTP_REQUEST entrante de un sitio web de un tercero proviene de la lista de dominios que definí.
Sé que HTTP_REFERER se puede usar para averiguar dónde está el dominio de terceros, pero no es lo suficientemente seguro. La gente puede falsificarlo o usar Telnet para falsificarlo.
Entonces, ¿qué hay de HTTP_ORIGIN? ¿Se envía desde todos los navegadores? ¿Es seguro?
Además, ¿pueden las personas falsificar el REMOTE_ADDR en una llamada HTTP_REQUEST?
HTTP_ORIGIN es una forma de protegerse contra solicitudes CSRF (falsificación de solicitud entre sitios). Actualmente está implementado solo por Chrome (a partir de noviembre de 2011). Probé Firefox y Opera, pero fallaron. Su nombre en el encabezado de la solicitud es "Origen". En el lado del servidor en mi script php lo veo como "HTTP_ORIGIN" en la variable $ _SERVER. Este encabezado se envía solo en algunos casos, cuando se requiere protección contra CSRF (solo POST debería ser suficiente). Aquí está la lista de todas las solicitudes, estén configuradas o no:
https://wiki.mozilla.org/Security/Origin
Etiqueta de anclaje - NO
Navegación por la ventana - NO
IMG - NO
iframe, incrustar, applet - SI
Formulario (GET y POST) - SI
SCRIPT - SI
hojas de estilo - NO
cargas dependientes de hojas de estilo - NO
Redirecciones - SI
XHR - SI
El encabezado de origen se implementa solo en Chrome, por desgracia. Se anunció por primera vez en enero de 2010 en el blog de Google Chrome:
http://blog.chromium.org/2010/01/security-in-depth-new-security-features.html
Protección CSRF a través del encabezado de origen
El encabezado Origin es una nueva característica de HTML5 que lo ayuda a defender su sitio contra ataques de falsificación de solicitudes entre sitios (CSRF). En un ataque CSRF, un sitio web malicioso, por ejemplo, attacker.com, le indica al navegador del usuario que envíe una solicitud HTTP a un servidor de destino, por ejemplo example.com, que confunde al servidor example.com para que realice alguna acción. Por ejemplo, si example.com es un proveedor de correo web, el ataque CSRF podría engañar a example.com para que reenvíe un mensaje de correo electrónico al atacante.
El encabezado Origin ayuda a los sitios a defenderse de los ataques CSRF al identificar qué sitio web generó la solicitud. En el ejemplo anterior, example.com puede ver que la solicitud provino del sitio web malicioso porque el encabezado Origin contiene el valor http://attacker.com . Para usar el encabezado de origen como una defensa CSRF, un sitio debe modificar el estado solo en respuesta a solicitudes que (1) carecen de un encabezado de origen o (2) tienen un encabezado de origen con un valor en lista blanca.
Solo estoy implementando la protección CSRF en mi script php, personalmente uso Chrome, por lo que es suficiente para mí, espero que otros navegadores detecten Chrome pronto.
Lo que es divertido, es que Mozilla inventó esa característica de seguridad, ya que puedes leer mucha documentación del encabezado de Origin en su sitio web, pero aún no tuvieron tiempo de implementarlo ;-)
HTTP_ORIGIN parece contener solo "protocolo" y "dominio", sin barra diagonal al final: " http://www.example.com ", incluso si envió el formulario desde " http://www.example.com/myform/ ".
Una protección simple contra CSRF en script PHP:
if ("POST" == $_SERVER["REQUEST_METHOD"]) {
if (isset($_SERVER["HTTP_ORIGIN"])) {
$address = "http://".$_SERVER["SERVER_NAME"];
if (strpos($address, $_SERVER["HTTP_ORIGIN"]) !== 0) {
exit("CSRF protection in POST request: detected invalid Origin header: ".$_SERVER["HTTP_ORIGIN"]);
}
}
}
Esta secuencia de comandos aún se puede actualizar para que sea compatible con el PUERTO que no sea 80 (Origin contiene el puerto cuando es diferente de 80), conexiones HTTPS y envío de formularios de diferentes subdominios (por ejemplo, sub.example.com => enviando la solicitud a www.example .com).
La gente aquí está pensando que todo está mal, el estándar ''CORS'' no es para que el servidor no sea pirateado, incluso si ayuda eso además de lo que hace. El propósito es permitir que ''THE BROWSER'' tenga una forma de facilitar las solicitudes que van en contra de la misma política de origen. Si el cliente y el servidor están en la misma página, el "CLIENTE" puede decidir si permite o no la solicitud.
Obviamente, al hacer que el servidor participe en la decisión, usted está ayudando en el proceso de seguridad.
Pero no protegerá al servidor del acceso no autorizado, para eso están las contraseñas y las cookies.
El cliente puede ser (como alguien mencionó) una herramienta de telnet, donde todo lo hecho a mano es falso.
Pero uno de los puntos de venta de Chrome, y FF, etc., es que lo ayudarán a evitar que Javascript salga del mismo entorno de origen, lo que significa que, de forma predeterminada, lo único que se puede comprometer es lo que está en el '' Sitio web propio de los atacantes. U otros sitios que decidan no ser seguros.
CORS es la tecnología que le permite decir: hey, quiero que los usuarios puedan consumir mi servicio elegante desde el javascript en este otro sitio que usan. Así que voy a agregar este sitio a mis excepciones. Lo que significa que está ayudando a sus usuarios autorizados a abrir un agujero en la seguridad de su navegador para ese sitio en particular. Lo que significa un agujero que un hacker puede explotar. Por lo tanto el cuidado con el que configuras el servicio, ¿verdad?
Esto significa que cualquier sitio que no tenga la configuración de CORS está protegido de forma predeterminada desde Cross Site Scripting desde un navegador compatible (salvo los errores y hacks, por supuesto). El navegador preguntará si este servicio desea participar en el javascript del sitio de origen, y si el sitio cruzado dice "No sé nada acerca de este maldito sitio", entonces el motor de javascript del navegador cerrará la conexión y descargará los datos.
Así que, para resumir, CORS no te ayuda a proteger las cosas. Le ayuda a hacer un hueco en la capacidad de su navegador para hacer que un usuario sea más seguro. Pero esperemos que de una manera administrada .. y solo para sitios particulares ..
HTTP_ORIGIN
no es enviado por todos los navegadores ni es seguro.
Nada de lo enviado por el navegador puede ser considerado seguro.
Actualizado:
function isOriginAllowed($incomingOrigin, $allowOrigin)
{
$pattern = ''/^http:////([/w_-]+/.)*'' . $allowOrigin . ''$/'';
$allow = preg_match($pattern, $incomingOrigin);
if ($allow)
{
return true;
}
else
{
return false;
}
}
$incomingOrigin = array_key_exists(''HTTP_ORIGIN'', $_SERVER) ? $_SERVER[''HTTP_ORIGIN''] : NULL;
$allowOrigin = $_SERVER[''HTTP_HOST''];
if ($incomingOrigin !== null && isOriginAllowed($incomingOrigin, $allowOrigin))
{
exit("CSRF protection in POST request: detected invalid Origin header: " . $incomingOrigin);
}
Ejemplo:
- http: // media.mydomain.com VERDADERO
- http: // offline.mydomain.com VERDADERO
- http: // domen1.mydomain.com VERDADERO
- http: // domen_1.mydomain.com VERDADERO
- http: // domen-1.mydomain.com VERDADERO
- http: // ololomydomain.com FALSE
- http: // mydomain.com VERDADERO
- http: // pro.mydomain.com VERDADERO
- http: // super.pro.mydomain.com TRUE
- http: // super.pro.fakemydomain.com FALSE
- http: // pro.fakemydomain.com FALSE
Todo en la solicitud HTTP puede ser falsificado.