Internet biztonsági stratégia

ELSŐ RÉSZ
a felhasználók biztonsága

Bevezető

Az utóbbi iőben számos tanulmány jelent meg az Internet (és általában az IT szektor) javasolt jövőbeli stratégáját illetően. A több (tíz)ezer sornyi anyagban a biztonságról gyakorlatilag nem esik szó, holott a potenciális ügyfelek bizalmán (tehát a szervereken tárolt információk és a hálózati kommunikáció biztonságán) áll vagy bukik az, hogy
- valóban biztonságosan használható-e lesz az Internet,
- és valóban olyan nagy jövő előtt áll-e az Internet-es kereskedelem (és általában az e-business).

Ezt a bizalmat megszerezni nem a problémák elhallgatásával kellene, hanem azzal, hogy megtanítjuk az Internet felhasználóit a különböző szolgáltatások biztonságos alkalmazására, és felhívjuk a figyelmüket a hálózat használata során felmerülő veszélyekre.

Hitelkártyás vásárlás

Ezen a területen is a bizalom hiánya legfőbb hátráltató tényező: számtalan esetről hallani, amelyekben Internet-es vásárlásaik során megkárosították egyeseket, mert - mint utólag kiderült - egy szélhámosnak adták meg hitelkártyájuk adatait. Az eddig megismert eseteket megvizsgálva megállapítható, hogy szinte valamennyi ilyen esetben egyértelműen előre látható lett volna, hogy szélhámos áll a háttérben (minimális ismeretek birtokában).

Digitális aláírás

Valamennyi érdekelt tisztában van azzal, hogy a digitális aláírás lelenleg nem, vagy legalábbis iszonyatosan nehezen hamisítható. Azt azonban kevesen tudják, hogy léteznek módszerek, amelyek segítségével - bizonyos feltételek mellett - megkerülhető a rendszer, illetve rá lehet venni a felhasználó számítógépét arra, hogy egy távolból érkező parancsra végrehajtsa az aláírási procedúrát (a tulajdonos számára észrevétlenül).
Ha ezek a feltételek hiányoznak, akkor valóban biztonságban lehet használni a digitális aláírást.

E-MAIL - klasszikus levelezés

Nagy mennyiségben küldött levelek (spam) + e-mail cím gyűjtés

ÖSSZEGZÉS:

Az embereket meg kell ismeretni a várható veszélyekkel, és el kell magyarázni, hogy mely feltételek azok, amikor nagy biztonsággal böngészhet, levelezhet, használhatja hitelkártyját, pénzt utalhat vagy értékpapírokkal kereskedhet, stb.

Mivel nem lehet mindenki számítástechnikus és tűzfalszakértő, a védelmi feladatokat nem lehet kizárólag a (jobbára gyakorlatlan) Internet felhasználókra hárítani.

Az Internet biztonságos használatához szükséges oktatás az állam feladata,
a védelem technikai feladatait a különböző Internet szolgáltatóknak és az alhálózatok tulajdonosainak kell ellátnia (különböző védelmi rendszerek kiépítése és üzemeltetése), szükség esetén állami támogatással (például vírusfigyelővel ellátott ingyenes e-mail szolgáltatások támogatása).

Oktatás:
az embereknek már gyerekkorban elmagyarázzák, hogy "nézz körül, mielőtt átszaladsz az úton", "ne állj szóba gyanús idegennel",
de senki sem mondta el nekik, hogy "figyeld a lakatot a böngésződ alján" vagy "ne kattints rá minden csatolt állományra" esetleg "ne tölts le programot gyanús helyről" - pedig ezek is feltételei annak, hogy "életben maradjunk" a virtuális világban.


MÁSODIK RÉSZ :
hálózati biztonság szakmai (professzionális) szempontból

Szakemberek rendszeres (és gyors) informálása

Egy országban lévő hálózatok biztonságosságára nem lehet megoldás az, hogy a különböző programokban felfedezett biztonsági rések legfőbb forrásai lelkes amatőrök különböző csoportjai által rendszerezett információk legyenek. Meg kell oldani, hogy az újonnan felfedezett betörési módszerek elleni védekezésről, programok biztonsági réseiről (és az esetleges javítócsomagokról) azonnal tudomást szerezhessenek mindazok, akik a számítógépek és hálózatok biztonságával foglalkoznak. Ez a rendszer teljesen ingyenes kell, hogy legyen (állami vagy alapítványi támogatással), mert fizetős szolgáltatás eredményeképpen éppen azok nem kapnák meg az információkat, akiknek a legnagyobb szükségük lenne rá.

