Hacer una "lista negra" de Referers.

zcriptz Seguir

1
Ómicron
Programador
Verificación en dos pasos desactivada
Verificado por Whatsapp
Suscripción a IA
Desde
26 Mar 2013
Mensajes
4.622
PHP:
<?php
$host = '';
$blackList = array(      //SIN WWW
    'google.com',
    'youtube.com'
);

if(isset($_SERVER['HTTP_REFERER']))
    $host = str_replace('www.', '', parse_url($_SERVER['HTTP_REFERER'])['host'])
;

if($host != '' && !empty(array_search($host, $blackList)))
    echo "$host est&aacute; en la lista negra"
;else
    echo "$host no est&aacute; en la lista negra"
;

Si no hay referer dice que no está en la lista.

Espero te sirva @eddddd

Es un código simple, base para ir aprendiendo.

PD: Que se llame lista negra (blacklist) no significa que haya que detectarlas para algo "malo".
 
Última edición:
U

Usuario eliminado 8086

PHP:
<?php

$blackList = array(      //SIN WWW
    'google.com',
    'youtube.com'
);

if($_SERVER['HTTP_REFERER'])
    $host = str_replace('www.', '', parse_url($_SERVER['HTTP_REFERER'])['host']);
;

if($host && array_search($host, $blackList))
    echo "$host est&aacute; en la lista negra"
;else
    echo "$host no est&aacute; en la lista negra"
;

Si no hay referer dice que no est&aacute; en la lista.

Espero te sirva @eddddd

PD: Que se llame lista negra (blacklist) no significa que haya que detectarlas para algo "malo".


Tiene ; de mas y salto de linea en otros ; , dejo la forma correcta de ese código

PHP:
<?php

$blackList = array(      //SIN WWW
    'google.com',
    'youtube.com'
);

if(isset($_SERVER['HTTP_REFERER']))
    $host = str_replace('www.', '', parse_url($_SERVER['HTTP_REFERER'])['host']);

if(isset($host) && array_search($host, $blackList))
    echo "$host está en la lista negra";
else
    echo "$host no está en la lista negra";
 
Última edición por un moderador:

zcriptz

1
Ómicron
Programador
Verificación en dos pasos desactivada
Verificado por Whatsapp
Suscripción a IA
Desde
26 Mar 2013
Mensajes
4.622
Tiene ; de mas, dejo la forma correcta de ese codigo

PHP:
<?php

$blackList = array(      //SIN WWW
    'google.com',
    'youtube.com'
);

if(isset($_SERVER['HTTP_REFERER']))
    $host = str_replace('www.', '', parse_url($_SERVER['HTTP_REFERER'])['host']);

if(isset($host) && array_search($host, $blackList))
    echo "$host está en la lista negra";
else
    echo "$host no está en la lista negra";

Uy si, se me chispoteó.

Gracias! 👍
 
U

Usuario eliminado 8086

Y aca dejo otro codigo

PHP:
// REFERER BLOCK (VALORES QUE ACEPTA HOSTNAME (sensible a www)(no sensible a mayuscula/minuscula))
// Poner "*" para aceptar todos
// Poner en minuscula
$allow_http_referer = array();
$allow_http_referer[] = 'sub.domain.com';

$config = array();
$config['allow_referer_null'] = true;

function obtener_host($url){
    $host = parse_url($url, PHP_URL_HOST);
    return strtolower($host);
}

function allow_referer(){
        global $allow_http_referer, $config;
        if(!isset($_SERVER['HTTP_REFERER'])) return $config['allow_referer_null'];
        $host_referer = obtener_host($_SERVER['HTTP_REFERER']);
        if(empty($host_referer)) return false;
        //
        if(empty($allow_http_referer) or !is_array($allow_http_referer)) return false;
        foreach($allow_http_referer as $allow_http_referer_i){
            if($allow_http_referer_i == '*') return true;
            if($allow_http_referer_i == $host_referer) return true;
        }
}

