/////////////////////////////////////////////////////////
// aves.func.php v 2.2 04-12-2021 11:30:57 erwin Exp $ */
/* AVES */
/* www.aerien.ch */
/* Modifications:
29.6.2026 php 8 problèmes sur Funio : pas de ?>, mysqli_ pas activé sur 8.2
sinon pas grand chose en local, mais quelques incompatibilités ! (get_magic_quotes_gpc() ; erreur si mysqli_query() est faux ; read_exif_data => exif_read_data ; déclaration de fonction n'accepte pas de valeur par défaut avant variable sans valeur par défaut ; variable alphanumerique > 0 ! ;)
stats et légendes conservation (et présence sur pays) sur list.php
IOC 2021
mysqli (rapide)
utf-8 (galère)
php 7 (facile mais un peu laborieux)
IOC/Clements (à réorganiser, base séparée pour correspondances ioc/aves/clements facile à mettre à jour ?)
urls insensible à la casse (sauf répertoires Apache)
page.php accepte ss-espèces et familles de Clements/IOC (même problème que ci-dessus, base séparée ?)
*/
function mysqli_result($result, $row, $field = 0)
{
if ($result === false) return false;
if ($row >= @mysqli_num_rows($result)) return false;
if (is_string($field) && !(strpos($field,".") === false))
{
$t_field = explode(".", $field);
$field = -1;
$t_fields = mysqli_fetch_fields($result);
for ($id = 0; $id < mysqli_num_fields($result); $id++)
{
if ($t_fields[$id]->table == $t_field[0] && $t_fields[$id]->name == $t_field[1])
{
$field = $id;
break;
}
}
if ($field == -1) return false;
}
mysqli_data_seek($result, $row);
$line = mysqli_fetch_array($result);
if (isset($line[$field])) return $line[$field]; else return false;
}
///////////////////////////////////////////////////////
// fonctions //// ALL //// connect() //////////////////
///////////////////////////////////////////////////////
function connect()
{
global $link, $time_start, $nb_queries, $robot_addr;
securite();
// connexion mysql
$time_start = getmicrotime();
// mysqli
if ($link = mysqli_connect($GLOBALS['mysql_server'], $GLOBALS['mysql_user'], $GLOBALS['mysql_password'], $GLOBALS['mysql_db']))
{
mysqli_set_charset($link, "utf8");
$nb_queries = 0;
access();
}
else
{
$goto = "index_db_hs.html";
$err = " Connexion impossible
Le serveur mysql semble hors-service
Réessayez plus tard";
redirect_url($goto, $err, $goto_2 = "", $time = 10);
exit;
}
}
// 23:02 17.12.2013
function securite()
{
global $robot_addr;
$date = date("Y-m-d G-i-s");
$REMOTE_ADDR = $_SERVER['REMOTE_ADDR'];
// 1. test si URL enregistrées sur fichier "ban" (x = 5) pas d'accès, sortie script
$show_ban = file_get_contents ($GLOBALS['file_path_f'].$GLOBALS['admin_path'].'show_ban.txt');
$url_ban = $GLOBALS['file_path_f'].$GLOBALS['ban'];
if ($show_ban != 1 AND $file = fopen("$url_ban", "r"))
{
$fcontents = file( "$url_ban" );
foreach( $fcontents as $numero_ligne => $ligne)
{
$ligne = preg_replace("/([#]{1}.*)$/", "", $ligne);
$ligne = preg_replace("/([[:space:]]+)/", "", $ligne);
if ($ligne != '' AND preg_match('#'.$ligne.'#i', $REMOTE_ADDR) /*OR preg_match('#'.$ligne.'#i', $_SERVER['HTTP_USER_AGENT'])*/)
{
fclose($file);
$url_att = $GLOBALS['file_path_f'].$GLOBALS['att'];
$current = $REMOTE_ADDR." ".$date." IP/agent interdit ".$_SERVER['HTTP_USER_AGENT']." ".$_SERVER['REQUEST_URI']."\r\n";
file_put_contents($url_att, $current, FILE_APPEND);
exit;
}
}
fclose($file);
}
else
{
// enregistrement des ip interdites ou impossible d'ouvrir le fichier ban.txt echo "Impossible d'ouvrir fichier interdictions";
}
// 2. test si visiteur semble être un robot/SE (x=7)
$url_bot = $GLOBALS['file_path_f'].$GLOBALS['bots'];
if ($file = fopen("$url_bot", "r"))
{
$robot_addr = FALSE; $i = 0;
$fcontents = file( "$url_bot" );
foreach( $fcontents as $numero_ligne => $ligne)
{
$i++;
$ligne = preg_replace("/([#]{1}.*)$/", "", $ligne);
$ligne = preg_replace("/([[:space:]]+)/", "", $ligne);
$ligne = preg_replace('!/\*.*?\*/!s', '', $ligne);
$ligne = preg_replace("/£/", " ", $ligne);
if (preg_match('#'.$ligne.'#i', $REMOTE_ADDR) OR preg_match('#'.$ligne.'#i', $_SERVER['HTTP_USER_AGENT']) OR $ligne == $_SERVER['HTTP_USER_AGENT'])
{
$robot_addr = TRUE;
BREAK;
}
}
fclose($file);
}
else echo "Impossible d'ouvrir fichier moteurs de recherches";
// 3. test si pattern indésirables dans REQUEST_URI
$req_2 = str_replace($GLOBALS['server_path'], "", $_SERVER['REQUEST_URI']);
if (preg_match('#(.*?http.*?|.*?ftp.*?|.?www\..?|_\/_\/|_manager|\.7z|\.env|\.git|&sa\=U&ei\=|admin_area|administrator/index\.php|ajax_create_folder|app-ads\.txt|att\.txt|attaques\.txt|bitrix|blogrobots\.txt|com_fabrik|com_jce|com_redmystic|components/com_|contact\.php|configuration|cPath\=|curltest\.php|dedecms\.css|dir\=|execute|fckeditor|FileZilla\.xml|file=|filemanager|ftp|\/images\/stories|imp\/test.php|include|index\.php\?opt=1|index\.php\?opt=2|index\.php\?opt=3|index\.php\?opt=4|index\.php\?opt=5|index\.php\?opt=6|index\.php\?opt=7|index\.php\?opt=8|index\.php\?opt=9|ipn_log|lib\.php|login\.php|logx\.txt|luph|magic\.php|member\/profile|metri\.php|netdefender|nimda_|nyet\.gif|gf_page=upload|password|phpMyAdmin|phpThumb|phpRPC|readme\.txt|recky|redirect|\/register|scripts|sellers\.json|setup|signup|source_dir|src\=|sUx\.php|ThisPageDoesNotExistsMan|\/up\.php|upload|update\/|wp|xmlrpc|zboard)#i', $req_2, $prob) OR $_SERVER['HTTP_USER_AGENT'] == 'Mozilla/5.0 (Android; Mobile; rv:13.0) G')
{
if ($robot_addr == FALSE)
{
$current = $REMOTE_ADDR."\r\n";
file_put_contents($url_ban, $current, FILE_APPEND);
}
$url_att = $GLOBALS['file_path_f'].$GLOBALS['att'];
$current = $REMOTE_ADDR." ".$date." ".$req_2." ".$_SERVER['HTTP_USER_AGENT']."\r\n";
file_put_contents($url_att, $current, FILE_APPEND);
EXIT;
}
// problème avec url étranges de google bot ou encore des liens bidons, type http://www.aerien.ch/articles/11/Tourisme_nature_ornithologie.php]Detedritinciaw ou ...Result: chosen
if (isset($_GET['string']) AND preg_match("/Ã|Â|®|ionEurope/", $_GET['string']) OR preg_match('#\.php[^?.]+$#', urldecode($_SERVER['REQUEST_URI'])))
{
EXIT;
}
}
//////////////////////////////////////////////////////////
// fonctions //// nav.php //// access() /// 6.11.2012 ////
//////////////////////////////////////////////////////////
function access()
{
global $robot_addr, $session_auth, $droits, $user, $visites_jour;
$date = date("Y-m-d G-i-s");
$REMOTE_ADDR = $_SERVER['REMOTE_ADDR'];
// trop lent !!! $REMOTE_HOST = @getHostByAddr($REMOTE_ADDR);
// 4. test si utilisateur authentifié : si pas de cookie, pas d'admin
$session_auth = false;
if (!isset($_COOKIE["session"]))
{
$droits = "";
if (isset($_REQUEST['opt']) AND $_REQUEST['opt'] != '') $opt = $_REQUEST['opt'];
else $opt = '';
if (preg_match("*".$GLOBALS['admin_path']."*", $_SERVER['PHP_SELF']) OR ($GLOBALS['pub'] == FALSE AND $opt != 'auth'))
{
redirect_url("index.php?opt=auth", "", "", 0);
exit;
}
}
else
{
$session_cookie = $_COOKIE['session'];
$res_access = mysqli_query($GLOBALS['link'], "SELECT user, last, droits FROM util_connect, utilisateurs WHERE session = '$session_cookie' AND user = username"); $GLOBALS['nb_queries']++;
if (mysqli_num_rows($res_access) == 1)
{
$user = mysqli_result($res_access, 0, "user");
$last = mysqli_result($res_access, 0, "last");
$droits = mysqli_result($res_access, 0, "droits");
// définition des droits du visiteur : $session_auth; $session_level; $session_user
if ($droits != "")
{
$session_auth = true;
$session_level = $droits;
$session_user = $user;
ini_set("display_errors", 1);
error_reporting(E_ALL);
}
}
}
$adresse_corr = $REMOTE_ADDR;
// 5. test si nb visites journalières et dernières secondes pas trop nombreuses
/*
$ip = $_SERVER['REMOTE_ADDR'] ?? '';
$key = "rate_limit_" . $ip;
// Increment IP count in RAM by 1. If it doesn't exist, start at 1 and expire in 60 seconds.
$visites = apcu_inc($key, 1, $fail, 60);
if ($request_count > 100) { // If they hit > 100 pages in one minute
http_response_code(429);
exit("Too many requests."); // Block them before MySQL ever hears about it
}
$visites_60sec = 100;
*/
$v = mysqli_query($GLOBALS['link'], "SELECT count(address) FROM stat WHERE date >= NOW() - INTERVAL 1 DAY AND address = '".$adresse_corr."'"); $GLOBALS['nb_queries']++;
$v2 = mysqli_query($GLOBALS['link'], "SELECT count(address) FROM stat WHERE date >= NOW() - INTERVAL 10 SECOND AND address = '".$adresse_corr."'"); $GLOBALS['nb_queries']++;
$visites_jour = mysqli_result($v, 0);
$visites_10sec = mysqli_result($v2, 0);
$url = $GLOBALS['file_path_f'].$GLOBALS['ban'];
$visites_jour_max = 150;
$visites_10sec_max = 4;
if (($visites_jour > $visites_jour_max - 2 OR $visites_10sec > $visites_10sec_max - 2) AND $GLOBALS['robot_addr'] == FALSE AND $session_auth == false)
// if (($visites > $visites_60sec_max) AND $GLOBALS['robot_addr'] == FALSE AND $session_auth == false)
{
echo "
Page views are limited !
If you are a BOT, please identify yourself as such !
"; elseif($n > 1 AND !preg_match("/v/", $reg)) $ancres.= " - ";
$url_page_lien = $_SERVER['REQUEST_URI'].'#a'.$n;
//
if (($ref[2]) /*AND ($ref[1])*/)
{
$ancres.= ''.$ref[2].'';
}
if (preg_match("/v/", $reg)) $ancres.= "
";
}
if ($n > 0 AND preg_match("/v/", $reg))
{
if ($n >= 3) $class = ' class="cols_b"';
else $class = ' class="col"';
$ancres = "".$ancres."";
}
elseif ($n > 0 AND !preg_match("/v/", $reg))
{
$ancres = " ".$ancres."
";
}
$texte = $ancres." ".$texte;
// IL SERAIT PLUS LOGIQUE DE REPRENDRE LA STRUCTURE biblio_especes ??
}
if (preg_match($pattern_bib, $texte))
{
$biblio = '
";
}
// news tiree selon jour, texte affiché sur page accueil
$sql_news_last = 'SELECT titre, texte, date, id FROM actu WHERE 1 ORDER BY date DESC, id DESC LIMIT 0,1';
$result_last = mysqli_query($GLOBALS['link'], $sql_news_last); $GLOBALS['nb_queries']++;
if (mysqli_num_rows($result_last))
{
$titre_asel = mysqli_result($result_last,0,"titre");
$texte_asel = references(mysqli_result($result_last,0,"texte"));
$date_asel = mysqli_result($result_last,0,"date");
$id_asel = mysqli_result($result_last,0,"id");
}
$titre_actu = "Actualité : ".$titre_asel." | ".date_fr($date_asel)." ";
if (strlen($texte_asel) > 1200)
{
if (preg_match('/^.{1,1200}\b/s', $texte_asel, $match)) $texte_asel = $match[0];
$url_suite = $GLOBALS['server_path'].$GLOBALS['site_path']."index.php?opt=actu&id=".$id_asel."&tit_fr=".url_fr($titre_asel);
$url_suite = url_rewrite($url_suite);
$texte_asel .= ' ... Lire la suite';
}
$texte_actu .=
$texte_asel = mise_en_page($texte_asel)."
";
// si plus de 10 news, option pour affichage page news année en cours
$url = "index.php?opt=actu&act=".$date_news."&an=".$an;
$url = url_rewrite($url);
// affichage annes precedentes comportant des news
$liens_actu = actu_ans_liens();
$texte = $titre_actu.$texte_actu.$liste_actu." ".$liens_actu."
".$texte." ";
}
return $texte;
}
///////////////////////////////////////////////////////
// fonctions / index.php / actu_ans_lien() / 24.03.2010
///////////////////////////////////////////////////////
function actu_ans_liens()
{
$an = date("Y");
$date_news_prec = $an."-%";
$link_news = "";
$sql_news = 'SELECT distinct year(date) as y FROM actu WHERE 1 ORDER BY y ASC';
$result_news = mysqli_query($GLOBALS['link'], $sql_news); $GLOBALS['nb_queries']++;
while (list($year) = mysqli_fetch_row($result_news))
{
$url = $GLOBALS['server_path'].$GLOBALS['site_path']."index.php?opt=actu&an=".$year;
$url = url_rewrite($url);
$link_news .= " $year";
}
if ($link_news != "") $texte_news = "Actualités années : ".$link_news." ";
return $texte_news;
}
/////////////////////////////////////////////////////////
// fonctions // index.php // actu_page() // 6.11.2012 //
/////////////////////////////////////////////////////////
function actu_page()
{
global $index_cont, $titre_page, $keywords, $description, $canonical_href;
$description = "Quelques actualités pour le site ".$GLOBALS['TITRE_SITE'];
$titre_page = htmlsce("Actualités ".$GLOBALS['TITRE_SITE']);
$keywords = htmlsce("Actualités");
$texte_actu = '';
// affichage liste toutes actu du mois-année
if (isset($_GET['mois']))
{
if (!isset($_GET['an'])) $an = date("Y"); else $an = $_GET['an'];
$mois = $_GET['mois'];if (strlen($mois)<2)$mois = "0".$mois;
$date = date_fr($an."-".$mois."-");
$titre_page .= " ".$date;
$titre_page = htmlsce($titre_page);
$keywords .= ", ".htmlsce($date);
$description = htmlsce($description." : ".$date);
$sql_news = 'SELECT titre, date, id FROM actu WHERE date LIKE "'.$an.'-'.$mois.'%" ORDER BY date DESC LIMIT 0, 10';
$result = mysqli_query($GLOBALS['link'], $sql_news); $GLOBALS['nb_queries']++;
$nb_result = mysqli_num_rows($result);
if ($nb_result >= 1)
{
$texte_actu = '
";
// if ($n > 365) BREAK;
}
$texte_actu .= $actu."";
$texte_actu .= actu_ans_liens();
}
else $texte_actu = ' Pas d\'Actualité pour le mois de '.date_fr($an."-".$mois."-").'';
}
// affichage liste de toutes les actu de l'année, par mois
elseif (isset($_GET['an']))
{
$an = $_GET['an'];
$titre_page .= " ".$an." ".$GLOBALS['TITRE_SITE'];
$titre_page = htmlsce($titre_page);
$keywords .= ", ".$an;
$description = htmlsce($description." : ".$an);
$sql_news = 'SELECT titre, date, id FROM actu WHERE date LIKE "'.$an.'-%" ORDER BY date ASC';
$result = mysqli_query($GLOBALS['link'], $sql_news); $GLOBALS['nb_queries']++;
$nb_result = mysqli_num_rows($result);
if ($nb_result >= 1)
{
$texte_actu = '
";
foreach($nav_liens as $tit => $lien)
{
$tit = htmlsce($tit);
if (($tit == "Accueil" AND preg_match('$'.$_SERVER['REQUEST_URI'].'$', $nav_liens['Accueil']))
OR ($tit == "Biblio" AND preg_match("/biblio.php/", $_SERVER['REQUEST_URI']))
OR (preg_match("/message/i", $_SERVER['REQUEST_URI']) AND $tit == 'Contact')
OR ($tit == "Conditions" AND preg_match('$'.$_SERVER['REQUEST_URI'].'$', $nav_liens['Conditions']))
OR ($tit == "Aide" AND $opt == "aide")) echo '
'.$tit.'
';
elseif ((preg_match("/list.php/", $lien) AND $base == 'especes')
OR ($tit == "Articles" AND ($base == "articles" OR preg_match("/liens.php/", $_SERVER['PHP_SELF'])))
OR (preg_match("/articles/i", $tit) AND $base == 'articles')) echo "
';
}
function bouton_recherche($type)
{
$bouton = 'obs_page();}
elseif($_GET['opt'] == "pays") {$index_cont = pays();}
/* probleme avec content() et _head()... soit sortir tous $opt de index() sur content() ? pour rester cohérent
elseif ($_GET['opt'] == "liens") liens_content();*/
}
else
{
if (isset($_REQUEST['tit'])) {$id_titre = clean_var($_REQUEST['tit']);}else $id_titre = $tit_index;
if (!isset($p)) $p = 0;
$sql = "SELECT titre, action, keywords, description, creat, modif, opt, lang, prio, id_article from articles where id = '".$id_titre."'";
$result = mysqli_query($GLOBALS['link'], $sql); $GLOBALS['nb_queries']++;
if (mysqli_num_rows($result)!=1) {error_404();exit;}
$titre_page_aff = $titre_page_aff_init = mysqli_result($result, 0, 'titre'); $titre_page = htmlsce($titre_page_aff_init);
$tit_fr = url_fr($titre_page);
// Trop compliqué à enlever si problème d'accents et encodage ?
if (preg_match("/articles/", $_SERVER['REQUEST_URI']) AND !preg_match("/".strtolower(url_fr(htmlsce(sans_accent($titre_page_aff)))).".php/", strtolower($_SERVER['REQUEST_URI']))) { error_404(); exit;}
$keywords = htmlsce(mysqli_result($result, 0, 'keywords'));
$description = htmlsce(mysqli_result($result, 0, 'description'));
$texte_p = $texte_init = mysqli_result($result, 0, 'action');
$cre = mysqli_result($result, 0, 'creat');
$modif = mysqli_result($result, 0, 'modif');
$prio = mysqli_result($result, 0, 'prio');
$lang = mysqli_result($result, 0, 'lang');
$opt_sup = mysqli_result($result, 0, 'opt');
$id_article = mysqli_result($result, 0, 'id_article');
$texte_p = references($texte_p);
$texte_p = mise_en_page($texte_p);
if ($id_titre == $GLOBALS['id_page_accueil'])
{
if (preg_match("/actu/", $opt_sup)) $texte_p = actu_titres($texte_p);
if (preg_match("/agenda/", $opt_sup))$texte_p = agenda().$texte_p;
}
if (isset($_REQUEST['string']))
{
$string = str_replace("_", "|", $_REQUEST['string']);
$titre_page_aff = highlight($string, $titre_page_aff_init);
$texte_p = highlight($string, $texte_p, 1);
}
$goto = $GLOBALS['server_path'].$_SERVER['REQUEST_URI']; if ($goto == $GLOBALS['site_path'])$goto = $GLOBALS['server_path'].$GLOBALS['site_path'];
if ($prio >= 2 AND $GLOBALS['session_auth'] == false)
{
if ($prio == 2 AND !preg_match("/admin|articles|lecture/", $GLOBALS['droits'])) $texte_p = substr($texte_p, 0, 1000);
$texte_p = $texte_p." ...";
$texte_p = $texte_p."
Désolé ce contenu est désormais protégé, contactez-nous pour plus d'informations si vous êtes intéressé. ";
if ($prio >= 3) redirect_url($GLOBALS['server_path'].$GLOBALS['site_path']."index.php?opt=auth", "
Contenu protégé!
");
}
// URL page ///////////////////////////////////////////////
$url_page = $GLOBALS['REQUEST_PROTOCOL']."://".$GLOBALS['server'].$_SERVER['REQUEST_URI'];
$num_page = "index.php?tit=".$tit_index."&tit_fr=".url_fr($titre_page_aff_init);
$canonical_href = $GLOBALS['server_path'].$GLOBALS['site_path'];
if (isset($_GET['tit']) AND $_GET['tit'] != $GLOBALS['id_page_accueil']) $canonical_href = url_rewrite($canonical_href.$num_page);
// version imprimable /////////////////////////////////////
if (isset($_GET['p']) AND ($_GET['p'] == 1 OR $_GET['p'] == 2))
{
$page = '