SZERVEREK - általános javaslatok

Csak azon szolgáltatásokat futtassák, amelyek a kitűzött feladatok elátásához elengedhetetlenül szükségesek.

RENDSZER-ADMINISZTRÁTOR: ha technikailag nem oldható meg, hogy a gép kizárolagosan közvetlenül (billentyűzetről) legyen elérhető, akkor a távoli menedzseléshez csak olyan programot használjunk, amely titkosított adatátvitelt használ (SSL), és ennek kommunikációs portját is toljuk el az általánosan megszokottról. Adminisztrátori szinten ne tegyük lehetővé a telnet használatát.

JAVASOLT VÉDELMI MÓDOK:
- passzív védelem:
port-szűrés (
alapértelmezésként minden tiltva, a szükséges kivételek engedélyezve - konkrét ajánlások a különböző felépítésű és operációs rendszerű szerverekre fejlesztés alatt - támogatást elfogadunk)
- egyéni aktív védelem:
letapogatás (scan) detektálás és a támadó IP automatikus kitiltása,
- csoportos aktív védelem:
támadási adatok (behatolási kísérletek) azonnali és automatikus továbbítása egy országos adatbázisba (fejlesztés alatt - támogatást elfogadunk), majd a valószínűsíthetően külföldről érkező támadások továbbítása a megfelelő ország hasonló rendszereinek, vagy egy nemzetközi támadásikísérlet-adatbázisba (szintén fejlesztés alatt lesz - ha megkérnek rá).

LOG-OLÁS: a szerverek működése közben létrejövő (és a biztonság szempontjából fontos) log-okat a szerverek
- ne a megszokott könyvtárba és néven,
- ne csak egy helyre (file duplikálás - a támadó hátha csak az egyiket találja meg),
- egyúttal másik gépre is írja (a szomszédos szerverek keresztbe is log-olhatnak - így a nyomok eltüntetéséhez legalább két gépet fel kelljen törni)
készítsék. Olyan helyeken, ahol nagyobb mennyiségű szerver található, a log-ok biztonságos tárolását és archiválását külön erre a célra beállított
szuperbiztos gépek végezzék (a log-készítő és archiváló rendszer működési elve és javasolt konfigurációja fejlesztés alatt - támogatást elfogadunk).

SZERVEREK - nyilvános szerverek

Csak azon szolgáltatások fussanak, amelyek elengedhetetlenül szükségesek (alapértelmezés: a webszerver programon kívül semmi - bár ez kevés helyen megoldható)

FTP: Hatalmas biztonsági rést jelent az, hogy a mindmáig elterjedten alkalmazott file átviteli protokoll (ftp) semmilyen titkosítást nem használ. Nem csak az adatok, de a hozzáféréshez szükséges információk is (user-név és jelszó) bármilyen titkosítás nélkül (lehallgathatóan) haladnak végig a hálózaton. Cseréljük le titkosított adatátvitelre (SafeTP), és/vagy toljuk el az ftp portot egy csak általunk ismert számra (ez természetesen csak ott lehetséges, ahol az ügyfelek száma és számítástechnikai ismeretei mellett ez megoldható)

SZERVEREK - (nagy)vállalati szolgáltatók (akik megengedhetik...)

Csak azon szolgáltatásokat futtassák, amelyek elengedhetetlenül szükségesek (alapértelmezés: a cég kliens gépei kivételével semmit).

LEVELEZŐ SZERVER: külön gépen és a tűzfalon kívül (vírusfigyeléssel). Ha van épületen belüli belső levelezés, akor lehet belül, de akkor is a tűzfaltól (fizikailag) külön számítógépen.

VÁLLALATI WEBOLDAL: ha lehet, ne a cég szerverén, tűzfalán, stb. tároljuk. Nem kerül komoly összegbe az, ha a cég weboldalát egy erre szakosodott (tartalom) szolgáltatónál helyezzük el. Komoly biztonsági rés lehet egy cég tűzfal számítógépén (közelében) működő nyilvános webszerver (és a vele együtt futó alkalmazások).

INTRANET SZERVER kizárólag a cég belső informálásával foglalkozzon, a tűzfaltól külön gépen, és a tűzfalon belül legyen.

az Internetes tartalomszolgáltatók felelőssége