// Uso

if(allow_referer()){
echo 'referer aceptado';
}
 
Última edición por un moderador:

zcriptz

1
Ómicron
Programador
Verificación en dos pasos desactivada
Verificado por Whatsapp
Suscripción a IA
Desde
26 Mar 2013
Mensajes
4.622
Tiene ; de mas y salto de linea en otros ; , dejo la forma correcta de ese código

PHP:
<?php

$blackList = array(      //SIN WWW
    'google.com',
    'youtube.com'
);

if(isset($_SERVER['HTTP_REFERER']))
    $host = str_replace('www.', '', parse_url($_SERVER['HTTP_REFERER'])['host']);

if(isset($host) && array_search($host, $blackList))
    echo "$host está en la lista negra";
else
    echo "$host no está en la lista negra";

@marcofbb

¿Por qué el isset? 🤔
 
U

Usuario eliminado 8086

¿Es necesaria en $host entonces?

Depende que tan explicativo quieres ser en el código, ya eso queda a gusto del programador



Sin isset da este error:
1587511034430.png

Codigo ejemplo:
PHP:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

if($_SERVER['HTTP_REFERER']){
    echo 'Hay';
} else {
    echo 'No hay';
}
 

Adjuntos

  • 1587511022732.png
    1587511022732.png
    2,1 KB · Visitas: 33

zcriptz

1
Ómicron
Programador
Verificación en dos pasos desactivada
Verificado por Whatsapp
Suscripción a IA
Desde
26 Mar 2013
Mensajes
4.622
Depende que tan explicativo quieres ser en el código, ya eso queda a gusto del programador



Sin isset da este error:
Ver el archivo adjunto 247464
Codigo ejemplo:
PHP:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

if($_SERVER['HTTP_REFERER']){
    echo 'Hay';
} else {
    echo 'No hay';
}

Si, pensé que era porque también daba Notice pero después me di cuenta que no...

¿Y que opinás de la @?
 

zcriptz

1
Ómicron
Programador
Verificación en dos pasos desactivada
Verificado por Whatsapp
Suscripción a IA
Desde
26 Mar 2013
Mensajes
4.622
El @ debe ser usado con cuidado, siempre es bueno manejar los errores y con @ los estas ignorando

Saludos

Bueno en este caso es solo un Notice.

Supongo que también queda a criterio del programador.
 

zcriptz

1
Ómicron
Programador
Verificación en dos pasos desactivada
Verificado por Whatsapp
Suscripción a IA
Desde
26 Mar 2013
Mensajes
4.622
PHP esta evolucionado y siendo cada vez menos permisivo a la hora de programar para mejorar su optimizacion. Recomiendo no tener ningún error, y resolver todos los errores que te marca PHP a la hora de compilar

A acostumbrarse a usar isset en arrays entonces. 😮

¿Pasa también con objetos, no?
Si ya probé, jaja.
Notice: Undefined property: stdClass::$jaja in /home/asd/public_html/retardTest.php on line 8


_____

Me acabo de dar cuenta que puse est&aacute; en vez de está en el tema, jajajaja o_O
 
Última edición:

Andres128

Iota
Programador
Verificación en dos pasos activada
Desde
17 Feb 2012
Mensajes
2.391
PHP esta evolucionado y siendo cada vez menos permisivo a la hora de programar para mejorar su optimizacion. Recomiendo no tener ningún error, y resolver todos los errores que te marca PHP a la hora de compilar
jejeje de eso me di cuenta hace poco creo que voy por muy buen camino.... además es bueno tener el log de errores vació se ve mas elegante ;) ... Si a mi me gusta usar los dos isset y empty uno verifico que la variable este definida y no este nula y segundo verifico que no este vacía para que quiero comprobar algo vació además evito el error. El referer puede venir vació o nulo si el usuario por ejemplo ingresa al sitio web directamente desde una pestaña nueva o hace un curl sin referer....

