zcriptz
1
Ómicron
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
Suscripción a IA
<?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á en la lista negra"
;else
echo "$host no está en la lista negra"
;
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á en la lista negra" ;else echo "$host no está en la lista negra" ;
Si no hay referer dice que no está en la lista.
Espero te sirva @eddddd
PD: Que se llame lista negra (blacklist) no significa que haya que detectarlas para algo "malo".
<?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";
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";
// 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';
}
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";
PHP: isset - Manual
PHP is a popular general-purpose scripting language that powers everything from your blog to the most popular websites in the world.www.php.net
Ya se como funciona, pero en que me equivoqué?
En caso de que no exista referer, te va a dar un error level NOTICE
Saludos
¿Es necesaria en $host entonces?
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
if($_SERVER['HTTP_REFERER']){
echo 'Hay';
} else {
echo 'No hay';
}
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'; }
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.
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
Notice: Undefined property: stdClass::$jaja in /home/asd/public_html/retardTest.php on line 8
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....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
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);
}
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:
GitHub - emilio/php-cache: Caché simple basada en archivos para PHP | Simple PHP file cache
Caché simple basada en archivos para PHP | Simple PHP file cache - emilio/php-cachegithub.com
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
Is rename() atomic?
I am not being able to check this via experiments and could not gather it from the man pages as well. Say I have two processes, one moving(rename) file1 from directory1 to directory2. Say the otherstackoverflow.com
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...
Si lo recuerdo en los manejos de hilos en c#Lo que comentas de errores en la carga de cache en la concurrencia se soluciona con semáforos
Saludos
Utilizamos cookies y tecnologías similares para los siguientes fines:
¿Aceptas las cookies y estas tecnologías?
Utilizamos cookies y tecnologías similares para los siguientes fines:
¿Aceptas las cookies y estas tecnologías?