Az internet tartalmát szolgáltató szerverekre a jogosult felhasználók közül bárki bármikor felcsatlakozhat és módosíthatja a weboldala tartalmát (sok szerver több ezer ilyen felhasználóval rendelkezik). ezért ha egy weboldalon nem odavaló anyag jelenik meg, azért a szerver tulajdonosát (üzemeltetőjét) nem lehet felelőssé tenni.
Viszont:
amennyiben - tartalma miatt - szükségessé válhat egy weboldal megszüntetése, a szerver tulajdonosa (rendszergazdája) köteles legyen azt záros határidőn belül végrehajtani (maximum ennek elmaradását lehetne szankcionálni). A rendszergazdának szóló értesítés másolata olvasható legyen egy nyilvános helyen is (pontos időponttal).
Az Internet-en mindenki által könnyen megtalálhatóan el kell helyezni azt hivatalos (jogászok által ellenőrzött) dokumentumot, amely egyértelműen elmagyarázza azt, hogy mit NEM tartalmazhat egy weboldal, a határesetek közérthető leírásával (NEM jogi szöveg - mindenki megértse).

TÖRVÉNYEK

A Nagy-Britanniában érvényes Internet törvények szerint gyakorlatilag mindenki, aki bármiféle illegális hálózati tevékenységet folytat, automatikusan a "terrorista" kategóriába kerül, és lebukása esetén ennek megfelelő büntetés vár rá. Mivel az esetek többségében félrevezetett fiatalkorúakkal állunk szemben, túlzónak tartanám őket (sokszor több tíz éves) börtönbüntetésre ítélni.
Csak remélni merem, hogy a tervezett EU-szintű, a számítógépesbiztonságról szóló törvénytervezet nem az angol rendszert fogja átvenni.

A meglévő törvények bőségesen elegendőek a legtöbb bűncselekmény kezelésére. Sok esetben tulajdonképpen egyszerű károkozás történik, ha a bíróságok pusztán a REÁLIS értékű kártalanítást ítélnék meg (tényleges kár, helyreállítási költségek, eszmei kár, elmaradt haszon, perköltségek, stb.), az önmagában visszatartó hatású lenne.
A különböző (egyelőre) határesetek kezelhetősége végett mindazonáltal szükségesnek tartanék még két jogszabályt:

A privát számítógépes szféra védelme
(jav:szabálysértés, halmozott esetben bűncselekmény),
amelyben meg kell határozni azt, hogy milyen jellegű adatgyűjtés számít a privát szféra megsértésének (pl. különböző információk gyűjtése idegen számítógépekről távolból történő letapogatás (portscan-nelés) vagy más módszer segítségével, gyengepont-keresés). Ki kell dolgozni azt a feltételrendszert, amely kivételt jelenthet ez alól (pl. előre megbeszélt és bejelentett biztonsági ellenőrzés).
Meg kell határozni továbbá, hogy
- ki számít egy-egy hálózati szegmens tulajdonosának
- mit tehet meg és mit nem a hálózati szegmens tulajdonosa az alá tartozó számítógépekkel kapcsolatban, különös tekintettel az erősen különböző jogi viszonyokra (pl. vállalati hálózat - Internet szolgáltató)
Ha egy alhálózat tulajdonosa a saját hálózatán bármilyen felügyelő (biztonságtechnikai, adatvédelmi, vírusvédelmi, stb.) tevékenységet folytat, azt az összes felhasználóval előre közölnie kelljen, a felügyeleti rendszer pontos leírásával. Ettől előzetes értesítés nélkül - a szigorúbb hálózati felügyelet irányában - büntetőjogi felelősség terhe mellett ne térhessen el.
Meg kell határozni, hogy mi számít magán (védett) információnak pl. egy munkahelyi számítógépen (általános elvek kidolgozása a hasonló határesetekre).

Számítógépes károkozás kísérlete ill. számítógépes károkozás lehetővé tétele (jav:szabálysértés).
Sok, az Internet-re kapcsolt számítógépről különösebb adatgyűjtés nélkül is "látszik", hogy a rendszernek hol vannak a gyenge pontjai. Fontos lenne azok szankcionálása, akik ezen pontok kihasználásávak igyekeznek kárt okozni. A lebukott kísérletező számos esetben azzal védekezik, hogy még nem történt károkozás, csak... ezt kell megelőzni.
Ugyanebbe a kategóriába tartozna a különböző helyekről letölthető, károkozásra alkalmas (pl.vírussal vagy beépített trójai) programmal fertőzött dokumentumok, illegális trükköket alkalmazó weboldalak Interneten való elhelyezése, és a károkozásra alkalmas programok egyéb módon (pl. email-ben) történő továbbítása.
A bizonyítás sok esetben rendkívül nehéz lesz (a szándékosság olykor lehetetlen), és mivel nagyon kényes terület, ezért csak 100%-osan biztos esetekben lenne szabad elmarasztaló ítéletet hozni.
Ezen törvény esetében a lényeg a visszatartó erő lenne.