En cuanto al tema de los errores un caso por ejemplo digamos que tenemos que borrar un archivo:

unlink($archivo_borrar);

Y en la documentación dice https://www.php.net/manual/es/function.unlink.php dice que existe la posibilidad de que se genere un error por x o y motivo... puede ser del sistema operativo, que el archivo este ocupado por otro recurso o no se por que otro... Se generará un error de nivel E_WARNING si se produce un error.

Lo más común seria primero entonces verificar que el archivo existe con file_exists pero también en la documentación https://www.php.net/manual/es/function.file-exists.php nos dice... En caso de fallo, se emite un E_WARNING.

Aun así mirando el la documentación https://www.php.net/manual/es/errorfunc.constants.php ese E_WARNING

E_WARNING - Advertencias en tiempo de ejecución (errores no fatales). La ejecución del script no se interrumpe.


En este caso es algo que no controlamos puede generarse un error en cualquier momento y pues creo que se mostraría en el log, aun así es poco probable que ocurra pero puede pasar cuando hay concurrencia...

Lo del arroba @ según leo ignora los errores, no los imprime pero están presentes es bueno saber que pasa para aprender...

Finalmente como conclusión con esto de la concurrencia lo aprendí alguna vez que necesitaba un sistema de cache y encontré este:

El lió inicialmente fue que al existir muchos procesos en concurrencia al leer o guardar una clave se generaban datos corruptos

Pueden ver los test que hicieron en la carpeta: legacy-tests

Y aquí pueden leer todo el proceso realizado es impresionante: https://www.logicaalternativa.com/p...ento-sobre-cache-y-simple-cache-en-php-y-mas/

La solución la encontraron de esta forma ingresen a Cache/Cache.php en la función put(

PHP:
public static function put($key, $content, $raw = false)
    {
        $dest_file_name = self::getRoute($key);

        /** Use a unique temporary filename to make writes atomic with rewrite */
        $temp_file_name = str_replace(".php", uniqid("-", true).".php", $dest_file_name);

        $ret = @file_put_contents($temp_file_name, $raw ? $content : serialize($content));

        if ($ret === false) {
            @unlink($temp_file_name);
            return false;
        }

        return @rename($temp_file_name, $dest_file_name);
    }

Mirando en la documentación me llamo la atención la función rename https://www.php.net/manual/en/function.rename.php

Un comentario dice Note, that on Unix, a rename is a beautiful way of getting atomic updates to files


Buscando en wikipedia:

Una operación atómica es una operación en la que un procesador puede simultáneamente leer una ubicación y escribirla en la misma operación del bus. Esto previene que cualquier otro procesador o dispositivo de E/S escriba o lea la memoria hasta que la operación se haya completado.

El término atómico implica la indivisibilidad e irreductibilidad del proceso, ya que éste debe realizarse en su totalidad o en caso de ser interrumpido poder deshacer sus acciones de modo que fuese como si no se hubiese realizado acción alguna.

Fantástica solución!!!

Me pregunto si W3 Total Cache y otros sistemas de cache de archivos tienen implementado esto, la verdad no lo se pero es muy interesante pues a la final lo más importante son los usuario que nos dan el dinero y no me gustaría que alguno se le impriman datos erróneos o vacíos...

Creo que me perdí un poco del tema principal...

Estos errores creo que se podrían generar en muchas funciones unlink, file_put_contents...
 
Última edición:
U

Usuario eliminado 8086

jejeje de eso me di cuenta hace poco creo que voy por muy buen camino.... además es bueno tener el log de errores vació se ve mas elegante ;) ... Si a mi me gusta usar los dos isset y empty uno verifico que la variable este definida y no este nula y segundo verifico que no este vacía para que quiero comprobar algo vació además evito el error. El referer puede venir vació o nulo si el usuario por ejemplo ingresa al sitio web directamente desde una pestaña nueva o hace un curl sin referer....