Nemzetközi Internet tartalmi egyezmény
Egyre több esetben fordul elő, hogy egy-egy ország a saját törvényeit próbálja érvényesíteni egy külföldi szerveren található, az ő törvényeit sértő weblappal szemben. Mivel az egyes kormányok egyre gyakrabban ébrednek rá az Internet fontosságára, az ilyen esetek a jövőben várhatóan szaporodni fognak.
Nemzetközi egyezményben kell lefektetni, hogy melyek az általános szabályok, amelyek kötelezőek az összes aláíró országra nézve.
A
z egyezmény megszövegezésében vegyenek részt a különböző tartalomszolgáltatók és civil csoportosulások képviselői is.
Az egyezményben foglaltakat az Internet-en is elérhetővé kell tenni (közérthető formában és minél több nyelven).


ÖSSZEGZÉS:

Magyarországon az Internet felhasználók biztonságtechnikai oktatásával és a vírusok elleni védekezés módszereinek megismertetésével ma hivatásszerűen senki sem foglalkozik.

Magyarországon az Internet felhasználóknak a számítógépes bűnözők elleni védelmével és az Internet-en automatikusan terjedő számítógépes vírusfertőzések megállításával ma hivatásszerűen senki sem foglalkozik.

Magyarországon az Internetre kapcsolt kis- és közepes vállalkozások biztonságtechnikájával (tájékoztatásával) ma hivatásszerűen senki sem foglalkozik.

Magyarországon a különböző hálózati biztonságtechnikusok és rendszergazdák biztonságtechnikai oktatásával (továbbképzésével) ma hivatásszerűen senki sem foglalkozik.

Az Internettel és hálózatokkal kapcsolatos programokban - sajnos meglehetősen gyakran - különböző biztonsági hibák válnak ismertté. Rendkívül fontos lenne ezen hibák veszélyességének megállapítása, és az érdekeltek (rendszergazdák) haladéktalan értesítése. Ezzel ma Magyarországon hivatásszerűen senki sem foglalkozik.

 
Vissza
Version: ".$v; echo "
  • System: ".$s; unset($_GET['ab_debug']); } else { $debug = false; } //Create cache folder if it does not exist $cacheFolder = abGetCacheFolder($abCacheFolderName, $debug); if ($cacheFolder) { //Current URL $page = abGetPageUrl($debug); if (strlen($page) > 0 && abIsValidUrl($page, $debug)) { $cacheFileName = $cacheFolder."/".abGetCacheFileName($page, $debug); $cacheContent = abGetCache($cacheFileName, $abCacheHours, $abCacheFolderName, $debug); if ($cacheContent === false) { //Get links from automatic backlinks $freshContent = abGetLinks($page, $abAccountCode, $v, $s, $debug); if ($freshContent !== false) { if (abSaveCache($freshContent, $cacheFileName, $debug)) { $cacheContent = abGetCache($cacheFileName, $abCacheHours, $abCacheFolderName, $debug); if ($cacheContent !== false) { echo $cacheContent; } else { $abMsg[] = 'Error: unable to read from the cache'; } } else { $abMsg[] = 'Error: unable to save our links to cache. Please make sure that the folder '.$abCacheFolderName.' located in the folder '.$_SERVER['DOCUMENT_ROOT'].' and is writable'; } } else { $abMsg[] = 'Error: unable to get links from server. Please make sure that your site supports either file_get_contents() or the cURL library.'; } } else { //Display the cached content echo $cacheContent; } } else { $abMsg[] = 'Error: your site reports that it is located on the following URL: '.$page.' - This is not a valid URL and we can not display links on this page. This is probably due to an incorrect setting of the $_SERVER variable.'; } } else { $abMsg[] = 'Error: Unable to create or read from your link cache folder. Please try to create a folder by the name "'.$abCacheFolderName.'" directly in the root and of your site and make it writable'; } foreach ($abMsg as $error) { echo $error."
    "; } /** * Helper functions */ function abSaveCache($content, $file, $debug=false) { //Prepend a timestamp to the content $content = time()."|".$content; echo ($debug) ? "
  • Saving Cache: ".$content : ""; $fh = fopen($file, 'w'); if ($fh !== false) { if (!fwrite($fh, $content)) { echo ($debug) ? "
  • Error Saving Cache!" : ""; return false; } } else { echo ($debug) ? "
  • Error opening cache file for writing!" : ""; return false; } if (!fclose($fh)) { echo ($debug) ? "
  • Error closing file handle!" : ""; return false; } if (!file_exists($file)) { echo ($debug) ? "
  • Error could not create cache file!" : ""; return false; } else { echo ($debug) ? "
  • Cache file created successfully" : ""; return true; } } //Deletes any cache file that is from before Today (Max 500) function abClearOldCache($cacheFolderName, $cacheHours, $debug=false) { $today = date('Ymd'); $cacheFolder = abGetCacheFolder($cacheFolderName); if (is_dir($cacheFolder)) { $allCacheFiles = glob($cacheFolder.'/*.cache'); $todaysCacheFiles = glob($cacheFolder.'/'.$today.'*.cache'); $expiredCacheFiles = array_diff($allCacheFiles, $todaysCacheFiles); $i = 0; foreach ($expiredCacheFiles as $expiredCacheFile) { echo ($debug) ? "
  • Deleting expired cache file: ".$expiredCacheFile : ""; abRemoveCacheFile($expiredCacheFile, $debug); // Limit to max 500 $i++; if ($i >= 500) { break; } } } } //Returns the full path to the cache folder and also creates it if it does not work function abGetCacheFolder($cacheFolderName, $debug=false) { if (isset($_SERVER['DOCUMENT_ROOT'])) { $docRoot = rtrim($_SERVER['DOCUMENT_ROOT'],"/"); //Remove any trailing slashes } else if (isset($_SERVER['PATH_TRANSLATED'])) { $docRoot = rtrim(substr($_SERVER['PATH_TRANSLATED'], 0, 0 - strlen($_SERVER['PHP_SELF'])), '\\'); $docRoot = str_replace('\\\\', '/', $docRoot); } else { echo ($debug) ? "
  • Error: Could not construct cache path" : ""; } $cacheFolder = $docRoot."/".$cacheFolderName; echo ($debug) ? "
  • Cache folder is: ".$cacheFolder : ""; if (!file_exists($cacheFolder)) { echo ($debug) ? "
  • Cache folder does not exist: ".$cacheFolder : ""; if (!@mkdir($cacheFolder,0777)) { echo ($debug) ? "
  • Error - could not create cache folder: ".$cacheFolder : ""; return false; } else { echo ($debug) ? "
  • Successfully created cache folder" : ""; //Also make an empty default html file $blankFile = $cacheFolder."/index.html"; if (!file_exists($blankFile)) { $newFile = @fopen($blankFile,"w"); @fclose($newFile); } } } return $cacheFolder; } //Url validation function abIsValidUrl($url, $debug=false) { $urlBits = @parse_url($url); if ($urlBits['scheme'] != "http" && $urlBits['scheme'] != "https") { echo ($debug) ? "
  • Error! URL does not start with http: ".$url : ""; return false; } else if (strlen($urlBits['host']) < 4 || strpos($urlBits['host'], ".") === false) { echo ($debug) ? "
  • Error! URL is incorrect: ".$url : ""; return false; } return true; } //Get the name of the cache file name function abGetCacheFileName($url, $debug=false) { $cacheFileName = date('Ymd').md5($url).".cache"; echo ($debug) ? "
  • Cache file name for URL: ".$url." is ".$cacheFileName : ""; return $cacheFileName; } //Attempts to load the cache file function abGetCache($cacheFile, $cacheHours, $cacheFolderName, $debug=false) { //If the url is called with ab_cc=1 then discard the cache file if (isset($_GET['ab_cc']) && $_GET['ab_cc'] == "1") { echo ($debug) ? "
  • Clear cache invoked!" : ""; abRemoveCacheFile($cacheFile); unset($_GET['ab_cc']); return false; } if (!file_exists($cacheFile)) { echo ($debug) ? "
  • Error! Cache file does not exist! ".$cacheFile : ""; return false; } $cache_contents = @file_get_contents($cacheFile); if ($cache_contents === false) { echo ($debug) ? "
  • Error: Cache file is completely empty!" : ""; return false; } else { echo ($debug) ? "
  • Cache file contents: ".$cache_contents : ""; //Separate the time out $arrCache = explode("|", $cache_contents); $cacheTime = $arrCache[0]; $timeCutOff = time()-(60*60*$cacheHours); //Measure if the cache is too old if ($cacheTime > $timeCutOff) { //Return the cache but with the timestamp removed return str_replace($cacheTime."|", "", $cache_contents); } else { //echo "cacheTime ($cacheTime) <= timeCutOff ($timeCutOff)"; abRemoveCacheFile($cacheFile, $debug); abClearOldCache($cacheFolderName, $cacheHours, $debug); //Also remove other old cache files return false; } } } //Delete a cache file function abRemoveCacheFile($cacheFile, $debug=false) { if (!@unlink($cacheFile)) { echo ($debug) ? "
  • Error: Could not remove cache file: ".$cacheFile : ""; return false; } else { echo ($debug) ? "
  • Successfully removed the cache file: ".$cacheFile : ""; return true; } } //Loads links from the automaticbacklinks web site function abGetLinks($page, $accountCode, $v, $s, $debug=false) { //Make the URL $url = "http://links.automaticbacklinks.com/links.php"; $url = $url."?a=".$accountCode; $url = $url."&v=".$v; $url = $url."&s=".$s; $url = $url."&page=".urlencode($page); echo ($debug) ? "
  • Making call to AB: ".$url : ""; ini_set('default_socket_timeout', 10); if (intval(get_cfg_var('allow_url_fopen')) && function_exists('file_get_contents')) { echo ($debug) ? "
  • Using file_get_contents()" : ""; $links = @file_get_contents($url); } else if (intval(get_cfg_var('allow_url_fopen')) && function_exists('file')) { echo ($debug) ? "
  • Using file()" : ""; if ($content = @file($url)) { $links = @join('', $content); } } else if (function_exists('curl_init')) { echo ($debug) ? "
  • Using cURL()" : ""; $ch = curl_init ($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $links = curl_exec($ch); curl_close ($ch); } else { echo ($debug) ? "
  • Error: no method available to fetch links!" : ""; return false; } return $links; } //remove ab_cc etc. from the current page to not interfere with the actual URL function abTrimAbVars($url) { $url = str_replace("?ab_cc=1", "", $url); $url = str_replace("&ab_cc=1", "", $url); $url = str_replace("?ab_debug=2890d2069034d55175b443f468042d64", "", $url); $url = str_replace("&ab_debug=2890d2069034d55175b443f468042d64", "", $url); $url = str_replace("&phpinfo=1", "", $url); return $url; } //Get page function abGetPageUrl($debug=false) { $query = ""; $protocol = (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != "off") ? "https://" : "http://"; $host = $_SERVER['HTTP_HOST']; $page = null; if (isset($_SERVER["REDIRECT_URL"]) && !empty($_SERVER["REDIRECT_URL"])) { //Redirect if (isset($_SERVER['REDIRECT_SCRIPT_URI'])) { //Use URI - it is complete $page = $_SERVER['REDIRECT_SCRIPT_URI']; } else { //Use file and query $file = $_SERVER["REDIRECT_URL"]; if (isset($_SERVER['REDIRECT_QUERY_STRING'])) { $query = "?".$_SERVER['REDIRECT_QUERY_STRING']; } } } else { //No redirect if (isset($_SERVER['REQUEST_URI'])) { //Use URI if (substr($_SERVER['REQUEST_URI'],0,4) == "http") { //Request URI has host in it $page = $_SERVER['REQUEST_URI']; } else { //Request uri lacks host $page = $protocol.$host.$_SERVER['REQUEST_URI']; } } else if (isset($_SERVER['SCRIPT_URI'])) { //Use URI - it is complete $page = $_SERVER['SCRIPT_URI']; } else { $file = $_SERVER['SCRIPT_NAME']; if (isset($_SERVER['QUERY_STRING'])) { $query = "?".$_SERVER['QUERY_STRING']; } } } if (empty($page)) { $page = $protocol.$host.$file.$query; } $page = abTrimAbVars($page); echo ($debug) ? "
  • This page is reported as: ".$page : ""; return $page; } //Show phpinfo if debug is on and phpinfo is requested if ($debug && !empty($_GET['phpinfo']) && $_GET['phpinfo']) { ?>
    getLinks(); ?>
  • Előre