En cuanto al tema de los errores un caso por ejemplo digamos que tenemos que borrar un archivo:

unlink($archivo_borrar);

Y en la documentación dice https://www.php.net/manual/es/function.unlink.php dice que existe la posibilidad de que se genere un error por x o y motivo... puede ser del sistema operativo, que el archivo este ocupado por otro recurso o no se por que otro... Se generará un error de nivel E_WARNING si se produce un error.

Lo más común seria primero entonces verificar que el archivo existe con file_exists pero también en la documentación https://www.php.net/manual/es/function.file-exists.php nos dice... En caso de fallo, se emite un E_WARNING.

Aun así mirando el la documentación https://www.php.net/manual/es/errorfunc.constants.php ese E_WARNING

E_WARNING - Advertencias en tiempo de ejecución (errores no fatales). La ejecución del script no se interrumpe.


En este caso es algo que no controlamos puede generarse un error en cualquier momento y pues creo que se mostraría en el log, aun así es poco probable que ocurra pero puede pasar cuando hay concurrencia...

Lo del arroba @ según leo ignora los errores, no los imprime pero están presentes es bueno saber que pasa para aprender...

Finalmente como conclusión con esto de la concurrencia lo aprendí alguna vez que necesitaba un sistema de cache y encontré este:

El lió inicialmente fue que al existir muchos procesos en concurrencia al leer o guardar una clave se generaban datos corruptos

Pueden ver los test que hicieron en la carpeta: legacy-tests

Y aquí pueden leer todo el proceso realizado es impresionante: https://www.logicaalternativa.com/p...ento-sobre-cache-y-simple-cache-en-php-y-mas/

La solución la encontraron de esta forma ingresen a Cache/Cache.php en la función put(

PHP:
public static function put($key, $content, $raw = false)
    {
        $dest_file_name = self::getRoute($key);

        /** Use a unique temporary filename to make writes atomic with rewrite */
        $temp_file_name = str_replace(".php", uniqid("-", true).".php", $dest_file_name);

        $ret = @file_put_contents($temp_file_name, $raw ? $content : serialize($content));

        if ($ret === false) {
            @unlink($temp_file_name);
            return false;
        }

        return @rename($temp_file_name, $dest_file_name);
    }

Mirando en la documentación me llamo la atención la función rename https://www.php.net/manual/en/function.rename.php

Un comentario dice Note, that on Unix, a rename is a beautiful way of getting atomic updates to files


Buscando en wikipedia:

Una operación atómica es una operación en la que un procesador puede simultáneamente leer una ubicación y escribirla en la misma operación del bus. Esto previene que cualquier otro procesador o dispositivo de E/S escriba o lea la memoria hasta que la operación se haya completado.

El término atómico implica la indivisibilidad e irreductibilidad del proceso, ya que éste debe realizarse en su totalidad o en caso de ser interrumpido poder deshacer sus acciones de modo que fuese como si no se hubiese realizado acción alguna.

Fantástica solución!!!

Me pregunto si W3 Total Cache y otros sistemas de cache de archivos tienen implementado esto, la verdad no lo se pero es muy interesante pues a la final lo más importante son los usuario que nos dan el dinero y no me gustaría que alguno se le impriman datos erróneos o vacíos...

Creo que me perdí un poco del tema principal...

Estos errores creo que se podrían generar en muchas funciones unlink, file_put_contents...

Lo que comentas de errores en la carga de cache en la concurrencia se soluciona con semáforos


Saludos
 

¡Regístrate y comienza a ganar!

Beneficios

  • Gana dinero por participar
  • Gana dinero por recomendarnos
  • Descubre ofertas de empleo diariamente
  • Negocios seguros
  • ¡Información premium y más!

Acceder

¿Ya tienes una cuenta? Accede aquí

Arriba