Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/1

Az Internet működésének gyakorlati oldala

Ez a dokumentum-gyűjtemény nem része semmilyen hivatalos dokumentációnak, a http://intermatrix.hu/-ról származik. Az egyes oldalak frissítéséről, újabb verzióról az internetes oldalra látogatva, vagy jelen dokumentum hiperhivatkozásaira kattintva lehet tájékozódni. Előre megköszönöm, ha az egyes részekben felfedezett pontatlanságokkal, hibákkal kapcsolatos észrevételekről az itt tájékoztatsz, a hiba helyére utalva.

Copyright/Szerzői jog ©2015 InterMatrix.hu – saját licenc

Származékos műveket a dokumentum egészéről, vagy csupán valamely részéről bármilyen formában terjesztve úgy hozhatsz létre, hogy az eredeti műre hiperhivatkozással utalsz a http://intermatrix.hu/ megfelelő oldalára, mint forrásanyag. Amennyiben az új mű külön témakörönként és teljes egészében sem haladja meg a 30 százalékos egyezést, a felhasználási feltételeket magad határozod meg. Pénzt is kérhetsz érte.

A dokumentum változtatás nélküli elektronikus terjesztése nincs korlátozva. Honlapodon létöltésre kínálhatod, senki nem vonhat felelősségre érte, de terjesztésért semmilyen ellenszolgáltatást nem kérhetsz és kaphatsz.

Bármilyen eltérő feltételekkel történő felhasználásra engedélyt kell kérned: http://intermatrix.hu/mailer.

Siklódi József

A dokumentum legújabb kiadása: http://intermatrix.hu/download LAMP – Apache, PHP, MySQL és PHPMyAdmin telepítése Linuxra

(Frissítve: 2015-06-15 20:00) Debian/Ubuntu teszt szerver (Apache, PHP, MySQL, phpMyAdmin) telepítése és beállítása lépésről-lépésre. A fejlesztőgépen való tesztelés lehetősége.

Apache, PHP, MySQL és PHPMyAdmin Linuxra

A legtöbb tárhelyszolgáltató UNIX (Linux) alapú szervert működtet, éppen ezért érdemes minél jobban megismerni. Jól működő weboldalak elengedhetetlen kelléke, a fejlesztőgépen való tesztelés lehetősége, asztali környezetben. A később megírt internetes kódjaink, hatékonyabbak, minőségileg jobbak lehetnek.

Forráskódból való fordítástól egészen a könnyebb, grafikus felületű telepítési módszerek közül választhatunk. Nagyon sok, internetről letölthető, előre beállított megoldás létezik, amit a megfelelő operációs rendszerhez kiválasztva, csak telepíteni kell. Kétségtelen, hogy a legegyszerűbb megoldások és még működhet is megfelelően, azonban sok tekintetből hátrányosak. Sokkal átláthatóbb és később könnyebben boldogulunk, ha minden szükséges összetevőt, mi magunk külön-külön pakolunk fel és végezzük el a szükséges konfigurációs beállításokat, így számos előnyhöz juthatunk.

A mai, modernebb Linux disztribúciókon, a következő telepítési folyamatot teljes egészében végrehajthatjuk grafikus felületen is a csomagkezelőt használva. A részletek alaposabb megértése érdekében jobban járunk, ha a parancssoros megoldást választjuk.

A telepítést, beállításokat rendszergazdai (root) jogosultságokkal lehet elvégezni! Az alábbi leírás Debian/Ubuntu Linuxra vonatkozik, de átvihető más disztribúcióra is, azonban egyes telepítési könyvtárak, konfigurációs állományok különbözhetnek. Debian rendszeren su, míg Ubuntun sudo paranccsal szerezhetőek rendszergazda jogosultságok.

A leírás-sorozat a helyi sajátosságok, a könnyebb kezelhetőség, a kockázatok mérséklése miatt sok helyen eltér egy „standard” változattól. Az első kiadása óta az un.: standard telepítési módot és beállításokat, maguk a disztribútorok általában verzióváltáskor mindig megváltoztatták! Kényszerűségből, valamely komponens változásai miatt, vagy csak úgy, konkrét indok nélkül. Ilyenkor a leírás-sorozat egyes részeibe un.: elágazó frissítések kerülnek, utalva arra, hogy éppen mi érvényes.

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/3

Az Ubuntu 11.04 verziótól ajánlott figyelembe venni a Unity, a Canonical bevezetett új asztali környezetének kiforratlanságát – a leggyakrabban használt fejlesztőkörnyezeteket egyelőre használhatatlanná teszi!

Figyelmeztetés: A cikk feltételezi, hogy eddig nincs telepítve az Apache, a PHP, a MySQL, és a PHPMyAdmin. Ellenkező esetben szükséges lehet mindezek teljes eltávolítása, konfigurációs állományokkal együtt, majd az alábbi leírás szerinti újratelepítésre!

Példa a működésképtelen Apache2 teljes eltávolítására:

Figyelmeztetés: Ha már van egy működő szerverünk, vagy még semmi nincs telepítve, ezt a részt ne alkalmazzuk!

➢ Terminál megnyitása (Alkalmazások > Kellékek > Terminál) ➢ „root” jelölése: # ➢ felhasználó jelölése: ~$ ➢ jegyzet jelölése a konfigurációs állományokban: ### vagy ;;; ➢ Kijelölés/másolás, majd Enter lenyomása: ➢ (kijelölés Terminálban > Ctrl + Shift + C) ➢ (másolás Terminálban > Ctrl + Shift + V) ➢ Apache2 eltávolítása, maradványok kiiratása: # apt-get remove --purge $(dpkg -l apache* | grep ii | awk '{print $2}') ➢ www könyvtár törlése: # rm -r /var/www/ ➢ apache2 könyvtár törlése: # rm -r /etc/apache2/ ➢ Minden eddig eltávolított program beállításainak törlése: # apt-get purge `dpkg --get-selections | grep deinstall | awk '{print $1}'`

Figyelmeztetés: A leírás ezen szakaszát csak legvégső esetben, mikor már minden kötél szakadt, ajánlatos alkalmazni!

Apache2 telepítése:

Beállítófájlok szerkesztése közben előfordulhatnak elírásokból

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/4

következő szintaktikai hibák, melyeket az adott szoftver a hiba kijavításáig nem tud értelmezni! A hiba javítása után, amikor újra szükség van böngésző programra, a változások betöltése miatt gondoskodni kell a gyorsítótárának (cache) kiürítéséről!

➢ Telepítés: # apt-get install apache2 ➢ A Terminál megkérdezi a jelszót, meg kell adni, majd Enter lenyomása ➢ Elindul a telepítés, majd megkérdezi: Folytatni akarod [Y/n]? a válasz: Y ➢ Siker esetén, a válasz (Minden sikeres végrehajtás esetén így van. Egyes műveletek során figyelmeztető üzenetek is megjelenhetnek. A későbbiekben, a beállítások során orvosolhatóak.): [ OK ]

Apache2 tesztelése:

➢ Bármilyen webböngésző megnyitása, böngészősávba beírni: http://localhost Siker esetén, megjeleníti Index of / vagy It works oldalt (az oldal tartalma disztribúció függő). Más disztribúciók esetén a kapott információk lehetnek különbözőek.

Php5 telepítése:

➢ Telepítés (php5-gd, egyéb modulok telepítése opcionális): # apt-get install php5 libapache2-mod-php5 php5-gd ➢ Apache2 újraindítása: # /etc/init.d/apache2 restart  vagy: # service apache2 restart  vagy: # service apache2 reload

Php5 tesztelése:

➢ gedit program megnyitása, fájl létrehozása (Egyéb szerkesztő is használható, pl.: bluefish, vagy a még mindig kedvelt őskori szerkesztők valamelyike: vi, vim, mcedit,

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/5

nano…): # gedit /var/www/test.php ### Ubuntu 14.04 után: ### Debian 8 után: # gedit /var/www/html/test.php  Az Ubuntuban „for security reasons” az alapértelmezett /var/www gyökérkönyvtár a 14.04 verzió után, valamint a Debian 8 után így változott: /var/www/html, de az /etc/apache2/sites-available/000-default.conf fájl módosításával visszaállítható a korábbi „sztenderd”, # DocumentRoot /var/www/html DocumentRoot /var/www  vagy egyéb szempontokat is figyelembe véve, saját felhasználói könyvtáradba állítasz be virtualhostokat . Egyrészt, mert ahogy majd látni fogjuk, sokkal könnyebb saját szemétdombon a munka, másrészt a hackereknek mindig rutinszerű célpont a „sztenderd” DocumentRoot. ➢ Az új fájlba beírni, menteni a következőt, majd bezárni: ➢ Bármilyen webböngésző megnyitása, böngészősávba beírni: http://localhost/test.php ➢ Siker esetén, megjeleníti az eddigi műveletek eredményét táblázatba rendezve, melyből sok hasznos információ kiolvasható, éppen ezért nem ajánlott nyilvános oldalon megjeleníteni!

MySQL telepítése:

➢ Telepítés: # apt-get install mysql-server ➢ Telepítés közben megkérdezi mi legyen a „root” jelszó, meg kell adni. ➢ Befejezés utáni opcionális beállítások: # gedit /etc/mysql/my.cnf ➢ Amennyiben szükséges, a következő sorok értelemszerű megváltoztatása: ### language = /usr/share/mysql/english language = /usr/share/mysql/hungarian ### bind-address = 127.0.0.1 bind-address = új IP cím ➢ Mentés, bezárás.

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/6

PhpMyAdmin telepítése:

➢ Telepítés: # apt-get install libapache2-mod-auth-mysql php5-mysql phpmyadmin ### Ubuntu 14.04 és Debian 8 után: # apt-get install php5-mysql phpmyadmin ➢ Telepítés közben rákérdez a konfigurációs beállításokat illetően. Alapesetben Apache2 van kijelölve, ezt kell meghagyni. Az adminisztrátor jelszavának megadása után Enter megnyomásával befejeződik a telepítés.

PhpMyAdmin elérése:

➢ Szimbolikus link a PhpMyAdmin számára: # ln -s /usr/share/phpmyadmin /var/www/phpmyadmin ### Ubuntu 14.04 és Debian 8 után: # ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin ➢ A PhpMyAdmin elérése böngészőből: http://localhost/phpmyadmin Felhasználónév root, jelszó pedig a telepítés során megadott. Itt lehet MySQL felhasználókat és jogosultságaikat beállítani, számukra adatbázist létrehozni az adatbázist igénylő hosztok számára.

Befejezés utáni beállítások:

➢ php.ini: # gedit /etc/php5/apache2/php.ini

Változtatások: (Régebbi ini fájlokban lehetőség volt bűvészkedni register_globals ki- bekapcsolásával, amit biztonsági szempontból ideje volt megszüntetni, az újabb ini fájlokban már nincs is ilyen. Ha nem találsz register_globals sort, ne foglalkozz vele! A default_charset aktiválása bonyodalmakat okozhat a karakterkódolásban!) ;;; register_globals = On register_globals = Off

;;; default_charset = "iso-8859-1" default_charset = "utf-8"

date.timezone = Europe/Budapest

;;; MySQL beállítások ;;; ;;; régebbi változat használata:

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/7

extension = msql.so extension = msqli.so ;;; új változat használata, ha a régi nem működik: extension = mysql.so extension = mysqli.so

mysql.default_port = 3306

mysql.default_socket = /var/run/mysqld/mysqld.sock

mysql.default_host = localhost ➢ Változtatások mentése, fájl bezárása. ➢ Apache2 újraindítása: # /etc/init.d/apache2 restart  vagy: # service apache2 restart  vagy: # service apache2 reload

Remélhetőleg sikerült egy teljes HTTP kiszolgáló rendszert telepíteni, amelyhez szükség szerint további modulokat is telepíthetünk. További beállítások hiányában, csak egyetlen HOST kiszolgálására alkalmas, de a fejlesztés, fájlok feltöltése eléggé körülményes. Míg a valóságban egynél több internetes projekten dolgozunk párhuzamosan, gyakran különböző beállításokkal, a VirtualHost-ok létrehozásával mozgásterünk kiszélesedik. Érdemes elolvasni egy komplett környezet kialakítása érdekében.

Tovább » VirtualHostok létrehozása, beállítása:

Tovább » MySQL adatbázisok beállítása phpMyAdmin-nal

Tovább » Az Apache szerver alapvető biztonsága, PHP verzió elrejtése:

A dokumentum legújabb kiadása: http://intermatrix.hu/download VirtualHost-ok létrehozása, beállítása

(Frissítve: 2015-06-25 18:07) Név alapú virtuális hosztok optimális könyvtárszerkezete, működtetése, alapvető biztonsági beállításokkal elsősorban fejlesztőgépre kihegyezve.

VirtualHost-ok létrehozása Linux Apache, PHP, MySQL szerveren

A teszt szerver kialakítása cikk alapján, remélhetőleg egy működő HTTP kiszolgáló rendszert hoztunk létre. A rendszer, ugyan működik, de sok mindenre ebben a formában még nem alkalmas, nehezen kezelhető. Gondoljunk csak bele, ahány honlap, annyi igény és a rendszer biztonságáról sem szabad megfeledkezni.

A következőkben szó lesz arról, hogyan lehet végrehajtani a minimálisan szükséges finomításokat, továbbá, hogyan lehet elérni szerverünket saját gépnév alól, hogyan lehet létrehozni fejlesztés szempontjából is egy optimális könyvtárszerkezetet, hogyan lehet létrehozni név alapú virtuális hosztokat, és azokat működésre bírni, alapvető biztonsági beállításokkal.

Vegyük figyelembe, hogy egy éles rendszernél, sokkal több dologra kell tekintettel lenni az itt leírtaknál! Az alábbi leírás Debian/Ubuntu Linuxra vonatkozik, de átvihető más disztribúcióra is, azonban egyes telepítési könyvtárak, konfigurációs állományok különbözhetnek. A leírás-sorozat helyi sajátosságok, könnyebb kezelhetőség, kockázatok mérséklése miatt sok helyen eltér egy „standard” változattól!

Volt rá példa, hogy magasabb verziószámú operációs rendszerben egyes konfigurációs állományok megváltoztak helyileg vagy tartalmilag, úgyszintén a magasabb verziószámú Apache is megváltoztatta egyes direktíváit. Ebből következhet, hogy az alábbiak pontos követése mellett is hibajelzés fogadhat. Visszajelzésre vagy amint hasonló hibák tudomásomra kerülnek, azonnal frissítem a dokumentumot, – közösen segíthetünk másoknak…

public_html könyvtár létrehozása, beállítása:

➢ A könnyebb kezelhetőség kedvéért létrehozunk egy munka könyvtárat majdani a honlapok számára. (sudo használata nem kell saját könyvtárban. A user helyett, saját bejelentkező/könyvtár nevünket használjuk.): ~$ mkdir /home/user/public_html

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/9

➢ test.php fájl másolása az új munka könyvtárba: # cp /var/www/test.php /home/user/public_html/  A „/var/www” könyvtár a továbbiak szerint szükségtelen, de törlése nem kötelező.

public_html könyvtár feltöltése, beállítása:

Könyvtárak létrehozása (bármilyen ékezet nélküli név lehet) a tesztoldalak elhelyezésére, minden egyes honlap számára (sudo használata saját könyvtárban nem kell): ~$ mkdir /home/user/public_html/site1 /home/user/public_html/site2 /home/user/public_html/site3 ➢ Mindhárom új könyvtárba létre kell hozni egy-egy cgi-bin könyvtárat: ~$ mkdir /home/user/public_html/cgi-bin /home/user/public_html/site1/cgi- bin /home/user/public_html/site2/cgi-bin /home/user/public_html/site3/cgi-bin ➢ Az site1, site2, site3 könyvtárakat (az egyes honlapok gyökér könyvtárai) fel kell tölteni tartalommal, de legalább egy-egy index.html, vagy index.* fájl mindenképpen kell. Egy egyszerű trükkel pl.: ingyenes tárhelynél, ahol a konfigurációs állományok módosítására csekély lehetőség van, az alkönyvtárak tartalmának listázása is megakadályozható egy benne levő index.* állomány létezésével! Kivétel a cgi-bin könyvtár, ide szerver oldali szkriptek kerülnek, ezt az Apache2 védi. Szolgáltatónál elhelyezett honlapnál érdemes próbát tenni. ➢ Könyvtár jogosultságok beállítása (oktális; hozzáférési jogosultságok helyes formája): ~$ chmod -R 0775 /home/user/public_html/site1 /home/user/public_html/site2 /home/user/public_html/site3 ### vagy elég ennyi is: ~$ chmod -R 0775 /home/user/public_html ➢ Ha később dinamikusan szeretnénk létrehozni fájlokat, vagy fájlba írni, 0777 jogosultság szükséges: ~$ chmod -R 0777 /home/user/public_html Archív állományból való feltöltés esetén, ezt a műveletet újra el kell végezni. ➢ Könyvtár létrehozása log fájloknak (ajánlott rendszergazdaként): # mkdir /home/user/szerver_log

localhost konfiguráció:

Megjegyzés: Egyes disztribúciók a hostokra vonatkozó a külön-külön konfigurációs

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/10 tartalom tárolása helyett, az /etc/apache2/httpd.conf körülményesebben karbantartható állományt részesítik, de inkább csak részesítették előnybe. Más disztribúciók már nem használják a httpd.conf-ot, ahogy az Ubuntu 14.04 és Debian 8 sem. Nekünk a továbbiakban csupán akkor hasznos, ha egy régebbi rendszert babrálunk és az Apache újraindítás után a domain név hiányára figyelmeztet… Ha ez zavar bennünket (egyébként nem oszt, nem szoroz) az alábbiak szerint szerkesszük a httpd.conf-ot!

➢ httpd.conf szerkesztése: # gedit /etc/apache2/httpd.conf ➢ A fájl tartalma: ServerName localhost (semmi más! … A domain név hiányát többé már nem jelzi.) ➢ Fájl mentése, bezárása. ➢ localhost konfigurációs fájl szerkesztése (A későbbiekben egy általunk szerkesztett index.html-ből innen érhetjük el azokat a virtuális hosztokat, amiket majdnem hasonlóan hozunk létre.): # gedit /etc/apache2/sites-available/localhost ### Ubuntu 14.04 és Debian 8 után: # gedit /etc/apache2/sites-available/localhost.conf

➢ A fájl tartalma (Minden elírásból működésképtelenség következhet!): ServerName localhost ServerAdmin opcioná[email protected] DocumentRoot /home/user/public_html/ AddDefaultCharset UTF-8 AddCharset ISO-8859-2 .iso8859-2 .latin2 .cen AddType application/x-httpd-php .php ErrorLog /home/user/szerver_log/localhost.error_log CustomLog /home/user/szerver_log/localhost.access_log combined

### Ezt a részt innen minden host-hoz be kell tenni!!! ### HostnameLookups Off UseCanonicalName Off ServerSignature Off # Könyvtár listázás tiltása: IndexIgnore *

# szerver hiba: ErrorDocument 500 "Szerver hiba, ne piszkáld!" # ErrorDocument 500 "Szerver hiba, ne piszkáld!"

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/11

# Tiltott: ErrorDocument 403 "Nincs jogosultságod! Ne piszkáld!" # ErrorDocument 403 "Nincs jogosultságod! Ne piszkáld!" ### Eddig illeszteni!!! ###

ScriptAlias /cgi-bin/ "/home/user/public_html/cgi-bin/" AllowOverride None Options +ExecCGI -Includes

# Apache 2.4 előtt: Order allow,deny Allow from all

# Apache 2.4 és utánna: Require all granted Options Indexes FollowSymLinks MultiViews AllowOverride All

# Apache 2.4 előtt: Order allow,deny Allow from all

# Apache 2.4 és utánna: Require all granted

# phpMyAdmin elérése a http://localhost/phpmyadmin/ címen: Alias /phpmyadmin /usr/share/phpmyadmin ➢ Fájl mentése, bezárása. ➢ Ha az /etc/apache2/sites-available könyvtárban van alapértelmezett (default, vagy default.conf esetleg 000-default.conf, default-ssl.conf) konfigurációs fájl, kapcsoljuk ki mindet! Ettől a ponttól az egyes szájtok működését kizárólag az alábbiak szerint, egyedileg szerkesztett konfigurációs állományok határozzák meg.: # a2dissite default # a2dissite 000-default # a2dissite default-ssl ➢ Az új konfigurációs fájl bekapcsolása: # a2ensite localhost ➢ Tesztelés: # apache2ctl configtest

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/12

➢ Apache2 újraolvasás: # /etc/init.d/apache2 reload vagy: # service apache2 reload

home-host konfiguráció

Ezzel az opcionális beállítással a http://home-host (az-az: http://sajátgépemneve) címről is ugyanaz a tartalom érhető el, mint a http://localhost címen. Figyeljük meg, a localhost és a home-host konfigurációs sémája teljesen azonos, míg a site1, site2 stb. egymással!

➢ Gép név megállapítása: uname -n Az itt megtalált nevet kell alkalmazni a home-host helyett! ➢ home-host konfigurációs fájl szerkesztése: # gedit /etc/apache2/sites-available/home-host ### Ubuntu 14.04 és Debian 8 után: # gedit /etc/apache2/sites-available/home-host.conf

➢ A fájl tartalma: ServerName home-host.home ServerAlias home-host ServerAdmin opcioná[email protected] DocumentRoot /home/user/public_html/ AddDefaultCharset UTF-8 AddCharset ISO-8859-2 .iso8859-2 .latin2 .cen AddType application/x-httpd-php .php ErrorLog /home/user/szerver_log/home-host.error_log CustomLog /home/user/szerver_log/home-host.access_log combined

### A /etc/apache2/sites-available/localhost fájlból, a kommentek közti részt ide illeszteni! ###

ScriptAlias /cgi-bin/ "/home/user/public_html/cgi-bin/" AllowOverride None Options +ExecCGI -Includes

# Apache 2.4 előtt:

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/13

Order allow,deny Allow from all

# Apache 2.4 és utánna: Require all granted Options Indexes FollowSymLinks MultiViews AllowOverride All

# Apache 2.4 előtt: Order allow,deny Allow from all

# Apache 2.4 és utánna: Require all granted ➢ Fájl mentése, bezárása. ➢ Az új konfigurációs fájl bekapcsolása: # a2ensite home-host ➢ Tesztelés: # apache2ctl configtest ➢ Apache2 újraolvasás: # /etc/init.d/apache2 reload vagy: # service apache2 reload

site1, site2, site3... konfiguráció

➢ site1 konfigurációs fájl szerkesztése: # gedit /etc/apache2/sites-available/site1 ### Ubuntu 14.04 és Debian 8 után: # gedit /etc/apache2/sites-available/site1.conf ➢ A fájl tartalma: ServerName site1.home ServerAlias site1 ServerAdmin opcioná[email protected] DocumentRoot /home/user/public_html/site1/ AddDefaultCharset UTF-8

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/14

AddCharset ISO-8859-2 .iso8859-2 .latin2 .cen AddType application/x-httpd-php .php ErrorLog /home/user/szerver_log/site1.error_log CustomLog /home/user/szerver_log/site1.access_log combined

### A /etc/apache2/sites-available/localhost fájlból, a kommentek közti részt ide illeszteni! ###

ScriptAlias /cgi-bin/ "/home/user/public_html/site1/cgi-bin/" AllowOverride None Options +ExecCGI -Includes

# Apache 2.4 előtt: Order allow,deny Allow from all

# Apache 2.4 és utánna: Require all granted Options Indexes FollowSymLinks MultiViews AllowOverride All

# Apache 2.4 előtt: Order allow,deny Allow from all

# Apache 2.4 és utánna: Require all granted

Hogyha olyan állomány kerül feltöltésre amelynek karakterkódolása nem UTF–8, akkor az AddDefaultCharset UTF-8 sort írjuk át pl.: AddDefaultCharset ISO-8859-2. Így olvashatóvá tehető a feltöltött oldalak tartalma. Vedd figyelembe, hogy UTF–8 használatakor az idegen karaktereket csak egyszerűen beírod, anélkül hogy HTML entitásokkal szórnád tele a lapok kódjait!

➢ Fájl mentése, bezárása. ➢ Az új konfigurációs fájl bekapcsolása: # a2ensite site1 ➢ Tesztelés: # apache2ctl configtest ➢ Apache2 újraolvasás:

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/15

# /etc/init.d/apache2 restart vagy: # service apache2 restart vagy: # service apache2 reload ➢ A site2, site3 és minden további esetén, ez utóbbi eljárást kell megismételni, a kiemelt szövegrész értelemszerű megváltoztatásával.

A lokális domain nevek aktiválása

➢ hosts konfigurációs fájl megnyitása szerkesztésre: # gedit /etc/hosts ➢ A fájl tartalmának megváltoztatása: 127.0.0.1 localhost 127.0.1.1 home-host.home home-host 127.0.2.1 site1.home site1 127.0.2.2 site2.home site2 127.0.2.3 site3.home site3

# The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts ➢ Fájl mentése és bezárása. ➢ ports konfigurációs fájl megnyítása ellenőrzésre, szerkesztésre: # gedit /etc/apache2/ports.conf ➢ A fájl tartalma: # If you just change the port or add more ports here, you will likely also # have to change the VirtualHost statement in # /etc/apache2/sites-enabled/000-default

NameVirtualHost *:80 Listen 80

# SSL name based virtual hosts are not yet supported, therefore no # NameVirtualHost statement here

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/16

Listen 443 ➢ Apache2 újraolvasás: # /etc/init.d/apache2 restart vagy: # service apache2 restart vagy: # service apache2 reload

Hosztok elérése, végső próba:

Az eddigi munka sikeressége könnyen ellenőrizhető egy egyszerű index fájl jelenlétével a /home/user/public_html könyvtárba áthelyezett alap szerver gyökér könyvtárába.

➢ Index fájl létrehozása az alap szerver gyökér könyvtárába: ~$ gedit /home/user/public_html/index.html ➢ Az index.html tartalma – ha más nevek voltak beállítva, értelemszerűen kell megváltoztatni: VirtualHostok

➢ Próba: http://localhost, vagy http://home-host

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/17

Rewrite modul bekapcsolása a .htaccess számára:

A .htaccess fájl segítségével lehet szabályozni szerver állományokhoz való hozzáféréseket, átirányításokat, hibaüzeneteket, tartalmak jelszavas védelmét. Az Apache2-ben alapból nincs engedélyezve a .htaccess.

➢ Rewrite engedélyezés: # a2enmod rewrite ➢ Apache2 újraindítás: # /etc/init.d/apache2 restart vagy: # service apache2 restart vagy: # service apache2 reload

A .htaccess fájlt mindig 644 jogosultsággal kell elmenteni, ahogy egyébként a PHP fájlokat is. ~NIX rendszereken a ponttal kezdődő fájl rejtett!

Egyéb modulok bekapcsolása:

Az elérhető és bekapcsolható modulok könyvtárai: /etc/apache2/mods-available, /etc/apache2/mods-enabled.

➢ Fejlécek: # a2enmod headers pl. megjelenítés helyett kierőszakolható a PDF fájlok letöltésének felajánlása .htaccess- ben: ForceType application/octet-stream Header set Content-Disposition attachment ➢ Néhány további példa: SSL, Proxy, Http Proxy: # a2enmod ssl # a2enmod proxy # a2enmod proxy_http ➢ Kikapcsolás: # a2dismod modul_amit_akarsz ➢ Apache2 újraindítás: # /etc/init.d/apache2 restart

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/18

vagy: # service apache2 restart

PHP hibakeresés:

Eddig még, nem foglalkoztunk semmilyen hibakeresővel. Telepítése szándékosan maradt a végére, így a kész rendszerhez állíthatjuk be. Az Xdebug telepítése és beállítása következik:

➢ Terminálban adjuk ki a következő parancsot: # apt-get install php5-dev php-pear ➢ Amint végrehajtódott, jöhet a következő: # pecl install xdebug ➢ Megnyitjuk a php.ini fájlt szerkesztésre: # gedit /etc/php5/apache2/php.ini ➢ A fájl végéhez adjuk hozzá a következőket, és vigyázzunk a host-névre és ellenőrizzük a kiterjesztés útvonalát: [xdebug] zend_extension="/usr/lib/php5/20090626+lfs/xdebug.so" xdebug.remote_enable=1 xdebug.remote_host="home-host" xdebug.remote_port=9000 xdebug.remote_mode="req" xdebug.remote_handler="dbgp" extension="xdebug.so" ➢ Apache2 újraindítás: # /etc/init.d/apache2 restart vagy: # service apache2 restart vagy: # service apache2 reload

Tovább » MySQL adatbázisok beállítása phpMyAdmin-nal

Tovább » Az Apache szerver alapvető biztonsága, PHP verzió elrejtése

A dokumentum legújabb kiadása: http://intermatrix.hu/download MySQL adatbázisok beállítása phpMyAdmin-nal

(Frissítve: 2010-04-12 12:07) MySQL adatbázisok internetes menedzselésére phpMyAdminnal, felhasználók és adatbázisok beállítása.

A phpMyAdmin, MySQL adatbázisok internetes menedzselésére PHP nyelven írt grafikus felületű eszköz, mely támogatja a leggyakrabban használt adatbázis műveleteket: adatbázisok kezelése, táblázatok, mezők, kapcsolatok, indexek, felhasználók, jogosultságok, stb. Képes SQL parancsokat futtatni, adatbázist exportálni, importálni. Teljesen platformfüggetlen, így bármilyen operációs rendszerre több féle modon telepíthető (az előre konfigurált komplex telepítő csomagok beállításai kevésbé felelhetnek meg elvárásainknak), ahol előzőleg PHP és MySQL motor lett telepítve. Futtatni grafikus böngészővel lehet.

Ingyenes tárhelyhez alapértelmezetten egyetlen adatbázist kapunk, melynek felhasználó neve a regisztrációnál megadott név, míg jelszava szintén a regisztrációnál megadott jelszó. Fizetős tárhelyeknél több adatbázis használata is lehetséges. Az adatbázisok beállítására a tárhelyszolgáltató korlátozottan adminisztratív felületet biztosít, vagy maga végzi. Saját telepítés után, első alkalommal általában csak root névvel lehet bejelentkezni a http://localhost/phpmyadmin címen. Felhasználónév: root Jelszó: **********

Első bejelentkezéskor a böngészők többsége „nagyvonalúan” felajánlja a jelszó megjegyzését, mely igencsak biztonsági kockázatot jelent, ezért érdemes elutasítani. ➢ Kérdés: Szeretné, hogy a Firefox megjegyezze „root” jelszavát a(z) http://localhost helyen? ➢ Válasz: Ezen a webhelyen soha

Amennyiben előzőleg, telepítéskor gyenge erősségű jelszó volt beállítva, vagy gyanús betörési próbálkozások észlelésekor, és a későbbiekben is véletlen időközönként ajánlott a root (szuper-felhasználó) felhasználó jelszavát megváltoztatni a „Műveletek” címsor alatt. Tartalmazzon betűket, számokat, egyéb megjeleníthető írásjeleket. (Egyes tárhelyszolgáltatók számjegyekre és az angol ABC-re korlátozhatják.) A műveletek befejeztével, a kilépésre kattintva érdemes mindig megszüntetni a munkamenet folyamatot, elkerülve a visszaélés lehetőségét!

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/20

MySQL felhasználók és adatbázisok beállítása

„root” felhasználóként a felső menüsor „Jogok” menüjét választva a „Felhasználók áttekintése” címsor alatt megtekinthetők a telepítéskor automatikusan beállított felhasználók adatbázisai és jogosultságai. Mivel root felhasználó nevében új adatbázisok, vagy táblák létrehozása és kezelése igen sok veszéllyel járhat, megfontolandó szájtokként (site1, site2, site3) egy-egy új felhasználó hozzáadása és számukra egy vagy több adatbázis beállítása.

Az „Új felhasználó hozzáadása” hivatkozásra kattintva felhasználónként, a műveletet értelemszerűen meg kell ismételni: ➢ Bejelentkezési adatok: Felhasználónév: site1 Hoszt: localhost Jelszó: ********* Újraírás: ********* ➢ Adatbázis a felhasználó számára: Azonos nevű adatbázis létrehozása, és az összes jog engedélyezése ➢ Globális jogok: Nem kell beállítani semmit!

Az előbbi műveletek SQL paranccsal is végrehajthatóak: CREATE USER 'site1'@'localhost' IDENTIFIED BY '*********';

GRANT USAGE ON * . * TO 'site1'@'localhost' IDENTIFIED BY '*********' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

CREATE DATABASE IF NOT EXISTS `site1` ;

GRANT ALL PRIVILEGES ON `site1` . * TO 'site1'@'localhost';

Az egyes felhasználók adatbázisai és jogai rootként bejelentkezve bármikor tetszőlegesen módosíthatóak, pl.: egyik felhasználónak akár a másik feletti jogosultságokat is be lehet állítani. Hozzáférhet adatbázisaihoz, módosíthatja, törölheti, mint ahogy, valaki illetéktelen root jogokat szerezve az összes adatbázis adatait megszerezheti, meghamisíthatja, megsemmisítheti.

A Kilépés-re kattintva visszaléphetünk a PhpMyAdmin kezdőlapjára, ahol a site1 felhasználónév és a hozzá tartozó jelszó megadása után, az adatbázist kiválasztva, a „Műveletek” menüben megváltoztatható az adatbázis karakterkódolásának illesztése, javasolt: utf8_hungarian_ci, mivel a collation rendezéseknél, míg a general_ci az ékezetes betűket hátra sorolja, addig a hungarian_ci a helyükre teszi. Az SQL parancs:

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/21

ALTER DATABASE `site1` DEFAULT CHARACTER SET utf8 COLLATE utf8_hungarian_ci

Ahhoz, hogy az adatbázis használható lehessen, legalább egy vagy több táblát kell létrehozni. Ezt már mindenik felhasználó külön-külön megteheti saját jogosultságaival bejelentkezve, vagy erre írt PHP kóddal. Az így beállított adatbázisok CMS rendszerek kiszolgálására is sokkal alkalmasabbak. (A leírás 3.2.2.1 verzió alapján készült.)

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Apache szerver alapvető biztonsága

(Frissítve: 2011-06-03 08:14) Az Apache webszerver fejlécadatainak minimalizálása. PHP verzió elrejtése. Fájltípusok, rendszerfájlok védelme. Frissítések aktualizálása.

Amint egy bármilyen számítógép internetes hálózatra kapcsolódik mindig fenn áll a veszélye, hogy valaki(k) adatokat próbálnak megszerezni, vagy még ezen is túl, megszerezni a számítógép irányítását. Példának okáért az exploit egy olyan külső program, amely a saját gépen futtatott programkódban található programozási hibát használja ki, vagyis az exploit készítője ismeri a futtatott programok kódjainak hibáit és ezt kihasználva támadást intézhet.

Az internetes weboldalaknak közel 70 százalékát a rendkívül stabil és biztonságos Apache webszerver szolgálja ki. 100% biztonságról mégsem lehet beszélni. Szerencsére néhány egyszerű lépésen keresztül a biztonsági hiányosságokat minimalizálni lehet.

Frissítések aktualizálása

A biztonság legnagyobb méretű megsértését a szoftverek elavultsága okozza. A frissítések mellőzése kihasználhatóvá teszi az időközben felfedezett biztonsági réseket, programhibákat. Akik ezeket ismerik és érdekeltek, vagy kihívást éreznek hatalmas károkat okozhatnak. A biztonság érdekében tett legnagyobb lépés a kiadott frissítések aktualizálása, a lyukak befoltozása.

HTTP fejléc adatok minimalizálása

Jelentősen nehezíteni lehet a támadó dolgát, ha a lehető legkevesebb, néhány esetben hamis információhoz tud hozzáférni. Az Apache telepítési lehetőségei miatt alapértelmezetten néhány HTTP fejlécen keresztül (kiszolgáló aláírása) a dörzsöltebb kíváncsiskodók, kiolvashatják a szerver operációs rendszerére és alkalmazott szoftvereire vonatkozó információkat, beállításokat. ➢ Az apache2.conf fájl szerkesztése: sudo gedit /etc/apache2/apache2.conf ➢ A következő két sor hozzáadásával csökkenthető az Apache-ra és operációs- rendszerre vonatkozó információ mennyiség: ServerSignature Off ServerTokens Prod

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/23

➢ A változtatás elmentése után, az Apache2 újraolvasása szükséges: sudo /etc/init.d/apache2 reload

PHP verzió elrejtése

Alapértelmezett beállítással a PHP sem rejti véka alá verzió számát, de még az őt futtató operációs rendszerről is árulkodik. Az árulkodásért felelős változót a php.ini fájlban kikapcsolható. ➢ A php.ini megnyitása szerkesztésre: # gedit /etc/php5/apache2/php.ini ➢ A felelős változó kikapcsolása: ; expose_php = On expose_php = Off ➢ A változtatás elmentése után, az Apache2 újraolvasása szükséges: # /etc/init.d/apache2 reload

Fájltípusok, rendszerfájlok védelme

Tudatában, hogy a webes-alkalmazások nagyon is alkalmasak rendszerfájlok módosítására, rendszerparancsok futtatására, könnyen elképzelhető, milyen következményekkel járhat ennek szabályozásának elégtelensége. A következő beállítások hatékonyan blokkolják a fájlrendszer-hozzáférést, ugyanakkor a felhasználó saját könyvtárában szabadabban mozoghat. Az alapértelmezett httpd.conf (/etc/apache2/httpd.conf) fájl módosítása: ➢ Fájltípusok védelme: Deny from all ➢ Könyvtár és fájl hozzáférések szabályozása: ### Hozzáférések megakadályozása a rendszer és beállítófájlokhoz ### Order Deny, Allow Deny from All Options None ### szelektív hozzáférés biztosítása a virtualhostoknak ###

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/24

Order Allow, Deny Allow from All

A dokumentum legújabb kiadása: http://intermatrix.hu/download Apache webszerver saját SSL támogatással

(Frissítve: 2015-06-19 22:04) Technikailag megfelelő szintű titkosítást biztosító saját SSL létrehozása, ami tesztelésre, intranetes környezetben vagy egy meghatározott felhasználói kör számára, teljes mértékben elegendő lehet.

SSL alkalmazási területek

Az SSL (Secure Sockets Layer) technológia a webböngésző és a webszerver között közlekedő adatok titkosítására szolgál. A hagyományos „http” kapcsolaton az online vásárlások, pénzügyi tranzakciók, regisztrációs űrlapok adataihoz harmadik fél is hozzá férhet és saját célra fel is használhatják, amit persze meg is tesznek. A „https” webhelyeken az SSL-kapcsolat révén jobban garantált a fizetési és egyéb személyes adatok védelme.

Technikailag megfelelő szintű titkosítást biztosító SSL kulcsot bárki generálhat és telepíthet honlapjára, azonban az ön-kezűleg (self-signed) aláírt SSL tanúsítvány elfogadására külön rá kell beszélni a böngészőprogramokat és nem teljesen ok nélkül. A felhasználókat arra figyelmeztetik, hogy az SSL tanúsítvány érvénytelen, a kibocsátója ismeretlen, megbízhatatlan, amit a többség valós veszélyforrásként értékel. …Számos hivatalos tanúsítványhatóság létezik, amely pénzért vállalja a különböző szintű tanúsítványok aláírását, amit úgymond egy megbízható harmadik fél ír alá, ettől „megbízható”. Ettől tényleg megbízható? Sajnos nem mindig, de aki nem szeretne ügyfelet veszíteni, rá van kényszerítve egy „neki megfelelő hivatalos tanúsítvány” megvásárlására. A hivatalos tanúsítvány értékesítők azzal is szoktak érvelni, hogy a self-signed tanúsítványokat illetéktelenek bármikor le tudják másolni és annak felhasználásával hamis biztonságérzetet alakíthatnak ki a weboldal látogatóiban. Ez csak részben igaz, és kb. arányaiban egy hivatalos tanúsítványra is igaz lehet! Tehát, él az üzleti modell!

Tesztelésre, intranetes környezetben vagy egy meghatározott felhasználói kör számára, teljes mértékben elegendő lehet egy önmagunk által aláírt tanúsítvánnyal létrehozott biztonságos webkiszolgáló. Miután az egyes látogatóknak sikerül rábeszélnie böngészőjét ennek elfogadására, gyakorlatilag ugyanazt kapod ingyen, amit pénzért. Semmivel sem kevesebbet. Tudni kell viszont, hogy egyetlen IP-címmel rendelkező kiszolgálón nem jó több SSL-es név alapú virtuális gépet futtatni. Ugyan be lehet egy ilyen rendszert és az adatok így is titkosítottan közlekednek, viszont a látogatók figyelmeztető üzenetet kapnak, hogy a tanúsítvány nem egyezik a kiszolgáló nevével. Minden egyes SSL-re felkészített tartománynak saját IP-címmel kell rendelkeznie.

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/26

Saját SSL tanúsítvány készítés Debian/Ubuntu szerveren

Előfeltételként lennie kell egy saját LAMP szervernek és rajta legalább egy név alapú virtual-host beállítással. A továbbiakban a következetesen e két leírás tekintendő kiindulási pontnak.

OpenSSL modul telepítése

➢ Telepítés: # apt-get install openssl ➢ Könyvtár az SSL kulcsok számára: # mkdir -p /etc/ssl/localcerts ➢ Saját tanúsítvány generálása: # openssl req -new -x509 -days 365 -nodes -out /etc/ssl/localcerts/apache.pem -keyout /etc/ssl/localcerts/apache.key ### apache helyett saját_cégnév is használható # openssl req -new -x509 -days 365 -nodes -out /etc/ssl/localcerts/saját_cégnév.pem -keyout /etc/ssl/localcerts/saját_cégnév.key ➢ Könyvtár jogosúltságának beállítása: # chmod 600 /etc/ssl/localcerts/apache* ### saját_cégnév esetén: # chmod 600 /etc/ssl/localcerts/saját_cégnév* ➢ Néhány kérdésre kell válaszolni, szinte bármit, de azt pontosan jegyezzük fel, mert később a böngészőben való elfogadtatásra kellhet! (Nem baj az sem, ha semmire sem válaszolunk, de akkor az SSL kulcsok importálása, elfogadtatása a böngészőben nehezebb.) Country Name (2 letter code) [AU]: State or Province Name (full name) [Some-State]:Hungary Locality Name (eg, city) []:Budapest Organization Name (eg, company) [Internet Widgits Pty Ltd]:saját_cégnév Organizational Unit Name (eg, section) []:saját_cégnév Common Name (eg, YOUR name) []:saját_cégnév Email Address []: ➢ SSL modul bekapcsolása: # a2enmod ssl

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/27

SSL és SSL kulcsok beállítása egyik virtuális hosztra

➢ Elvileg valamikor elvégeztük a VirtualHost-ok létrehozását, beállítását. ➢ Keressük ki a site1 konfigurációs fájlt tovább szerkesztésre: # gedit /etc/apache2/sites-available/site1 ### Debian 8 után: # gedit /etc/apache2/sites-available/site1.conf

➢ A fájl tartalma: ServerName site1.home ServerAlias site1 ServerAdmin opcioná[email protected] DocumentRoot /home/user/public_html/site1/ AddDefaultCharset UTF-8 AddCharset ISO-8859-2 .iso8859-2 .latin2 .cen AddType application/x-httpd-php .php ErrorLog /home/user/szerver_log/site1.error_log CustomLog /home/user/szerver_log/site1.access_log combined

### A /etc/apache2/sites-available/localhost fájlból, a kommentek közti részt ide illeszteni! ###

ScriptAlias /cgi-bin/ "/home/user/public_html/site1/cgi-bin/" AllowOverride None Options +ExecCGI -Includes

# Apache 2.4 előtt: Order allow,deny Allow from all

# Apache 2.4 és utánna: Require all granted Options Indexes FollowSymLinks MultiViews AllowOverride All

# Apache 2.4 előtt: Order allow,deny Allow from all

# Apache 2.4 és utánna: Require all granted

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/28

➢ Minden ami itt található úgy kell megmaradnia, ahogy van! A legvégéről új sorba írjuk tovább az alábbiak szerint! ### SSL beállítás SSLEngine On SSLCertificateFile /etc/ssl/localcerts/saját_cégnév.pem SSLCertificateKeyFile /etc/ssl/localcerts/saját_cégnév.key

ServerName site1.home ServerAlias site1 ServerAdmin opcioná[email protected] DocumentRoot /home/user/public_html/site1/ AddDefaultCharset UTF-8 AddCharset ISO-8859-2 .iso8859-2 .latin2 .cen AddType application/x-httpd-php .php ErrorLog /home/user/szerver_log/site1.error_log CustomLog /home/user/szerver_log/site1.access_log combined

ScriptAlias /cgi-bin/ "/home/user/public_html/site1/cgi-bin/" AllowOverride None Options +ExecCGI -Includes Require all granted Options Indexes FollowSymLinks MultiViews AllowOverride All Require all granted ➢ Mentés és hibaellenőrzés: # apache2ctl configtest ➢ A módosított konfigurációs fájl bekapcsolása: # a2ensite site1

➢ Az /etc/apache2/ports.conf ellenőrzése: Listen 80

Listen 443

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/29

Listen 443 ➢ Apache2 újraindítás: # /etc/init.d/apache2 restart vagy: # service apache2 restart

Kész is vagyunk, egyéb teendőnk nincs. A webhely most már elérhető http és https előtaggal, azaz SSL nélkül (http://site1) és SSL támogatással (https://site1) is. Már csak a böngészőt kell rábeszélni, hogy elfogadja vagy importálja az SSL kulcsot.

A dokumentum legújabb kiadása: http://intermatrix.hu/download .htaccess védekezés lehetőségei és egyéb beállítások

(Frissítve: 2014-02-02 19:03) Átirányítások, hibaoldalak kezelése. Robotok tiltása. Betörések megfékezése.

HTTP státuszkódok

A webszerverek különböző sorszámú kódokat küldenek a HTTP munkameneteknek, amelyek naplózási adatokból visszakövethetőek és biztonságtechnikailag felhasználhatóak. Egy részük a fellépő hibákra utalnak, míg más részük a kapcsolat állapotáról tájékoztatnak. Az alábbiakban vázlatosan megjelenített státuszkódok részletes jelentését az RFC 2616 írja le. ➢ 1xx: Informatív – A szerver átmeneti választ küld a kliens kérésére. ➢ 2xx: Siker – A szerver elfogadja és teljesíteni tudja a kliens kérését. ➢ 3xx: Átirányítás – A kérés megválaszolásához további műveletre van szükség a kliens kérésének teljesítéséhez. ➢ 4xx: Kliens hiba – A kérés szintaktikailag hibás vagy nem teljesíthető. ➢ 5xx: Szerver hiba – A szerver belső hiba miatt nem tudta teljesíteni az egyébként helyes kérést.

Egyéni hibaoldalak

Egy egyszerű néhány oldalas, vagy bonyolultabb, sok funkcióval ellátott internetes portál rendszer, legyen az bármennyire alaposan megtervezett, fennállásának élettartamát mégis a kliensek és szerver közötti kapcsolatok szabályozása határozza meg. Persze a kódokba található biztonsági hibák nagy részét nem lehet ellensúlyozni. Tehát bizonyos tartalmak, kezelőfelületek hozzáférhetőségét felhasználói csoportok szerint illik kezelni, azaz a látogatást korlátozás nélkül bárkinek, vagy csak egy célcsoportnak engedélyezni és ilyenkor informatívan, a választás lehetőségét biztosítva átirányítani egy beépített saját keresőoldalra vagy honlaptérképre, esetleg adott esetben teljesen megtiltani a hozzáférést.

Nem létező oldalakra való hivatkozással kikényszeríthetőek a biztonsági beállítások hiányosságai, amelyeket nemcsak egyes látogatok szoktak tesztelni, hanem gyakran a keresőgépek robotjai is. Egy idő eltelte után, általában végzetes szokott lenni. A támadási kísérletek kiderítésére és megakadályozására nagyban segíthet egy hasonló webanalitikai rendszer működtetése. Apache szerver esetén az internetes portálok finombeállításai egyénileg kielégítően elvégezhetőek egy vagy több .htaccess fájl

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/31 feltöltésével könyvtárszinteknek megfelelően, – bár a könyvtárszintek kezelése kicsit nagyobb körültekintéssel egyetlen fájlból is megoldható. Az Apache oldalán megtalálható az alkalmazható direktivák vázlatos részletezése, amelyeket viszont egyénileg, az adott körülményekhez és célhoz kell idomítani.

Az alábbi példák nem arra hivatottak, hogy egy-az-egyben mindenkinek alkalmasak legyenek, mert akkor eleve maga a szerver program (Apache) látná el ezt a feladatot. A feltételek egymásra való kölcsönhatásaival, alakításával várható jó eredmény. RewriteEngine On RewriteBase / ServerSignature Off SetEnv TZ Europe/Budapest AddDefaultCharset UTF-8 IndexIgnore *

# 400 Bad Request: ErrorDocument 400 http://domain.tld/404.php # 404 Not Found: ErrorDocument 404 http://domain.tld/404.php # 401 Unauthorized: ErrorDocument 401 "Sorry! You are a bad browser, or you run a bad query!" # 403 Forbidden: ErrorDocument 403 "Sorry! You are a bad browser, or you run a bad query!" # 500 Internal Server Error: ErrorDocument 500 "After upgrading, immediately we come back!" ➢ Az átirányítás bekapcsolása ➢ Könyvtárszint beállítása, jelen esetben a gyökér (public_html) ➢ Szerver információk kikapcsolása (ajánlott) ➢ Időzóna beállítása (fontos, ha a szerver beállítása nem egyezik a magyar időzónával) ➢ Alapértelmezett karakterkódolás (különböző fájl-kiterjesztésekre eltérően is beállítható) ➢ Könyvtárlistázás tiltása (ha esetleg nincs index.* fájl a könyvtárban) ➢ A 400 és 404 hibakódra gyakorlatilag egyazon válasz küldhető. A kiváltó ok lehet véletlen elgépelt elérési út, de lehet egy buta keresőrobot próbálkozása is, vagy a legrosszabb eset, szándékos hiba kikényszerítés. A keresőrobotot 404-es fejléc elküldésével illik tájékoztatni az oldal nem létezéséről, hogy legalább az intelligensek ne próbálkozzanak újra. Erre a kondiciónált programozhatóság miatt nagyon jó lehet egy külön 404.php fájl.

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/32

HTML tartalomba ágyazott PHP kód. ➢ Az eddigi beállításokkal a 403 hiba soha nem fog jelentkezni, csakis akkor, ha előre meghatározott feltételek szerint tiltani kell valakik, vagy valamely oldalak látogatását. Beléptető rendszerek alkalmazásánál nem elhanyagolható a 403-as hibára adott érdemi válasz, viszont rossz indulatú kísérletek üres hibakóddal is eldobhatóak. ➢ A 401 és 403 hibakódra mindamellett, hogy külön fájl is készíthető, elegendő a .htacess fájlba írt rövid mondatban válaszolni, amiben csak ASCII karakterek használhatóak, ellenkezőleg szintaktikai hiba miatt 500-as hibakóddal elszállhat! A megjelenítésre szánt üzenetben viszont a kívül eső karakterek UTF–8 entitásba átkódolva helyesen jelennek meg. Á Á á á É É é é Í Í í í Ó Ó ó ó Ö Ö ö ö Ő Ő ő ő Ú Ú ú ú Ű Ű ű ű

Az UTF–8 entitások ismeretében akár HTML-ben formázott kétnyelvű hibakódok is kiküldhetőek htaccess-ből, mellesleg előnyösebb, mert a kereső robotok nem tudnak rákeresni: ErrorDocument 400 "

Bad Request/Rossz lekérés.

Pleas visit the Home page/Kérem látogassa meg a kezdő oldalt!

" ErrorDocument 404 "

Page not found/Nincs ilyen oldal.

Pleas visit the Home page/Kérem látogassa meg a kezdő oldalt!

" ErrorDocument 401 "Sorry! You are a bad browser, or you run a bad query!/Sajnálom! Böngészője vagy lekérése nem megfelelő!" ErrorDocument 403 "

Banned IP address/Letiltott IP cím.

Your browser probably is infected/Böngészője fertőzött lehet!

" ErrorDocument 500 "After upgrading, immediately we come back/Feltöltés, mindjárt kész!"

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/33

ErrorDocument 410 "Removed content/Visszavont tartalom."

Minden egyes hibakód külön sorba írandó. Sortörést nem tartalmazhat!

.htaccess átirányítások

Az átirányítások kulcsfontosságú szerepe jelentős a portál üzemeltetési kritériumai mellett, a támadások elleni védekezésben, SEO rangsorolásokban elérhető pozíciók betöltésében. A rugalmasabb és hatékonyabb átirányítások megoldhatósága megköveteli az un.: „kapcsoló zászlók” (flags) valamint reguláris kifejezések alkalmazását.

Átirányítás www előtag nélküli címre

Mára már funkcionálisan nem sok jelentőséggel bír, de az internetes keresők találataiban még érzékelhető a régi beidegződések gyakorisága. Figyelembe véve az emberek elkényelmesedését, jobb nem erőltetni a www előtagot. A HTTP protokoll szerint is teljesen közömbös a jelenléte. # redirect from www:

RewriteCond %{REQUEST_URI} !^/(robots\.txt|favicon\.ico|.*\.xml)$ RewriteCond %{HTTP_HOST} ^www\.domain\.tld [NC] RewriteCond %{HTTP_HOST} !^domain\.tld [NC] RewriteCond %{HTTP_USER_AGENT} !.*(google|q=cache|msn|bing).* [NC] RewriteCond %{HTTP_HOST} !^$ RewriteRule ^(.*)$ http://domain.tld/$1 [L,R=301,NC] RewriteRule ^index.php$ http://domain.tld/$1 [L,R=301,NC] ➢ Azon fájloknál és fájltípusoknál melyeket kereső robotok kérnek le, nem indokolt semmilyen átirányítás. ➢ Amikor a lekérés www előtaggal kezdődik. ➢ Amikor a lekérés nem www előtag nélküli. ➢ A keresőgépek robotjainak nem jó feltételeket szabni. ➢ Nincs lekérés (igen ritkán fordulhat elő). ➢ Az előbbi kondíciók megfelelően minden át lesz irányítva www előtag nélküli domain címre. ➢ Az index.php is át lesz irányítva www előtag nélküli domain címre.

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/34

Az átirányítás egyetlen sorral is megoldható, de mivel feltételek nélkül mindent átirányít, nem biztos, hogy ez a jó választás. RewriteRule ^www.domain\.tld http://domain.tld/$1 [L,R=301,NC]

Fájlkiterjesztés elrejtése

Az eljárás önmagában nem oldja meg a webhely oldalainak védelmét, de egy kis pluszt mindenképp odatesz. Az alábbi sor pl.: nemcsak a .php kiterjesztést teszi láthatatlanná, hanem az URL beírását is leegyszerűsíti. A látogatónak kényelmesebb, mert nem kell foglalkoznia a különböző kiterjesztések babrálgatásával. # remove php extension:

RewriteRule ^([\w]+)/?$ $1.php

Képek gyors-linkelésének megakadályozása

Pimasz lopásnak nevezhető a weboldal képeinek gyors-linkelése. Az eredeti webhelynek forgalomnövekedést okoz. Elég gyakori, még a feltörekvő keresőgépek közül is alkalmazzák néhányan. # hotlink:

RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?domain.tld/.* [NC] RewriteCond %{HTTP_REFERER} !.*(google|q=cache|msn|bing).* [NC] RewriteCond %{REQUEST_URI} !.*tolvaj.gif$ RewriteRule \.(png|gif|jpe?g)$ http://domain.tld/images/tolvaj.gif [NC,R,L] ➢ Ha létezik bármilyen hivatkozás. ➢ Ha a lekérés nem saját doménről érkezik. ➢ Engedélyezhetőek tetszés szerinti más domének is. ➢ Egy direkt erre a célra készített kép kivételének beállítása. ➢ A védendő képkiterjesztések beállítása, valamint a helyettesítő kép elérési útja. A tolvajló internetes oldalon az a mérsékelt és nem durva figyelmeztetést tartalmazó kép jelenik meg, ami itt be van állítva.

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/35

Domén átirányítás # old domain to new domain:

RewriteRule ^http(s)?://(www\.)?domain.tld/.* http://másikdomain.tld/ [R=301,NC]

Régi oldal átirányítása új oldalra # old file to new file:

RewriteRule ^régifájl http://domain.tld/újfájl [R=301,NC]

Fájl átirányítása másik domainre # file to new domain:

RewriteRule ^fájlnév http://másikdomain.tld/fájlnév [R=301,NC]

.htaccess tiltások

Az internet világában gyakoriak a tisztességtelen magatartásra utaló nyomok. Az információt annak ellenkezőjére is felhasználhatják, mint amire azt eredetileg szánták. Gyakran készítenek olyan néhány kódsorból álló keresőt, amivel a webhely tartalma bizonyos kulcsszavakra gyorsan feltérképezhető. Naplózási adatokat elemezve a .htacces fájl úgy alakítható, hogy egy elfogadható védelmi rendszert alkosson. Reguláris kifejezésekkel megadott feltételekkel szűrve a gyanús vagy kéretlen kéréseket 403 hibakóddal (Forbidden) eldobjuk. Az egyéni hibaoldalak beállításainak megfelelően válasz is küldhető, de mivel túlnyomórészt gépi kérésekről van szó, nincs sok értelme válaszadással is foglalkozni, bőven elég az egyszerű elutasítás.

Hamis böngészők tiltása

Az elküldött HTTP fejlécekben ismert böngészőnek hazudják magukat, de az igaziak más információkat is küldenek magukról, pl.: nyelvi beállítások. Az alábbi néhány sor, egy felemás lehetőség az ilyen jellegű védekezésre, mivel öngól is szerezhető, kerülendő, ha van jobb megoldás. # fake browsers:

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/36

RewriteCond %{HTTP_USER_AGENT} ^.*(msie|firefox|opera|chrome|safari).* [NC] RewriteCond %{HTTP_REFERER} !.*(google|q=cache|msn|bing).* [NC] RewriteCond %{HTTP:Accept-Language} ^$ RewriteRule ^(.*)$ - [F] ➢ Kulcsszavak amit a böngészők elküldenek magukról. ➢ Az internetes keresők felőli kérések kivételek. A Yahoot érdemes távol tartani. ➢ A nyelvi beállításra vonatkozó fejléc nincs elküldve. ➢ Minden válasz, üzenet nélkül visszautasítva.

IP tartományok és IP címek tiltása

Az IP alapú tiltás igazából átmeneti megoldásra sem a legmegfelelőbb. A tartomány ártatlan látogatóit nem illik büntetni, de kombinálva egyéb feltétellel, a betörési kísérletek igazi bűnösének elcsípése kevesebb tévedéssel járhat. # bad IP:

RewriteCond %{REMOTE_ADDR} ^119\.63\.(19[2-9])\. [OR] # bajdu spider RewriteCond %{REMOTE_ADDR} ^188\.165\.(19[2-9]|2[0-4][0-9|25[0-9])\. [OR] # OVH SAS RewriteCond %{REMOTE_ADDR} ^(202\.191\.42\.84|202\.29\.86\.7) # egyedi IP RewriteRule ^(.*)$ - [F] ➢ Baidu, kínai kereső IP tartománya. ➢ OVH, francia internetes vállalkozás IP tartománya. ➢ Egyedi IP címek. ➢ Minden válasz, üzenet nélkül visszautasítva.

Ártalmas robotok tiltása

Gonosz vagy „etikus hekkerek” néhány perc alatt készítenek céljaik végrehajtását teljesítő robotokat. Miután feladataikat teljesítették, többségük nyomtalanul eltűnik, de elég sok továbbterjed, miközben nem tudható milyen irányban fejlődik. # bad robots:

RewriteCond %{HTTP_HOST} ^http://(www\.)?images\.linuxidx\.com [NC,OR] RewriteCond %{HTTP_USER_AGENT} (^gvfs|libwww-perl|Python||^$| Zend_Http_Client|curl) [NC,OR]

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/37

RewriteCond %{HTTP_USER_AGENT} (Mail\.Ru|RoboFox|Top\Secret|Extractor|Ezooms| CCCP|MetaGeneratorCrawler|Typhoeus|EventMachine|TalkTalk) [NC,OR] RewriteCond %{HTTP_USER_AGENT} (XR2\.exe|xpymep\.exe|TurnitinBot|oBot|CMS) [NC,OR] RewriteCond %{HTTP_REFERER} ^-$ [OR] RewriteCond %{HTTP_REFERER} !^$ RewriteRule ^(.*)$ - [F] ➢ Egy internetes kereső kizárása, amely a képtalálatait pimasz gyors-linkeléssel oldja meg. ➢ Nem szokványos, programozható gépi adatgyűjtésre alkalmas böngészők. ➢ Szemrebbenés nélkül tiltható keresőrobotok. ➢ Az előbbi folytatása az olvashatóság miatt új sorban. ➢ A hivatkozásban csak egy kötőjel szerepel. ➢ Üres hivatkozás. ➢ Minden válasz, üzenet nélkül visszautasítva

robots.txt fájl elrejtése

A robots.txt fájl jelenlétének eredetileg az volt az értelme, hogy korlátozza a keresőrobotok hozzáférést a webhely bizonyos tartalmához. A keresőrobotoknak legelőször ellenőrizni kellene a robots.txt fájl jelenlétét, és betartani annak utasításait. Eddig a mese része… A valóságban majd mindenki megkerüli, mégpedig a User agent karakterláncban szokványos böngészőként azonosítva magát. Az InterMatrix.hu naplózási adataiból az IP cím, Host név és User agent adatok ismeretében a robots.txt fájl utasításait időnként a Bing, MSN, Yahoo, Bajdu, Yandex sem vette figyelembe.

Mindamellett, hogy a robots.txt jelenléte alig hatásos, tartalma bárki számára hozzáférhető és ezáltal, mintegy útmutatást ad a kényes tartalmak hollétéről. Láthatatlanná tenni úgy tudjuk, hogy a hozzáférést csak annak engedélyezzük, akiben megbízunk. # hide robots.txt

Order Deny,Allow Deny from All Allow from .com google.com google-analytics.com

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/38

Fájltípusok megjelenítésének tiltása, a letöltés kikényszerítése

A standard internetes fájltípusok mellett a böngésző másokkal is próbálkozik megbirkózni, de esetenként rosszabb eredmény várható, mintha azt egy arra a célra készült másik alkalmazás tenné. Ilyenkor megpróbálhatjuk kierőszakolni a „kritikus” fájl letöltését. # disable PDF view

ForceType application/octet-stream Header set Content-Disposition attachment

HTTP kérések szűrése

Szabályozni tudjuk, hogy milyen adatcsere jöhet létre a kliens és webszerver között. Nézzük a kérelmeket és hogy mire valók:

GET ➢ A kliens elérhető tartalmat kér a szervertől. POST ➢ A kliens adatokat küld a szervernek, pl.: űrlap kitöltésével. PUT ➢ A kliens dokumentumokat cserélhet le a szerveren, vagy újakat tölthet fel. DELETE ➢ A kliens dokumentumokat törölhet a szerverről. HEAD ➢ A kliens csak fejléc-információkat kér, semmilyen más tartalom nem érdekli. TRACE ➢ A kliens és a szerver válasza között megtett útvonal (proxy és más közbeékelődő gépek). OPTIONS ➢ A kliens szeretné meghatározni milyen módszerrel érje el a szerveren lévő dokumentum tartalmát. CONNECT ➢ A kliens egy átlátható kapcsolatot akar létrehozni a távoli gépre.

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/39

# deny on request method

RewriteCond %{THE_REQUEST} !^(GET|POST)\ /.*\ HTTP/1\.(0|1)$ [NC] RewriteRule ^(.*) - [F] ➢ A kérés nem GET vagy POST a HTTP 1.0 vagy HTTP 1.1 protokoll szerint. ➢ Minden válasz, üzenet nélkül visszautasítva.

SQL és egyéb támadások elleni védelem

A leghatékonyabb védekezési forma, amikor nincs engedélyezve az SQL betörésekre alkalmazható kifejezések bevitele, JavaScript kódok becsempészése űrlapelemekbe és laplekérésekbe. # bad query:

RewriteCond %{QUERY_STRING} ^.*(;|<|>|’|”|\)|%0A|%0D|%22|%27|%3C|%3E| %00).*(/\*|union|select|insert|cast|set|declare|drop|update|md5|benchmark).* [NC,OR] RewriteCond %{QUERY_STRING} ^\.\./ [NC] RewriteRule ^(.*)$ - [F] ➢ JavaScript, ASCII billentyűparancsok, SQL parancsok felderítése a lekérésben. ➢ Könyvtárszerkezet babrálása a lekérésben. ➢ Minden válasz, üzenet nélkül visszautasítva.

Vissza a feladónak

Amikor egy-egy webszolgáltatás vagy spam robot rendkívüli makacs pimaszsága szelídebb átirányításokkal nem kezelhető, akkor visszairányítjuk saját magára. # redirect bad bots

RewriteCond %{HTTP_REFERER} (^$|^-$) [OR] RewriteCond %{HTTP_USER_AGENT} (^$|^-$|woopingbot [NC] RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L] #RewriteRule ^(.*)$ http://%{REMOTE_ADDR}/$1 [R=301,L] ➢ Nincs hivatkozás vagy csak egy kötőjel. ➢ A robot nem azonosítja magát vagy „woopingbot”. ➢ Vissza irányítjuk arra a honlapra, ahonnan érkezett.

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/40

➢ Másik lehetőség, hogy vissza irányíthatjuk arra a gépre, ahonnan érkezett. Ha egy felhőszolgáltatás ügyfele indított támadást, meglehet, hogy mi a felhőszolgáltatót támadjuk vissza!

A dokumentum legújabb kiadása: http://intermatrix.hu/download PHP–MySQL alapú webanalitikai rendszer

(Frissítve: 2015-06-19 18:39) PHP–MySQL webanalitikai (-statisztikai) rendszer felépítése lépésenként, SQL lekérdezés példákkal.

Bármely web-oldal életképességének sikere megköveteli a folyamatosan változó látogatói tendenciák követését, a kliensektől érkező információk olyan elemzését, amely konstruktívabb következtetések levonására képeznek alapot pl.: kulcsszavak, útvonalak, technikai információk, tartalom népszerűsége, nem kívánatos támadások… Egy kielégítő ingyenes vagy fizetős szolgáltatással könnyen letudható, viszont rengeteg információt adunk ki magunkról és az is kérdés, hogy az „ingyenes”, meddig ingyenes? Saját rendszert üzemeltetve figyelembe kell venni a rendelkezésre álló erőforrásokat, cserébe viszont egy sokkal átfogóbb, rugalmasabb elemzésre van lehetőség. Jó emlékezni, hogy sem ingyenes, sem fizetős statisztikai (analizáló) rendszerek nem tudják teljes mértékben kiszűrni a hamis adatokat, így bizonyos mértékű hiba- százalékkal kell számolni!

Internetes oldalakon naponta találkozni „kutató cégek” által készített kételkedésre okot adó, (klónozott) felemás felmérési eredményekkel. Egy valamire való webanalitikai megoldással a legapróbb részletek is elemezhetővé válnak. Viszonylag egyszerű, mégis összetettebb MySQL adattábla létrehozása PHP nyelven nem túl bonyolult, viszont mindkét nyelv ismerete mellett néhány apró részletre fokozottan figyelni kell. Az adatok olvashatósága megköveteli a megfelelő karakterkódolást, jelen esetben: UTF–8. A tárolni kívánt adatok a MySQL számára emészthető formában kerüljenek elküldésre, mert ha valamiért nem tud teljesülni az adatok bevitele, vagy lekérdezése, a teljes web-oldal összeomlása mellett, a biztonsági kockázat is növekedik.

Feltételezve, hogy már létezik egy MySQL adatbázis, ebben szükséges egy olyan adattábla, melyben a begyűjtött adatok elmenthetőek. A tábla mezőinek adattípusát (INT, VARCHAR, TEXT) is fontos beállítani. Az elkövetkező műveleteket egyazon PHP program hajtja végre, vagyis kapcsolódik a már meglévő adatbázishoz és, ha még nem létezik, létrehozza az adattáblát. Feltölti azon oldalak látogatási adataival, amelyek beillesztéses hivatkozás hozzáadásával képesek lefuttatni ugyanezt a programot.

Amennyiben használni, módosítani vagy továbbadni szeretné a programot, vegye figyelembe: A megszerzett adatokból nem hozható nyilvánosságra olyan összeállítás, amely személyiségi jogokat sérthet, internetes támadásra, valamint egyéb visszaélésre adhat lehetőséget! Büntetőjogi felelősségre vonást eredményezhet!

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/42

Adatok megszerzése PHP kóddal

Itt kezdődik a tulajdonképpeni PHP program, „analitic.inc” néven elmentve (a kiterjesztés .php, vagy más is lehet). Következzen először a részletes ismertető, később a teljes kód:

Látogató adatai:

$time ➢ Formázott dátum és idő, oldal elérésének időpontja a http szerver szerint, a beállított időzónának megfelelően.

date_default_timezone_set ("Europe/Budapest"); $time = date ("Y-m-d H:i:s"); $ip ➢ A látogató IP-címe, amelyet az internetszolgáltatója kioszt – egyes látogatók IP-címe internet csatlakozásonként változhat (dinamikus-IP). A belső IP-címet, ha van, a program levágja.

$ip = $_SERVER ["REMOTE_ADDR"]; if (strstr ($ip, ',')) { $ips = explode (',', $ip); $ip = $ips [1]; } $host_name ➢ IP-címből kinyert hoszt név.

$host_name = @gethostbyaddr ($ip); $country, $region, $city, $latitude, $longitude ➢ Országnév, régió, város, földrajzi szélesség, földrajzi hosszúság – IP-cím alapján lekérdezett külső adat – lehetnek pontatlan adatok.

$url = unserialize (file_get_contents ('http://www.geoplugin.net/php.gp? ip=' . $ip));

$country = html_entity_decode ($url ['geoplugin_countryName'], ENT_NOQUOTES, 'UTF-8'); $region = html_entity_decode ($url ['geoplugin_region'], ENT_NOQUOTES, 'UTF- 8'); $city = html_entity_decode ($url ['geoplugin_city'], ENT_NOQUOTES, 'UTF-8'); $latitude = $url ['geoplugin_latitude']; $longitude = $url ['geoplugin_longitude'];

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/43

if (! $country) $country = "#"; if (! $region) $region = "#"; if (! $city) $city = "#"; if (! $latitude) $latitude = "#"; if (! $longitude) $longitude = "#"; ➢ A kódrészlet a http://www.geoplugin.net, egy teljesen ingyenes kiszolgálóról, tömb elemek formájában olvassa ki az adatokat és átkódolja UTF–8-ra. A kiszolgáló a Maxmind GeoLite City adatbázisát dolgozza fel, frissíti havonta. – Adatok megszerzésének gyenge pontja lehet a kiszolgáló felőli kapcsolat megszakadása, vagy éppen az adatok nem megfelelő kódolása! $agent_lang ➢ Böngésző által elfogadott nyelv – nem mindig azonos a böngésző által küldött adattal – később sokat segíthet a robotok azonosításában, mivel a böngészők jórészt elküldik a kétjegyű nyelvi kódot, míg a robotok inkább mellőzik.

isset ( $_SERVER ['HTTP_ACCEPT_LANGUAGE'] ) ? $agent_lang = substr ( $_SERVER ['HTTP_ACCEPT_LANGUAGE'], 0, 2 ) : $agent_lang = '#'; $http_user_agent ➢ Böngésző, vagy robot által, magáról küldött azonosító: böngésző név és verzió, böngésző nyelvi beállítása, operációs rendszer és verzió, kereső robotok azonosítója – az adatok lehetnek hamisak, néhány robot előszeretettel böngészőnek álcázza magát.

isset ( $_SERVER ['HTTP_USER_AGENT'] ) ? $http_user_agent = $_SERVER ['HTTP_USER_AGENT'] : $http_user_agent = '#';

Látogatás célja:

$query_string ➢ A böngésző lekérdezéséből kinyert karakterlánc, aminek segítségével megpróbálja elérni az adott oldalt – sokat segít a behatolási kísérletek megállapításában.

isset ( $_SERVER ['REQUEST_URI'] ) ? $query_string = urldecode ( $_SERVER ['REQUEST_URI'] ) : $query_string = ''; $get_page ➢ Böngésző, vagy robot kérésére elküldött válasz-oldal.

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/44

$get_page = urldecode ($_SERVER ["PHP_SELF"]); $http_referer ➢ A böngészés előzménye, amennyiben a látogató nem saját könyvjelzőjéből („direct”) érkezett, vagy a bővíthető lista alapján kizárható a robot látogatás, kiolvasható többek között a külső oldalak hivatkozása, valamint a keresőgépek által továbbított kereső- kifejezések.

function robot() { $botlist = array( "" => "80legs", "Abortion.sg" => "Abortion.sg", "AboutUsBot" => "AboutUsBot", "alexa" => "Alexa", "AppEngine-Google" => "AppEngine-Google", "^Baiduspider" => "Baiduspider", "" => "bingbot", "bitlybot" => "bitlybot", "Butterfly" => "Butterfly", "CC Metadata Scaper" => "CC Metadata Scaper", "CMS Crawler" => "CMS Crawler", "Cynthia" => "Cynthia", "Dillo" => "Dillo", "DotBot" => "DotBot", "Drupal" => "Drupal", "Exabot" => "Exabot", "facebookexternalhit" => "facebookexternalhit", "FeedValidator" => "FeedValidator", "Googlebot" => "Googlebot", "Google Web Preview" => "Google Web Preview", "Google Wireless Transcoder" => "Google Wireless Transcoder", "HTTrack" => "HTTrack", "HuaweiSymantecSpider" => "HuaweiSymantecSpider", "InAGist" => "InAGist URL Resolver", "Jakarta Commons-HttpClient" => "Jakarta Commons-HttpClient", "Java" => "Java", "Jigsaw" => "W3C_CSS_Validator", "JS-Kit URL Resolver" => "JS-Kit URL Resolver", "libwww-perl" => "libwww-perl", "MaMa CaSpEr" => "MaMa CaSpEr", "MJ12bot" => "MJ12bot", "MLBot" => "MLBot", "^Mozilla\\/4.0 \\(compatible;\\)$" => "Mozilla/4.0", "^Mozilla\\/5.0$" => "Mozilla/5.0", "" => "msnbot", "NetcraftSurveyAgent" => "NetcraftSurveyAgent", "NING" => "NING",

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/45

"NjuiceBot" => "NjuiceBot", "Nutch\\/Nutch" => "Nutch/Nutch", "nutch-crawler" => "nutch-crawler", "Plagger" => "Plagger", "PostRank" => "PostRank", "Purebot" => "Purebot", "Python-urllib" => "Python-urllib", "ScoutJet" => "ScoutJet", "Search17Bot" => "Search17Bot", "SeznamBot" => "SeznamBot", "Snapbot" => "Snapbot", "Sosospider" => "Sosospider", "Speedy Spider" => "Speedy Spider", "Summify" => "Summify", "TinEye" => "TinEye", "urlresolver" => "Google – urlresolver", "Voyager" => "Voyager", "W3C_Validator" => "W3C_Validator", "Wget" => "Wget", "woriobot" => "woriobot", "Yahoo! Slurp" => "Yahoo! Slurp", "YandexBot" => "YandexBot", "YandexImages" => "YandexImages", "Yeti" => "Yeti");

$out = ""; foreach ( $botlist as $string => $bot ) { isset ( $_SERVER ['HTTP_USER_AGENT'] ) ? $http_user_agent = $_SERVER ['HTTP_USER_AGENT'] : $http_user_agent = ''; if (preg_match ( "#$string#i", $http_user_agent )) { $out .= "Robot: $bot"; } else { $out .= null; } } return $out; }

if (robot () != null) { $http_referer = robot (); } elseif (robot () == null && ! isset ( $_SERVER ['HTTP_REFERER'] )) { $http_referer = "Direct"; } else { $http_referer = urldecode ( $_SERVER ['HTTP_REFERER'] ); }

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/46

Adatbázis műveletek megoldása PHP kóddal

A PHP program előbbi része nem csinált többet, mint összegyűjtött néhány adatot, azonban későbbi elemzésre mindezt valamilyen formában el is kell tárolni, ami egy MySQL adatbázis lesz. Folytatódik az előbbi PHP program az analitic.inc fájlban. MySQL kapcsolat adatai ➢ A MySQL kapcsolatnak megfelelő saját adatok megadása – tömbelemekként külön fájlban is szokás tárolni, ebben az esetben nincs sok értelme!

$server = 'localhost'; $username = 'username'; $password = 'password'; $database = 'site1'; $table = 'webanalitic'; Kapcsolódás a MySQL szerverhez ➢ Kapcsolódás felhasználó-névvel, jelszóval. Karakterkészlet beállítása és egy már előzőleg létrehozott adatbázis kiválasztása.

$conn_id = mysqli_connect ( $server, $username, $password ) or die ( "Nem elérhető az adatbázis szerver!" ); mysqli_query ( $conn_id, 'SET NAMES "utf8" COLLATE "utf8_general_ci"' ); mysqli_select_db ( $conn_id, $database ) or die ( "Nincs adatbázis kapcsolat!" ); Adattábla létrehozása ➢ Az adattáblát, ha más választás nincs, PHP programmal is létre lehet hozni, mint ahogy adatbázist is. Az „id” azonosító mező tartalmát a MySQL állítja elő, – elsődleges kulcs, amely automatikusan növel egy egész értéket, ahogy újabb bejegyzések kerülnek a táblába (sorszám).

$create_table = "CREATE TABLE IF NOT EXISTS $table (id INT( 9 ) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id), time DATETIME, ip VARCHAR(15), host_name VARCHAR(50), country VARCHAR(50), region VARCHAR(50), city VARCHAR(50), latitude VARCHAR(20), longitude VARCHAR(20), agent_lang VARCHAR(2), http_user_agent TEXT, query_string TEXT, get_page TEXT, http_referer TEXT) ENGINE = MyISAM CHARACTER SET utf8 COLLATE utf8_hungarian_ci;"; if (! mysqli_query ( $conn_id, $create_table )) { print "Az adattábla nem jött létre!\n"; } ➢ Alternatív SQL adminisztrációs alkalmazásban, ugyanaz az eredmény érhető el a következő kód megadásával.

CREATE TABLE IF NOT EXISTS webanalitic ( id int(9) NOT NULL AUTO_INCREMENT,

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/47

time datetime, ip varchar(15), host_name varchar(50), country varchar(50), region varchar(50), city varchar(50), latitude varchar(20), longitude varchar(20), agent_lang varchar(2), http_user_agent text, query_string text, get_page text, http_referer text, PRIMARY KEY (id) ) ENGINE = MyISAM CHARACTER SET utf8 COLLATE utf8_hungarian_ci Támadás elleni védelem ➢ A kódrészlet, csak a kapcsolat megteremtése után futtatható!

$username = mysqli_real_escape_string ( $conn_id, $username ); $password = mysqli_real_escape_string ( $conn_id, $password ); $http_user_agent = mysqli_real_escape_string ( $conn_id, $http_user_agent ); $query_string = mysqli_real_escape_string ( $conn_id, $query_string ); $get_page = mysqli_real_escape_string ( $conn_id, $get_page ); $http_referer = mysqli_real_escape_string ( $conn_id, $http_referer ); Adatok bevitele ➢ PHP programmal korábban összegyűjtött, ellenőrzött és behatolási kísérletek ellen védett adatok bevitele.

$insert_data = "insert into `$table` (`time`, `ip`, `host_name`, `country`, `region`, `city`, `latitude`, `longitude`, `agent_lang`, `http_user_agent`, `query_string`, `get_page`, `http_referer`) values ('$time', '$ip', '$host_name', '$country', '$region', '$city', '$latitude', '$longitude', '$agent_lang', '$http_user_agent', '$query_string', '$get_page', '$http_referer')";

if (! mysqli_query ( $conn_id, $insert_data )) { print "Nem sikerült adatot felvenni!\n"; } Kapcsolat lezárása

mysqli_close ($conn_id); exit();

?> ➢ PHP program vége, változások mentése.

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/48

Program futtatása

A program olyan PHP kódot futtató oldalakon használható, ahol beillesztő hivatkozás mutat rá. Érdemes kódsorok legvégére helyezni, hogy a látogató számára fontos tartalom betöltésének ideje ezzel se legyen késleltetve, pl.: az oldalszerkezet lábrészébe. A dinamikus, több részből álló oldalaknál csak a lábrészt tartalmazó fájlba kell elhelyezni. …

Az „analitic.inc” teljes kódja

// get ip number // check if ip is local or remote $ip = isset ( $_SERVER ['REMOTE_ADDR'] ) ? $_SERVER ['REMOTE_ADDR'] : ''; if (strstr ($ip, ',')) { $ips = explode (',', $ip); $ip = $ips [1]; }

// get host name $host_name = @gethostbyaddr ($ip);

// require geoinfo $url = unserialize (file_get_contents ('http://www.geoplugin.net/php.gp? ip=' . $ip));

$country = html_entity_decode ($url ['geoplugin_countryName'], ENT_NOQUOTES, 'UTF-8'); $region = html_entity_decode ($url ['geoplugin_region'], ENT_NOQUOTES, 'UTF- 8'); $city = html_entity_decode ($url ['geoplugin_city'], ENT_NOQUOTES, 'UTF-8'); $latitude = $url ['geoplugin_latitude']; $longitude = $url ['geoplugin_longitude']; if (! $country) $country = "#"; if (! $region) $region = "#";

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/49

if (! $city) $city = "#"; if (! $latitude) $latitude = "#"; if (! $longitude) $longitude = "#";

// get agent language isset ( $_SERVER ['HTTP_ACCEPT_LANGUAGE'] ) ? $agent_lang = substr ( $_SERVER ['HTTP_ACCEPT_LANGUAGE'], 0, 2 ) : $agent_lang = '#';

// get user agent isset ( $_SERVER ['HTTP_USER_AGENT'] ) ? $http_user_agent = $_SERVER ['HTTP_USER_AGENT'] : $http_user_agent = '#';

// get query string isset ( $_SERVER ['REQUEST_URI'] ) ? $query_string = urldecode ( $_SERVER ['REQUEST_URI'] ) : $query_string = '';

// get page returned $get_page = urldecode ($_SERVER ['PHP_SELF']);

function robot() { $botlist = array( "80legs" => "80legs", "Abortion.sg" => "Abortion.sg", "AboutUsBot" => "AboutUsBot", "alexa" => "Alexa", "AppEngine-Google" => "AppEngine-Google", "^Baiduspider" => "Baiduspider", "bingbot" => "bingbot", "bitlybot" => "bitlybot", "Butterfly" => "Butterfly", "CC Metadata Scaper" => "CC Metadata Scaper", "CMS Crawler" => "CMS Crawler", "Cynthia" => "Cynthia", "Dillo" => "Dillo", "DotBot" => "DotBot", "Drupal" => "Drupal", "Exabot" => "Exabot", "facebookexternalhit" => "facebookexternalhit", "FeedValidator" => "FeedValidator", "Googlebot" => "Googlebot", "Google Web Preview" => "Google Web Preview", "Google Wireless Transcoder" => "Google Wireless Transcoder", "HTTrack" => "HTTrack", "HuaweiSymantecSpider" => "HuaweiSymantecSpider",

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/50

"InAGist" => "InAGist URL Resolver", "Jakarta Commons-HttpClient" => "Jakarta Commons-HttpClient", "Java" => "Java", "Jigsaw" => "W3C_CSS_Validator", "JS-Kit URL Resolver" => "JS-Kit URL Resolver", "libwww-perl" => "libwww-perl", "MaMa CaSpEr" => "MaMa CaSpEr", "MJ12bot" => "MJ12bot", "MLBot" => "MLBot", "^Mozilla\\/4.0 \\(compatible;\\)$" => "Mozilla/4.0", "^Mozilla\\/5.0$" => "Mozilla/5.0", "msnbot" => "msnbot", "NetcraftSurveyAgent" => "NetcraftSurveyAgent", "NING" => "NING", "NjuiceBot" => "NjuiceBot", "Nutch\\/Nutch" => "Nutch/Nutch", "nutch-crawler" => "nutch-crawler", "Plagger" => "Plagger", "PostRank" => "PostRank", "Purebot" => "Purebot", "Python-urllib" => "Python-urllib", "ScoutJet" => "ScoutJet", "Search17Bot" => "Search17Bot", "SeznamBot" => "SeznamBot", "Snapbot" => "Snapbot", "Sosospider" => "Sosospider", "Speedy Spider" => "Speedy Spider", "Summify" => "Summify", "TinEye" => "TinEye", "urlresolver" => "Google – urlresolver", "Voyager" => "Voyager", "W3C_Validator" => "W3C_Validator", "Wget" => "Wget", "woriobot" => "woriobot", "Yahoo! Slurp" => "Yahoo! Slurp", "YandexBot" => "YandexBot", "YandexImages" => "YandexImages", "Yeti" => "Yeti");

$out = ""; foreach ( $botlist as $string => $bot ) { isset ( $_SERVER ['HTTP_USER_AGENT'] ) ? $http_user_agent = $_SERVER ['HTTP_USER_AGENT'] : $http_user_agent = ''; if (preg_match ( "#$string#i", $http_user_agent )) { $out .= "Robot: $bot"; } else { $out .= null;

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/51

} } return $out; }

// check if the visitor is a bot or direct connection if (robot () != null) { $http_referer = robot (); } elseif (robot () == null && ! isset ( $_SERVER ['HTTP_REFERER'] )) { $http_referer = "Direct"; } else { $http_referer = urldecode ( $_SERVER ['HTTP_REFERER'] ); }

// set databasa data $server = 'localhost'; $username = 'username'; $password = 'password'; $database = 'site1'; $table = 'webanalitic';

// set connection $conn_id = mysqli_connect ( $server, $username, $password ) or die ( "Nem elérhető az adatbázis szerver!" ); // set encoding mysqli_query ( $conn_id, 'SET NAMES "utf8" COLLATE "utf8_general_ci"' ); // select database and creata table if not exist mysqli_select_db ( $conn_id, $database ) or die ( "Nincs adatbázis kapcsolat!" ); $create_table = "CREATE TABLE IF NOT EXISTS $table (id INT( 9 ) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id), time DATETIME, ip VARCHAR(15), host_name VARCHAR(50), country VARCHAR(50), region VARCHAR(50), city VARCHAR(50), latitude VARCHAR(20), longitude VARCHAR(20), agent_lang VARCHAR(2), http_user_agent TEXT, query_string TEXT, get_page TEXT, http_referer TEXT) ENGINE = MyISAM CHARACTER SET utf8 COLLATE utf8_hungarian_ci;";

if (! mysqli_query ( $conn_id, $create_table )) { print "Az adattábla nem jött létre!\n"; }

// set protection $username = mysqli_real_escape_string ( $conn_id, $username ); $password = mysqli_real_escape_string ( $conn_id, $password ); $http_user_agent = mysqli_real_escape_string ( $conn_id, $http_user_agent ); $query_string = mysqli_real_escape_string ( $conn_id, $query_string ); $get_page = mysqli_real_escape_string ( $conn_id, $get_page ); $http_referer = mysqli_real_escape_string ( $conn_id, $http_referer );

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/52

// insert data in table $insert_data = "insert into `$table` (`time`, `ip`, `host_name`, `country`, `region`, `city`, `latitude`, `longitude`, `agent_lang`, `http_user_agent`, `query_string`, `get_page`, `http_referer`) values ('$time', '$ip', '$host_name', '$country', '$region', '$city', '$latitude', '$longitude', '$agent_lang', '$http_user_agent', '$query_string', '$get_page', '$http_referer')"; if (! mysqli_query ( $conn_id, $insert_data )) { print "Nem sikerült adatot felvenni!\n"; }

// close connection end exit mysqli_close ($conn_id); exit (); ?>

Lekérdezések

Az SQL nyelv ismeretében megszámlálhatatlan formában kérdezhetők le adatok. A továbbiakban az elemzési lehetőségek sokfélesége néhány lekérdezési példával lesz érzékeltetve. Országok szerint, ABC sorrendben

SELECT * FROM webanalitic WHERE country != '#' ORDER BY country ➢ Rekordok megjelenítése, ahol a „country” mezőben nem szerepel: „#”. Az adatok, eredetileg a Maxmind adatbázisból származnak. Városok szerint, ABC sorrendben

SELECT * FROM webanalitic WHERE city != '#' ORDER BY city ➢ Rekordok megjelenítése, ahol a „city” mezőben nem szerepel: „#”. Az adatok, eredetileg a Maxmind adatbázisból származnak. Kétes kilétű robotok feltérképezése és kizárása

SELECT country, city, ip, COUNT( ip ) AS 'alkalom' FROM webanalitic WHERE http_user_agent='' || http_user_agent REGEXP 'msie [1-6]' && agent_lang = '#' GROUP BY ip

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/53

➢ A rekordokban található IP-címekről érkező látogatások, mellőzik a „kötelező játékszabályokat” (kifogásolhatóan-, vagy nem azonosítják magukat), feltehetőleg nem tisztességes szándékkal érkeznek, ezért nem érdemes rájuk sávszélességet fecsérelni. Egyszerű védekezésképp, a következő kód, a PHP oldalak fejrészében elhelyezve hibaüzenetet küldve meggátolja az oldalak letöltését minden robotnak vagy böngészőnek, ahol a reguláris kifejezés megadott mintái egyeznek:


Your browser is not secure!"); } ?> ➢ A robotok kizárására számtalan más lehetőség létezik, sajnos sok esetben egyértelműen még sem azonosítható jó és rossz robot! Az előbbi sorok kirekesztik az InternetExplorer 6 és korábbi verzióinak jóhiszemű használóit is! Kereső kifejezések

SELECT IF( INSTR( http_referer, '?q=' ) , TRIM( SUBSTRING_INDEX( SUBSTRING_INDEX( http_referer, '?q=', -1 ) , '&', 1 ) ) , IF( INSTR( http_referer, '&q=' ) , TRIM( SUBSTRING_INDEX( SUBSTRING_INDEX( http_referer, '&q=', -1 ) , '&', 1 ) ) , IF( INSTR( http_referer, '?as_q=' ) , TRIM( SUBSTRING_INDEX( SUBSTRING_INDEX( http_referer, '?as_q=', -1 ) , '&', 1 ) ) , IF( INSTR( http_referer, '?p=' ) , TRIM( SUBSTRING_INDEX( SUBSTRING_INDEX( http_referer, '?p=', -1 ) , '&', 1 ) ) , NULL ) ) ) ) AS 'kereső kifejezés', COUNT( 1 ) AS 'alkalom', COUNT(DISTINCT ip) AS 'IP' FROM webanalitic WHERE http_referer REGEXP '(\\?q=|\\?p=|&q=|\\?as_q=)..' && http_referer NOT REGEXP '(\\?q=&|\\?p=&|&q=&|\\?as_q=&)' GROUP BY 1 ➢ A gyakrabban használt internetes keresőkből származó kereső-kifejezések ábécé sorrendben, annak gyakorisága és az azonos kifejezések IP-címeinek számossága. Oldalak népszerűsége

SELECT get_page, COUNT(1) AS 'alkalom', COUNT(DISTINCT query_string) AS

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/54

'oldal lekérés formák' FROM webanalitic WHERE http_referer NOT REGEXP 'robot' GROUP BY 1 ORDER BY 2 DESC ➢ Fontos emlékezni, hogy a PHP-kód „function robot()” függvénye azonosítja a robotokat! Az állandóan változó teljesség hiánya miatt, azokban a rekordokban is megbújhatnak robotok, ahol a „http_referer” mező a „direct” kifejezést tartalmazza. Külső hivatkozások keresőgépek és saját hivatkozások kizárásával

SELECT * FROM webanalitic WHERE http_referer NOT REGEXP '(^http:.*sajátdomain|robot|direct|\\?q=|\\?p=| &q=|\\?as_q)' ORDER BY http_referer ➢ A „http_referer” oszlop mutatja a külső oldalak hivatkozásait. Operációs rendszer statisztika

SELECT IF (http_user_agent REGEXP '(Linux|X11)' , 'Linux', IF (http_user_agent REGEXP 'Win' , 'Windows', IF (http_user_agent REGEXP 'Mac OS' , 'Mac OS', IF (http_user_agent REGEXP 'SymbianOS' , 'SymbianOS', IF (http_user_agent REGEXP 'J2ME/MIDP' , 'J2ME/MIDP', 'Robotok' ))))) AS 'Op rendszer', COUNT(1) AS 'összes', COUNT(DISTINCT query_string) AS 'lekérés formák', COUNT(DISTINCT get_page) AS 'válasz oldal', COUNT(DISTINCT ip) AS 'ip-címek', CONCAT(((COUNT( * ) / ( SELECT COUNT( * ) FROM webanalitic)) * 100 ),' %') AS 'arány' FROM webanalitic GROUP BY 1 Operációs rendszer és Windows verziók statisztika

SELECT IF (http_user_agent REGEXP '(Linux|X11)' , 'Linux', IF (http_user_agent REGEXP '(Windows NT 5.1|Windows XP)' , 'Windows XP', IF (http_user_agent REGEXP '(Windows NT 5.0|Windows 2000)' , 'Windows 2000', IF (http_user_agent REGEXP 'Windows NT 6.0' , 'Windows Vista', IF (http_user_agent REGEXP 'Windows NT 6.1' , 'Windows 7', IF (http_user_agent REGEXP '(Windows 98|Win 98|Win98)' , 'Windows 98', IF (http_user_agent REGEXP '(Windows 95|Win95|Windows_95)' , 'Windows

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/55

95', IF (http_user_agent REGEXP 'Mac OS' , 'Mac OS', IF (http_user_agent REGEXP 'SymbianOS' , 'SymbianOS', IF (http_user_agent REGEXP 'J2ME/MIDP' , 'J2ME/MIDP', 'Robotok' )))))))))) AS 'Op rendszer', COUNT(1) AS 'összes', COUNT(DISTINCT query_string) AS 'lekérés formák', COUNT(DISTINCT get_page) AS 'válasz oldal', COUNT(DISTINCT ip) AS 'ip-címek' FROM webanalitic GROUP BY 1

Amennyiben ennél többet szeretne, keresse a kapcsolat felvétel lehetőségét, vagy látogassa meg az ide vonatkozó hivatalos dokumentációs oldalakat! ➢ A PHP mysql függvényei: http://php.net/manual/en/ref.mysql.php ➢ A PHP mysqli függvényei: http://php.net/manual/en/ref.mysqli.php ➢ MySQL dokumentáció: http://dev.mysql.com/doc/

A dokumentum legújabb kiadása: http://intermatrix.hu/download UTF–8 előnyei más karakterkódolásokkal szemben

(Frissítve: 2010-06-26 13:40) Az UTF–8 változó hosszúságú, veszteségmentes karakterkódolási eljárás, a különböző karakterkódolási hiányosságok orvoslására.

Karakterkódolás – nemzetköziség

Az informatika fejlődése során számos karakterkódolási eljárás primitív elképzelésre épül, csak részben tudják kielégíteni a különböző nemzetek elvárásait. A változás folyamatát elősegítő technikai követelmények adottak. A hosszan tartó elhúzódás okai összetett negatív emberi tényezőkben keresendő.

A kialakult különböző kódtáblák más-más számkódokat párosítanak ugyanahhoz a karakterhez, az adott nyelv vagy a használt szoftver fejlesztőjének szükségleteihez igazodva. Gyakorlatilag egyik kódtáblából sem lehetséges előállítani mindazon (tipográfiai) írásjelek összességét, amelyekre valamely nemzeti nyelvnek különböző területein szükség lehet.

Az internet, a globalizáció előretörésével egyre erősebb az igény, hogy egyetlen univerzális karakterkódolást alkalmazzanak, amit minden szoftver, minden elektronikai kütyü ugyanúgy képes kezelni. Így képes legyen akár egyazon dokumentumban vagy eszközön különböző nemzeti nyelvek írásjeleit helyesen megjeleníteni. Mindezekre napjainkban csak az Unicode, illetve az Unicode alapra épülő optimálisabban kódoló UTF–8 alapú rendszerek képesek.

ASCII (American Standard Code for Information Interchange)

AZ ASCII kódrendszer kialakítása az 1963-as ASA (American Standards Association) szabványig nyúlik vissza. Az abban az időben létező mechanikus működésű perifériákra (teletype, telex, géptávíró) lett kifejlesztve.

Az ASCII karakterkészlet 128 hétbites, különböző kódot tartalmaz. Mindegyike egy-egy vezérlő vagy grafikus karaktert reprezentál. A latin ábécén alapul, de angol nyelvterületen kívül nem tudja kielégíteni az igényeket.

Használatának alkalmatlanságát a magyar és más nyelvterületen jól bizonyítják a korábbi távirati megoldások elterjedése.

➢ Tipográfiai szöveg: Ödön testvérem én hiába erőlködnék és írnék ékezeteket primitív gépen

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/57

➢ Duplázott magánhangzók: OOdoon testveerem een hiaaba eroolkoodneek ees iirneek eekezeteket primitiiv geepen ➢ Repülő ékezetek: O:do:n testve'rem e'n hia'ba ero"lko:dne'k e's i'rne'k e'kezeteket primiti'v ge'pen ➢ Ékezetek elhagyása: Odon testverem en hiaba erolkodnek es irnek ekezeteket primitiv gepen

ISO–8859-n (International Standard Organization, ISO)

A gépi megjelenítés elterjedése az angol nyelvterületen kívüli, egyre jobban felszínre hozta az ASCII hiányosságait. 1987-ben a nemzetköziség problémájának megoldására megszületett az ISO–8859 család első tagja ISO–8859-1 (Latin–1) néven, amely több nyugat európai nyelv ábécéjét támogatja, úgy mint: francia, német, spanyol, olasz és skandináv. Az első 127 karakter egy az egyben tartalmazza az ASCII készletet, valamint 161-től 190-ig különböző szimbólumokat és 191-től 255-ig a 215. és 247. hely kivételével ékezetes karaktereket.

Az ISO–8859 tervezésekor arra törekedtek, hogy több nyelvben is használhatók legyenek egymás betűi. A rendelkezésre álló 94-96 hely nem elegendő még a latin ábécét használó népek összes betűinek kódolására sem, de még mindig megoldatlan lenne a görög, arab, héber, cirill vagy más ázsiai népek igényei. Ennek érdekében jöttek létre a különböző ISO–8859-n kódtáblák. Kódolás Régió Nyelvek dán, holland, angol, finn, francia, német, izlandi, ír, olasz, norvég, portugál, rétoromán, ISO–8859-1 Latin–1 nyugat-európai skót, spanyol, és svéd, albán, afrikaans és szuahéli bosnyák, lengyel, horvát, cseh, szlovák, ISO–8859-2 Latin–2 közép-európai szlovén, és magyar ISO–8859-3 Latin–3 dél-európai eszperantó, máltai, török ISO–8859-4 Latin–4 észak-európai észt, lett, litván, grönlandi, és számi belorusz, bolgár, macedón, orosz, szerb, és ISO–8859-5 Cirill cirill ukrán ISO–8859-6 Arab arab arab ISO–8859-7 Görög görög görög, ó-görög ISO–8859-8 Héber héber héber

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/58

ISO–8859-9 Latin–5 török török, kurd A Latin-4 átrendezése, a északi nyelvek ISO–8859-10 Latin–6 északi számára ISO–8859-11 Thai thai thai ISO–8859-12 Nem készült el! Latin–6-ból hiányzó karakterek a litván és balti ISO–8859-13 Latin–7 balti nyelvekből ISO–8859-14 Latin–8 kelta gall, breton Átdolgozott nyugat-európai az Euro ISO–8859-15 Latin–9 nyugat-európai szimbólummal (€) délkelet- albán, horvát, magyar, olasz, lengyel, román, ISO–8859-16 Latin–10 európai szlovén, finn, francia, német és ír

A tejes magyar ábécét az ISO–8859-2 (latin–2) foglalja magába. Tartalmazza az előbbiből hiányzó magyar Ű, ű, Ő, ő betűket is a 219–251–212–244 helyeken, míg az ISO–8859-1-ben Û, û, Ô, ô betűk találhatóak. Magyar dokumentumokban gyakran találkozni még a Õ,õ, mint „helyettesítő” karakterek.

Az internetes böngésző programok a mai napig az ISO–8859-1 alapértelmezett kódolással jelenítik meg azon internetes oldalakat, amelyeknél nincs beállítva más karakterkódolás, de helytelen szerver beállítások is közrejátszanak. Ebből kifolyólag az ISO–8859-1 a 191–255 tartományában lévő karaktereket nem tudják helyesen megjeleníteni egy UTF–8-ban kódolt dokumentumban. A legtöbb böngésző program lehetőséget nyújt az oldal karakterkódolásának kézi kiválasztására.

A fentebb látott táblázatból egyértelműen kiderül, hogy a különböző ISO–8859-n kódolású dokumentumok átvitele nehézségeket okoz. Több nyelvű szöveg megjelenítésére alkalmatlan, jól tükrözi a létező problémát pl.: az elektronikus levelezés, vagy a gondatlanul szerkesztett internetes oldalak.

Az UTF–8 (8-bit Unicode Transformation Format)

A korábban említésre került problémák, a különböző karakterkódolási hiányosságok orvoslására 1993-ban Ken Thompson és Rob Pike munkája nyomán került hivatalos bemutatásra az UTF–8 egy San Diego-i USENIX konferencián.

Az UTF–8 változó hosszúságú, veszteségmentes karakterkódolási eljárás, a 16 bites (minden karakter két bájt) Unicode kódolásra épül. Az Unicode jel elhelyezkedésétől függően 1–4 bájtot használ. Zökkenőmentes átmenetet biztosít az ASCII vagy ISO– 8859-n alapú rendszerekből. Az egyes karakterek kódjai 8, 16 vagy 32-bites lehet. A

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/59

128 alatti kódú karakterek ábrázolása megegyezik az ISO–8859-n szerintivel, azaz teljesen megegyezik az ASCII-val. Hexadecimális Decimális UTF–8

0000 0000-0000 007F 00000 0-00000 127 0xxxxxxx 0000 0080-0000 07FF 000 128-0000 2047 110xxxxx 10xxxxxx 0000 0800-0000 FFFF 00 2048-000 65535 1110xxxx 10xxxxxx 10xxxxxx 0001 0000-0010 FFFF 0 65536-0 1114111 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Az UTF–8 lefedi az U+0000 és U+10FFFF közötti tartományt, azaz összességében 1.114.111 karakter kódolható.

Egyértelműnek látszik, hogy az angol nyelvet használók számára nem jelent nagyobb tárhely igényt a dokumentumok tárolására, de mindenki másnak igen. Tehát az ISO– 8859-cel összehasonlítva mindenki más „rosszul jár”. A magyar nyelvben az ékezetes betűk gyakoriságának függvényében 10-15% körüli terület növekedés határolható be.

Mindazonáltal, hogy az UTF–8-nak vannak hátrányai a korábbi kódolási rendszerekhez képest, be kell látni, hogy napjainkban sokkal inkább élvezhetőek előnyei. Az internetet böngészve többnyelvű szövegekkel találkozni azonos oldalon belül. Távolabbi országokba elektronikus levelet küldve nem kell aggódni, hogy nem tudják elolvasni. Megjelenhettek az ékezetes domain nevek. Nyelvi szótárak, fordítók számára nem jelent gondot a karakterkódolás. Sok különleges írásjel (matematikai, mértani, műszaki, zenei…) helyettesítésére nem kell képfájlokat illesztgetni a dokumentumokba.

Speciális karakterek bevitele

Dokumentumok írása közben gyakran van szükség speciális karakterek bevitelére, mint pl.: matematikai írásjelek, stb. vagy csupán helyes tipográfiai szöveget szeretnénk látni.

Mivel lehetetlen lenne a létező karakterekre alkalmas billentyűzetet készíteni, a mai Linux, Mac OS X és Windows operációs rendszerek billentyű kombinációk és a hexadecimális kód beírásával támogatják az Unicode karakterek bevitelét. A fejlettebb grafikus szerkesztő programok felajánlják a kiválasztható „szimbólumok” beszúrásának lehetőségét. A karakterkódok és egyéb beviteli módszerek az operációs rendszer karaktertáblájából tudhatóak meg. Beviteli billentyű kombinációk: Windows Hexadecimális kód majd Alt+X

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/60

Ctrl+Shift+U majd hexadecimális Linux kód

Példák: Név Kód írásjel kávé 2615 ☕ bekarikázott H 24BD Ⓗ idézőjel kezdő 201E „ idézőjel záró 201D ” másodlagos idézőjel 00BB » kezdő másodlagos idézőjel záró 00AB « gondolatjel 2013 – három pont 2026 … csere karakter FFFD �

A kívánt írásjel megjelenítésére nem elegendő ismerni a hozzá tartozó Unicode kódot, a használt betűkészletnek is tartalmaznia kell. Így az is meglehet, hogy böngészője nem tudja megjeleníteni mindenik kódolt karaktert az előbbi táblázatból. (Ennek az oldalnak verdana, helvetica, arial, sans-serif betűkészletek lettek megadva.)

Ezt a beviteli módszert a mai operációs rendszerek, szerkesztő programok közel azonos módon támogatják, azonban a nagyobb terjedelmű munkákat a „másolás és beillesztés (copy & paste)” módszer nagy mértékben hátráltatja, fáradtságossá teszi. Mindez kikerülhető, pl.: a célnak összeállított billentyűzetkiterjesztés létrehozásával. A legtöbb esetben a kezdeti többlet energia befektetésével, később rengeteg időveszteség, felesleges fáradozás megspórolható.

A Unicode 1992 megjelenése óta hosszú idő telt el, ennek ellenére most is vannak (megmaradtak) olyan programok amelyek nem kezelik az UTF–8-at. Az érvényes Unicode karaktertáblák a http://www.unicode.org/charts/ oldalon találhatóak.

Internetes oldalak UTF–8 kódolása

Amennyiben fontos a többnyelvűség, a létrehozott HTML vagy egyéb internetes dokumentumokat UTF–8 kódolással célszerű elmenteni. Komolyabb szerkesztő programoknál be lehet állítani alapértelmezettként is az UTF–8-at. Egyszerűbb szöveges szerkesztőknél mentéskor lehet kiválasztani a fájl karakterkódolását. Az

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/61 egyes dokumentumok karakterkódolásáról informálni kell a látogató böngészőjét, különben mint már volt említve, általában az alapértelmezett ISO–8859-1 kódolással jeleníti meg. ➢ HTML: … … ➢ XML: … ➢ PHP (mielőtt a PHP kód bármit is kiírna az oldalon): ➢ Apache web szerver konfiguráció (a direktívát ajánlatos inaktívvá tenni, ha a web szerver HTTP fejlécében karakterkódolás van definiálva felülbírálja a HTML-ben megadott kódolást): … AddDefaultCharset UTF-8 … ➢ .htaccess fájl (amelyik könyvtárban található, mindenre vonatkozik): AddDefaultCharset UTF-8

Megjegyzés: A karakterkészlet és karakterkódolás terminológiája logikai értelmezés szerint különböző, a valóságban egy bizonyos félreértés miatt egybemosódik.

A dokumentum legújabb kiadása: http://intermatrix.hu/download Reguláris kifejezések referenciája röviden

(Frissítve: 2012-08-27 19:25) Reguláris kifejezések a szövegek, adatok feldolgozására, minták alapján részhalmazok keresésére.

A reguláris kifejezés, egy szintaktikai szabályok szerint leírt minta, amely segítségével szövegek, adatok feldolgozásakor, egyező részhalmazok kereshetőek ki – karaktereket, számokat és helyettesítő karaktereket tartalmaz. Először Unixon kezdték használni, rendkívüli hatékonyságának köszönhetően mára szinte mindenik programozási nyelvbe beépítették. A reguláris kifejezéseket a legtöbb programnyelv esetenként eltérő saját beépített függvényekkel támogatja.

Megemlítendő, a különféle szabványoknak az ASCII kódoláson kívül eső betűk mostoha kezelése. Gyakori probléma például, egy több byte-os karakter (pl.: ékezetes betű) illeszkedése a mintában, az ékezetes szavak ábécé szerinti rendezése. Hogyha a kifejezésben a karakterlánc hossza is feltétel, a számlálás byte-onként balra tolódik, így az elvárástól eltérő eredményre lehet számítani. A Perl-stílusú reguláris kifejezések képesek az UTF–8 szövegek kezelésére.

Metakarakterek (Metacharacters)

\ ➢ (escape karakter) – az utána következő metakarakterre illeszkedik pl.: "\*" csillag karakterre, "\\" visszaperjelre . ➢ (pont) – bármely, kivéve az új sor karakter ^ ➢ (kalap jel) – a minta kezdete $ ➢ (dollár jel) – a minta vége | ➢ (pipa) – logikai elágazás, előtte vagy utána levő kifejezés [] ➢ (szögletes zárójel) – karakter osztály, a szögletes zárójelek közötti karakterek valamelyikeire bármilyen sorrendben illeszkedik () ➢ (kerek zárójel) – csoportosítás, a kerek zárójelek közötti karakterekre pontos

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/63

sorrendben illeszkedik [^ab@] ➢ (tagadás a karakter osztályban) – bármi, kivéve a, b vagy @ [0-6] ➢ (karakter osztály tartomány) – 0 és 6 közötti számokra illeszkedik [a-fA-F] ➢ (karakter osztály tartomány) – ASCII kis és nagy betűkre illeszkedik a-tól f-ig

Ismétlések (Quantifiers)

* ➢ (csillag) – a minta 0 vagy többszöri ismétlése + ➢ (plusz) – a minta 1 vagy többszöri ismétlése ? ➢ (kérdőjel) – a minta 0 vagy egyszeri ismétlése {3} ➢ (intervallum) – a mintában pontosan három karakter lehet {3,} ➢ (intervallum) – a mintában legalább három vagy több karakter lehet {,3} ➢ (intervallum) – a mintában legfeljebb három karakter lehet {1,4} ➢ (intervallum) – a mintában legalább egy, legfeljebb négy karakter lehet

Ismétlések lomhán (Quantifiers not greedily)

*? ➢ (csillag és kérdőjel) – a minta 0 vagy többszöri ismétlése (lomhán) +? ➢ (plusz és kérdőjel) – a minta 1 vagy többszöri ismétlése (lomhán)

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/64

?? ➢ (kérdőjel és kérdőjel) – a minta 0 vagy egyszeri ismétlése (lomhán) {3}? ➢ (intervallum és kérdőjel) – a mintában pontosan három karakter lehet (lomhán) {3,}? ➢ (intervallum és kérdőjel) – a mintában legalább három vagy több karakter lehet (lomhán) {,3}? ➢ (intervallum és kérdőjel) – a mintában legfeljebb három karakter lehet (lomhán) {1,4}? ➢ (intervallum és kérdőjel) – a mintában legalább egy, legfeljebb négy karakter lehet (lomhán)

Ismétlések visszatérés nélkül (Quantifiers give nothing back)

*+ ➢ (csillag és plusz) – a minta 0 vagy többszöri ismétlése (visszatérés nélkül) ++ ➢ (plusz és plusz) – a minta 1 vagy többszöri ismétlése (visszatérés nélkül) ?+ ➢ (kérdőjel és plusz) – a minta 0 vagy egyszeri ismétlése (visszatérés nélkül) {3}+ ➢ (intervallum és plusz) – a mintában pontosan három karakter lehet (visszatérés nélkül) {3,}+ ➢ (intervallum és plusz) – a mintában legalább három vagy több karakter lehet (visszatérés nélkül) {,3}+ ➢ (intervallum és plusz) – a mintában legfeljebb három karakter lehet (visszatérés nélkül {1,4}+ ➢ (intervallum és plusz) – a mintában legalább egy, legfeljebb négy karakter lehet (visszatérés nélkül)

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/65

Escape-szekvenciák (Escape sequences)

\t ➢ (HT, TAB) – tabulátor \v ➢ (VT, TAB) – vertikális tabulátor \n ➢ (LF, NL) – új sor \r ➢ (CR) – kocsi vissza \a ➢ (BEL) – csengő \f ➢ (FF) – lapdobás \e ➢ (ESC) – escape

Általános karakter osztályok (Generic Character Classes)

\d ➢ decimális szám \D ➢ nem decimális szám, minden más \s ➢ szóköz karakter \S ➢ bármely más karakter a szóközön kívül \w ➢ bármely szó \W ➢ bármi, ami nem szó

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/66

Módosítók (Modifiers) m ➢ (PCRE_MULTILINE) – a "^" és "$" közötti több soros karakterlánc kezelése, belső sorokra illeszkedik i ➢ (PCRE_CASELESS) – kis és nagy betű érzékenység kikapcsolása s ➢ (PCRE_DOTALL) – csak egy sorra illeszkedik x ➢ (PCRE_EXTENDED) – szóközök és megjegyzések figyelmen kívül hagyása a mintában e ➢ a preg_replace() csereláncát PHP-kódként kezeli g ➢ minden előfordulásra illeszkedik u ➢ (PCRE_UTF8) – a mintát UTF–8 kódolású szövegnek tekinti A ➢ csak a karakterlánc elején illeszkedik (PHP) E ➢ csak a karakterlánc végén illeszkedik (PHP) U ➢ a legkevesebb karaktert tartalmazó találatokat adja vissza (PHP)

Feltételek (Assertions)

\b ➢ szóhatár \B ➢ bármi, kivéve szóhatár \A ➢ csak a karakterlánc elején egyezik

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/67

\Z ➢ csak a karakterlánc vagy újsor végén egyezik \z ➢ csak a karakterlánc végén egyezik

Másodlagos feltételek (Subassertions)

(?:bab) ➢ (nem emlékező zárójel) – illeszkedik a bab-ra, de nem emlékezik az illesztésre bab(?=szem) ➢ illeszkedik a bab-ra, ha azt a szem követi bab(?!szem) ➢ illeszkedik a bab-ra, ha azt nem a szem követi (?#ez itt egy megjegyzés) ➢ (megjegyzés) (?>\d+)bab ➢ teljesítmény növelés, ha a bab hiányzik (?(3)bab|szem)jankó ➢ illeszkedik a bab-ra, ha a harmadik rész egyezik, különben a szem-re

Posix, Unicode, Perl, ASCII karakter osztályok Posix Unicode Perl ASCII betűk és számok [:alnum:] \p{IsAlnum} [a-zA-Z0-9] betűk [:alpha:] \p{IsAlpha} [a-zA-Z] 0 és 127 kódok közötti karakterek [:ascii:] \p{IsASCII} szóköz vagy tabulátor [:blank:] [ \t] ellenőrző karakterek

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/68

[:cntrl:] \p{IsCntrl} [\x00-\x1F\x7F] decimális számok [:digit:] \p{IsDigit} \d [0-9] nem decimális számok \D [^0-9] nyomtatható karakterek, kivéve szóköz [:graph:] \p{IsGraph} [\x21-\x7E] nyomtatható karakterek és szóköz [:print:] \p{IsPrint} [\x20-\x7E] nyomtatható karakterek, kivéve betűk és számok [:punct:] \p{IsPunct} [-!"#$%&'()*+,./:;<=>?@[\\\]^_`{|}~] szóköz [:space:] \p{IsSpace} \s [ \t\r\n\v\f] szóköz (perl) \p{IsSpacePerl} \s nem szóköz \S [^\s] szó [:word:] \p{IsWord} \w [A-Za-z0-9_] nem szó \W [^\w] hexadecimális szám [:xdigit:] \p{IsXDigit} [A-Fa-f0-9] kisbetűk [:lower:] \p{IsLower} [a-z] nagybetűk [:upper:] \p{IsUpper} [A-Z]

PHP reguláris kifejezések függvényei

A PHP a reguláris kifejezések két fajtáját támogatja, a POSIX- és a Perl- kompatibiliseket.

POSIX függvények

A PHP az 5.3.0 verzió bevezetésével a POSIX függvényekre „Deprecated: Function ereg() is

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/69 deprecated…” elavultságot jelző hibaüzenetet ad! A kódot Perl-kompatibilissá kell konvertálni. ereg() ➢ egyezés vizsgálata eregi() ➢ egyezés vizsgálata (kis és nagy betű érzéketlen) ereg_replace() ➢ az egyezést a megadott szóra cseréli eregi_replace() ➢ az egyezést a megadott szóra cseréli (kis és nagy betű érzéketlen) split() ➢ az egyezés alapján a karakterláncot tömb elemekre darabolja spliti() ➢ az egyezés alapján a karakterláncot tömb elemekre darabolja (kis és nagy betű érzéketlen)

Perl-kompatibilis függvények preg_filter ➢ keresés és csere preg_match() ➢ egyezés vizsgálata preg_match_all() ➢ egyezés vizsgálata globálisan (az első egyezés után folytatja a keresést) preg_replace() ➢ az egyezést a megadott szóra cseréli preg_replace_callback() ➢ az egyezést a megadott függvényt meghívásával cseréli preg_split() ➢ az egyezés alapján a karakterláncot tömb elemekre darabolja preg_quote() ➢ az egyezés metakaraktereit literálissá változtatja preg_grep() ➢ visszaadja azokat a tömbelemeket, amelyek illeszkednek a mintára

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/70

Egyéb internetes források

➢ Perl-stílusú reguláris kifejezések ➢ A PHP Posix-stílusú regexp függvényei ➢ A PHP Perl-stílusú regexp függvényei ➢ A PHP több bájtos szövegkezelése

A dokumentum legújabb kiadása: http://intermatrix.hu/download PHP UTF–8 szövegek feldolgozása és reguláris kifejezések

(Frissítve: 2012-04-09 12:31) Megoldási kísérletek ékezetes és különleges karaktereket tartalmazó, multinacionális szövegek feldolgozására.

PHP karakterlánc függvények, UTF–8, szövegfeldolgozás

PHP UTF–8 szövegek feldolgozása és reguláris kifejezések

Megoldási kísérletek ékezetes és különleges karaktereket tartalmazó, multinacionális szövegek feldolgozására.

(Frissítve: 2012-04-09 12:31)

PHP karakterlánc függvények, UTF–8, szövegfeldolgozás

Valamennyi program(script)nyelv mondhatni igen gyatrán van felkészítve az Unicode szövegek feldolgozására, így a PHP is, annak ellenére, hogy az UTF–8 1993-as bemutatása után két évvel később jelent meg. Az UTF–8 előnyeiről, hátrányairól általánosságokban már volt szó korábban. Itt az ideje kicsit jobban körüljárni a dolgot programozástechnikailag is. A PHP nyelv korábbi változataiból „megmaradt” karakterlánc-kezelő függvények szerint egy karaktert pontosan egy bájt képvisel, tehát a kettő, a három vagy a négy bájtos betűknél csúnyán elcsúszik a számolás, az-az teljesen hibás eredmény következik belőle. Ennek mérséklésére találták ki a többájtos mb_ függvényeket, amelyek már hozzávetőlegesen helyesen működnek. Az mbstring kiterjesztés bevezetése a régi függvények átkonvertálását szolgálja, ha azt a php.ini fájban külön engedélyezzük. Meg kell jegyezni, ez utóbbi megoldás nem teljesen jó, teljes biztonsággal nem lehet rá alapozni. Könyvtárszerkezetektől függően a felülírás helyessége nem garantálható, de előfordulhat az is, amikor a PHP egyéb okok miatt nem állítható át. Ezért is nincs alapértelmezetten beállítva a kiterjesztés.

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/72

Felülíró függvények és az mbstring.func_overload értékei

érték eredeti függvény felülírt függvény Levelező függvény 1 mail() mb_send_mail() Karakterlánc függvények 2 strlen() mb_strlen() Ha az érték 3-ra van állítva, strpos() mb_strpos() a levelező függvény is felülíródik! strrpos() mb_strrpos() substr() mb_substr() strtolower() mb_strtolower() strtoupper() mb_strtoupper() stripos() mb_stripos() strripos() mb_strripos() strstr() mb_strstr() stristr() mb_stristr() strrchr() mb_strrchr() substr_count() mb_substr_count() Reguláris kifejezések 4 ereg() mb_ereg() Ha az érték 7-re van állítva, eregi() mb_eregi() minden függvény is felülíródik! ereg_replace() mb_ereg_replace() eregi_replace() mb_eregi_replace() split() mb_split()

Egy és több bájtos karakterlánc függvények

Egybájtos függvények Többájtos függvények chr() chunk_split() mb_convert_case() count_chars()

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/73 lcfirst() ord() parse_str() mb_parse_str() str_ireplace() str_pad() str_repeat() str_replace() str_rot13() str_shuffle() str_split() mb_split() mb_strcut() mb_strimwidth() str_word_count() strcasecmp() strchr() strcmp() strcoll() strcspn() stripos() mb_stripos() stristr() mb_stristr() strlen() mb_strlen() strnatcasecmp() strnatcmp() strncmp() strpbrk() strpos() mb_strpos() strrchr() mb_strrchr() strrev() mb_strrichr() strripos() mb_strripos()

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/74 strrpos() mb_strrpos() strspn() strstr() mb_strstr() strtolower() mb_strtolower() strtoupper() mb_strtoupper() mb_strwidth() mb_substitute_character() substr_compare() substr_count() mb_substr_count() substr_replace() substr() mb_substr() trim() ucfirst() ucwords() wordwrap() Reguláris kifejezések függvényei ereg() mb_ereg() ereg_replace() mb_ereg_replace() eregi() mb_eregi() eregi_replace() mb_eregi_replace() split() mb_split() spliti() sql_regcase()

Egyedi UTF–8 függvények, reguláris kifejezések

Egy másik igen kritikus rész, a reguláris kifejezések alkalmazása többájtos karakterekre. Nevezetesen a többájtos karakterosztályok, valamint az úgynevezett ismétlések (Quantifiers). Az igazi megoldások nem könnyűek, sajnos nagyon gyakran új időigényes egyedi függvényeket, programrészeket kell írni. ➢ mb_trim() – Szóközök eltávolítása a karakterlánc elejéről és végéről function mb_trim($string) {

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/75

$string = preg_replace ('/(^\s+)|(\s+$)/us', '', $string); return $string; }

/* * alkalmazás: */

$string = " Ősi írásokból égbe úszó őrtüzek újra üzennek. "; print mb_trim ($string); /* * eredmény: Ősi írásokból égbe úszó őrtüzek újra üzennek. */ ➢ mb_ucfirst() – A karakterlánc első betűjét nagybetűsre cseréli. function mb_ucfirst($string, $encoding = "utf-8") { mb_internal_encoding ("utf-8"); $strlen = mb_strlen ($string, $encoding); $string = mb_strtoupper (mb_substr ($string, 0, 1, $encoding)) . mb_substr ($string, 1, $strlen, $encoding); return $string; }

/* * alkalmazás: */

$string = "ősi írásokból égbe úszó őrtüzek újra üzennek."; print mb_ucfirst ($string); /* * eredmény: Ősi írásokból égbe úszó őrtüzek újra üzennek. */  Az mb_internal_encoding("UTF-8) függvény hívásával elhagyhatóak az UTF–8 paraméterek. ➢ mb_ucwords() – Minden szó kezdőbetűjét nagybetűsre cseréli. function mb_ucwords($string) { return = mb_convert_case ($string, MB_CASE_TITLE, "utf-8"); }

/* * alkalmazás: */

$string = "ősi írásokból égbe úszó őrtüzek újra üzennek.";

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/76

print mb_ucwords($string); /* * eredmény: Ősi Írásokból Égbe Úszó Őrtüzek Újra Üzennek. */  Az mb_convert_case() függvénnyel ugyanaz az eredmény érhető el! A következő három konverzió módozat állítható be: MB_CASE_UPPER, MB_CASE_LOWER, és MB_CASE_TITLE. ➢ mb_string_wrap() – Karakterlánc tördelése a $width paraméter szerint. function mb_string_wrap($string, $width = 70, $break = "\n", $encoding = "utf-8") { $strlen = mb_strlen ($string, $encoding); while ($strlen) { $array [] = mb_substr ($string, 0, $width, $encoding); $string = mb_substr ($string, $width, $strlen, $encoding); $strlen = mb_strlen ($string, $encoding); } return implode ($break, $array); }

/* * alkalmazás: */

$string = "Ősi írásokból égbe úszó őrtüzek újra üzennek."; print mb_string_wrap($string, 4); /* * eredmény: Ősi írás okbó l ég be ú szó őrtü zek újra üze nnek . */ ➢ rx_string_wrap() – Karakterlánc tördelése reguláris kifejezést használva. Az előbbi függvény eredményéhez hasonlót ad. function rx_string_wrap($string, $width = 70, $break = "\n") { preg_match_all ('/[\p{L}\w\W]{' . $width . '}/u', $string, $matches);

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/77

return implode ($break, $matches [0]); }

/* * alkalmazás: */

$string = "Ősi írásokból égbe úszó őrtüzek újra üzennek."; print rx_string_wrap($string, 4); /* * eredmény: Ősi írás okbó l ég be ú szó őrtü zek újra üze nnek */ ➢ rx2_string_wrap() – Karakterlánc tördelése reguláris kifejezést használva. Az előbbi két függvény eredményéhez hasonlót ad. function rx2_string_wrap($string, $width = 70, $break = "\n") { return preg_replace ('/(.{1,' . $width . '})/u', "$1" . $break, $string); }

/* * alkalmazás: */

$string = "Ősi írásokból égbe úszó őrtüzek újra üzennek."; print rx2_string_wrap($string, 4); /* * eredmény: Ősi írás okbó l ég be ú szó őrtü zek

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/78

újra üze nnek . */ ➢ function rx3_string_wrap() – Karakterlánc tördelése reguláris kifejezést használva. Az előbbi három függvény eredményéhez hasonlót ad. Ha a szó hossza nem nagyobb, mint a $width paramétere, a szóköz karakterekre illeszkedve tördel, különben a $width értékének megfelelően. function rx3_string_wrap($string, $width = 70, $break = "\n") { return preg_replace ('/(.{1,' . $width . '})(?:\s|$)|(.{' . $width . '})/u', "$1$2\n", $string); }

/* * alkalmazás: */

$string = "Ősi írásokból égbe úszó őrtüzek újra üzennek."; print rx3_string_wrap($string, 4); /* * eredmény: Ősi írás okbó l égbe úszó őrtü zek újra üzen nek. */ ➢ mb_wordwrap() – Karakterlánc tördelése reguláris kifejezést használva. Az előbbi ~wrap függvények eredményéhez hasonlót ad. Ha a szó hossza nagyobb, mint a $width paramétere, a $sign jellel külön jelöli a szó törést. function mb_wordwrap($string, $width = 70, $break = "\n", $sign = "⤿ ") { $string = preg_replace ('/([^\s]{' . $width . '})(?!$)/u', "$1" . $sign . " ", $string); return preg_replace ('/(.{1,' . $width . '})(?:\s|$)|(.{' . $width . '})/u', "$1$2\n", $string); }

/*

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/79

* alkalmazás: */

$string = "Ősi írásokból égbe úszó őrtüzek újra üzennek."; print mb_wordwrap($string, 4); /* * eredmény: Ősi írás ⤿ okbó ⤿ l égbe ⤿ úszó ⤿ őrtü ⤿ zek újra ⤿ üzen ⤿ nek. */ ➢ collect_emails() – Minden e-mail címet kilistáz a megadott szövegből. Az e-mail cím csak ASCII karaktereket tartalmazhat! function collect_emails($string, $break = "\n") { preg_match_all ('/([\w\-\.]+\@[\w\-]+\.[a-z]{2,6})/', $string, $matches) ? $message = implode ($break, $matches [0]) : $message = "E-mail cím nem található!"; return $message; }

/* * alkalmazás: */

$string = "Ősi írásokból@égbe.úszó őrtüzek újra üzennek."; print collect_emails ($string); /* * eredmény: E-mail cím nem található! */

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/80

$string2 = "Ősi [email protected] őrtüzek [email protected] újra@üzennek.22"; print collect_emails ($string2); /* * eredmény: [email protected] [email protected] */

Webmesterek, honlaptulajdonosok figyelmébe: internetes oldalakon e-mail címek publikálása nem ajánlott!

➢ email_validate() – E-mail kiszolgáló és a cím ellenőrzése formailag. function email_validate($email) { if (! preg_match ('/^([\w\-\.]+@[\w\-]+\.([a-z]{2}|com|edu|gov|org| net|info|biz|museum|travel))$/i', $email)) { $message = "Helytelen!"; } else { $host = preg_replace('/^[^@]++@/', '', $email); checkdnsrr ($host, "MX") ? $message = "Formailag helyes." : $message = "A „mail." . $host . "” kiszolgáló nem található!"; } return $message; }

/* * alkalmazás: */

$email = "Ősi írásokból@égbe.úszó őrtüzek újra üzennek."; print email_validate($email); /* * eredmény: Helytelen! */

$email2 = "[email protected]"; print email_validate($email2); /* * eredmény: Helytelen! */

$email3 = "[email protected]"; print email_validate($email3); /* * eredmény: A „mail.2egbe.com” kiszolgáló nem található!

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/81

*/

$email4 = "[email protected]"; print email_validate($email4); /* * eredmény: Formailag helyes. */

A dokumentum legújabb kiadása: http://intermatrix.hu/download Webes szabványok és webprogramozás

(Frissítve: 2009-11-18 10:46) HTML és CSS ismeret, webes szabványok, ajánlások, amelyek az internetes megjelenítés alapjait képezik.

Webes szabványokról

Ma már, az eszközök és alkalmazások legváltozatosabb tömkelege teszi lehetővé, hogy bárki könnyedén, akár szaktudás és jártasság nélkül internetes tartalmat létrehozhasson és azt mások számára elérhetővé tegye, azonban teljesen feleslegessé válhat a befektetett energia és a vele járó áldozat, ha senki vagy csak kevesen látogatják. Míg néhány éve elég volt némi HTML és CSS ismeret és tulajdonképpen ma is az internetes megjelenítés alapjait képezik, csupán erre támaszkodva nem lehet hosszabb távon gondolkodni.

Webes szabványokról a szó szigorú értelmében nem lehet beszélni, csupán ajánlásokról, melyek megfogalmazását Tim Berners-Lee (a HTML nyelv megalkotója, 1989–1990) vezetésével a World Wide Web Consortium (W3C) vállalta magára. Célja olyan specifikációk, irányelvek megfogalmazása, melyek hozzájárulhatnak a Web nyújtotta összes lehetőség mindenki által történő kiaknázhatóságára.

Alkalmazásuk minden bizonnyal számtalan előnnyel jár, ugyanakkor az ellentmondásosságok száma sem elhanyagolható. A böngészők, de gyakran verziónként is eltérő módon értelmezik a szabványokat. A webes fejlesztők idejük jelentős részét hasonló anomáliák leküzdésére fordítják: böngészőnként eltérő stíluslapok, képességi hiányosságok JavaScriptes orvoslása, stb. Másfelől további bonyodalom megfelelni a kereső robotok értelmező motorjainak. A részletes, több böngészőre kiterjedő tesztelés, sok fejlesztő számára világossá tette, hogy érdemes megválogatni azokat az elemeket és tulajdonságokat, melyek a legtöbb böngészővel azonos vagy hasonló eredményt mutatnak, az így megalkotott kód sokkal kevésbé korlátozza a bemutatásra szánt tartalom elérését.

Az összes szabvány ismerete lehetetlenség és szükségtelen is, az adott projekt megvalósításához legtöbbször csak kisebb szegmensét kell használni. „Az összes létező szabvány és ajánlás” gyűjteménye a http://www.w3.org/TR/ oldalon található.

A W3C oldalain számtalan ingyenes szintaktikai kódellenőrző és fejlesztő eszköz áll rendelkezésre: ➢ HTML, XHTML ellenőrző: http://validator.w3.org/ ➢ CSS ellenőrző: http://jigsaw.w3.org/css-validator/

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/83

➢ Egyéb ellenőrző eszközök: http://www.w3.org/QA/Tools/ ➢ Nyílt forráskódú szoftverek: http://www.w3.org/Status (W3C technológiákat tartalmaznak, sajnos tudásuk korlátozott, a mai követelményeknek sok esetben elavult)

A W3Schools W3C szabványokkal összhangban hasznos ingyenes oktató és gyakorló anyagokat tesz közzé: ➢ HTML: Basic, Advenced, Examples, References ➢ CSS: Basic, Styling, Box Model, Advenced, Examples, References ➢ XML: Basic, JavaScript, Advenced, Examples ➢ JavaScript: Basic, Objects, Advenced, Examples, References ➢ ASP: Basic, Objects, Advenced, Examples, References ➢ PHP: Basic, Advenced, Database, XML, Ajax, Reference ➢ SQL: Base, Advenced, Functions

A témáról számtalan könyv, ajánlás vélemény, egyéb fecsegés jelenik meg naponta. A helyes webprogramozás legtöbbször csak megválaszolatlan kérdés marad. Teljesen átfogó, mindenre érvényes útmutató elkészítése lehetetlen vállalkozás, habár a szabványok viszonylag hosszú életűek, a valóságban mégis egyre bonyolultabban összetett és gyorsan változó dologról van szó. Az újabb és újabb technológiák, trendek, divathullámok megszületése mindig valami újat, netán jobbat hoz vagy éppen a kaotikusságot gerjeszti.

Érdemes követni a Web szabványait?

Napjainkban az asztali számítógépen kívül sok egyéb eszközzel is el lehet érni internetes tartalmat, pl.: note(net)book, kézi számítógépek, mobiltelefon stb. Az ilyen gépek szoftverei szerényebb tudásúak, kevésbé tudják a hiányos érvénytelen kódot feldolgozni.

Sokan könnyelműségből a mai napig sem fordítanak kellő figyelmet a szabványosságra, felesleges hadoválásnak vélik, holott szabványos honlap készítése nem jelent nagyobb kihívást, mint egy igényesen formázott szöveges dokumentum elkészítése. Nem beszélve arról, hogy a honlap további életében a fejlesztő(k)nek mennyi plusz munkát, a megrendelőnek (ha van) pedig nem kívánt plusz terhet jelenthet egy-egy hiba megtalálása, kijavítása.

Számos előnnyel jár, ha egy valamire való honlapon egy letisztult (X)HTML tartalom és a megjelenés, külön CSS stíluslappal van szétválasztva. Az oldalakra egységes

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/84 megjelenést lehet ráhúzni anélkül, hogy mindenik oldal dizájnjával külön-külön kellene foglalkozni. Külön stíluslapokkal az oldalak kinézete könnyen igazítható a gyengébb képességű eszközökhöz tudásához is. Egy zavaros, elszemetelt kóddal ennek megvalósítása annyira lehetetlen, hogy inkább megéri elölről kezdeni mindent.

Ez még nem minden, hiszen a hosszabb életű webhelyek egynéhány oldalnál sokkal többet tartalmaznak. Az összegyűjtött tartalmat emberi munkával kezelni, zavartalan működését biztosítani elképzelhetetlen, mint ahogy mára a telefonközpontokat sem éri meg a kábelek kézi átdugdosásával üzemeltetni. A kiszolgálón működő és egyéb összehangolt programok állítják elő tárolt adatokból definiált szabályok szerint. Így jöhetnek szóba a dinamikusan előállított weboldalak, úgy mint a különböző területekre specializált portál rendszerek, tartalom kezelők és egyéb kommunikációs rendszerek, melyek programozástechnikailag csak szigorú szabályok szerint, rendszeres karbantartás mellett működhetnek.

És végül, bármennyire bonyolultnak tűnhet, vélhetően még egy jó darabig a weboldalakat kell igazítani a böngészőprogramok képességeihez, viszont jó jelnek mutatkozik, hogy a piaci versenyhelyzet kibontakozásának hatására a böngészők gyártói is kezdik belátni a szabványok betartásának értékét.

A szabványokat jól alkalmazó weboldalak kódjai rövidebbek, átláthatóbbak, jobban karbantarthatók és módosíthatók. Fenntartásuk legalább 30%-al kedvezőbb, kisebb sávszélességet foglalnak, a böngészőprogramok gyorsabban tudják feldolgozni, a kereső robotok könnyebben értelmezik, innen következik, hogy a marketing költségek is nagyságrendekkel alacsonyabbak lehetnek. A látogatók mint ügyfél is, szívesebben térnek vissza az akadálymentes oldalakra.

A dokumentum legújabb kiadása: http://intermatrix.hu/download Dinamikus Web-oldalak hatékonysága

(Frissítve: 2009-11-18 10:47) A dinamikusan előállított weboldalak hatékonysága, programozásának alapja, az internet működésével kapcsolatos ismeretek szükségessége.

Statikus vagy dinamikus webfejlesztés?

A statikus weboldal fogalma gyakorlatilag alig jelent többet, mint egy átlagos szövegszerkesztőben elkészíthető dokumentum átültetése a HTML leíró nyelvre. Tartalmilag, formailag csak kézi beavatkozással lehet megváltoztatni. Az (X)HTML és CSS segítségével szétválasztott tartalom és dizájn valamelyest tovább tudta éltetni ezt a kezdetleges, az internetes korszak kezdetére jellemző struktúrát. Előállítására úgynevezett WYSIWYG HTML Editor segítségével, különösebb szaktudás nélkül bárki sikeresen próbálkozhat. Az így elkészült oldalaktól komolyabb (nem feltétlenül anyagi) profitot nem lehet elvárni. Funkcionálisan csak egy online formába öltött szórólapot valósítanak meg. Bármilyen interaktív kommunikációra, automatizált internetes folyamatok megvalósítására alkalmatlanok. A múltat képviselik, az Internet történetének kezdeti korszakát idézik.

Dinamikus weboldalakat a dominánsabban szerver oldali, valamint kisebb hányadában kliens oldali programok állítanak elő tárolt adatokból, abban a pillanatban amikor a látogató böngészőprogramja tovább adja kérését a webkiszolgálónak. A háttérben valójában sokkal bonyolultabb komplexebb műveletek mennek végbe, mintsem azt egészében be lehessen mutatni. Jogosultsági szinten online lehet előállítani és elmenteni tartalmat, üzenetet továbbítani, adatbázisból vagy más kiszolgálókról gyűjtött adatokat feldolgozni és visszaadni, piackutatást és még sok egyéb dolgot végez(tet)ni.

A dinamikusan előállított weboldalak üzemeltetésének hatékonysága nem vitatott, viszont fejlesztése során komoly programozói tudás szükséges, az internet működésével kapcsolatos ismeret elengedhetetlen. A tartalom elfogadható megjelenítése mellett, éppen annyira fontos az adatok biztonsága is, az időszakonkénti rendszeres frissítés a bekövetkezett internetes változások okozta kihívásokhoz alkalmazkodva.

Az internetes oldalakat egyre inkább, valamilyen konkrét érdeklődési kör alapján jól behatárolható céllal látogatják. Olyan oldalakat preferálnak, ahol elsősorban anyanyelven érhetik el azokat az információkat, melyek érdeklik. Gyorsan tovább állnak, ha a dokumentumból lényegi dolgok kihámozására sok időt kell pazarolni. A hiányos, pontatlan és nehezen elérhető információt úgy kezelik, mintha ott sem lenne. A tudatalattiban már egy összeállított profillal keresik ami számukra fontos. A

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/86 dinamikus Web-oldalak lényegében a beérkező kérésre a profilnak megfelelően reagálva, generálnak le egy teljesen új egyedi dokumentumot, néhány szükséges statikus elemet integrálva. Összegezve, hatékonyan tudják kiszolgálni a látogató és szolgáltató igényeit.

Dinamikus webes rendszerek, érvek és ellenérvek

Dinamikus tartalom előállítására rengeteg, zömében szabadon használható nyílt forrású, kész rendszer áll rendelkezésre, mely valamilyen terület általános igényeit hivatott kiszolgálni kisebb-nagyobb hatékonysággal. Mindenképpen előnyösek abból a szempontból, hogy kevés tudással, viszonylag gyorsan lehet összeállítani a hozzá tartozó különböző komponensekből egy működő portálrendszert és azt működtetni. Érveket és ellenérveket szoktak felsorakoztatni, melyeket óvatossággal érdemes megfontolni, ha egyáltalán ki lehet szűrni belőlük a piaci szereplők egyoldalú exhibicionizmusát.

Zárt forrású rendszereknél a fejlesztő nem adja ki annak a kódját, így bármilyen módosítás eszközöléséért csak hozzá lehet fordulni. Rejtett funkciók beépítését, nem lehet kizárni. A mai viszonyok között, látható jelek nélkül is megszűnhet még egy stabilnak titulált cég is, és a csöppet sem olcsó befektetés használhatatlanná válhat. Bérelt szoftvernek lehet nevezni, miután a megrendelő nem tudja (akarja) fizetni a nyújtott támogatást, lehúzzák előtte a rolót.

Nyílt forrású, szabadon használható rendszereknek megvan az az előnyük, nincsenek rejtett funkcióik, esetleg gyakrabban adnak ki biztonsági és egyéb frissítéseket, melyek gyorsabban elérhetők. Jobban alkalmazkodnak a Web jellegéhez, melyből adódóan hosszabb életképességűek. Az előtérbe kerülő nemzetköziesség kérdését egyre jobban kezelik.

A nyílt forrás ugyanakkor hátrány is lehet, mindig akadnak akik a kódokat végigkövetve, egy-egy betörési rés megtalálásából hasznot remélnek. Ezek a rendszerek, úgynevezett építőkockákból tevődnek össze és egy-egy felhasználási területet általános megközelítésben próbálnak megoldani, ezáltal felépítésük bonyolultabb, működésük lomhább. A rendszerből szükséges részeket kiválasztva, tovább kell hangolni, gyakran átprogramozni, hiányzó funkciókat beépíteni. Ez a munka gyakran felérhet egy teljesen új rendszer megírásával és még mindig nem biztos, hogy üzleti célokra kifogástalan.

Népszerű rendszerek:

➢ Drupal: http://drupal.org/, http://drupal.hu/

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/87

➢ Joomla!: http://www.joomla.org/, http://www.joomla.org.hu/ ➢ Simple Machines Forum: http://www.simplemachines.org/ ➢ WordPress: http://wordpress.org/, http://word-press.hu/

Egyedi fejlesztések, legyen zárt vagy nyílt forrású, ha a rendszert körültekintően, a megrendelő céljaira hangsúlyozva szisztematikusan tesztelve írnak meg, sokkal biztonságosabban és hatékonyabban állják meg a helyüket. Komolyabb üzleti vagy kulcsfontosságú területeken gyakran saját fejlesztő csapattal szoktak dolgozni, épp a biztonság érdekében.

Letenni a voksot egyik vagy másik mellett elég nehéz dolog, a megvalósításra alkalmas fejlesztő kiválasztása sem könnyű. A referenciák, árak, mellébeszélések gyakran meggyőzően félrevezetőek lehetnek. Túlzás lenne mindenféle alaptalan előítéletekkel kezelni a dolgokat, mégis érdemes alaposan tájékozódni és szkeptikusnak lenni.

A dokumentum legújabb kiadása: http://intermatrix.hu/download Dinamikus Web-oldalak működésének alapja

(Frissítve: 2014-01-20 20:40) Dinamikus honlapok megtervezése, felépítése kipróbálható és letölthető egyszerűsített HTML, CSS és PHP példa kódokkal.

Dinamikus weboldalak megtervezése

Honlapok megtervezése, felépítése eléggé összetett dolog, a stratégia kialakításakor sok mindent kell figyelembe venni. Mindenképpen a legfontosabbak egyike, hogy a Web, jellegéből adódóan platformfüggetlen és rendszerfüggetlen. Sajnálatos módon a kapcsolatos oktató anyagok túlnyomó többsége nagyon elavult és ennek tetejében még részrehajló is.

Az internetes látogató, külön utasítások nélkül szereti könnyen megtalálni azt ami érdekli. Egy szisztematikusan felépített honlap weboldalai között akadálymentesen el tud navigálni és szívesebben tér vissza, ajánlja másoknak. Jól működő honlapok előfeltétele a minél alaposabban átgondolt tervezés. Érdemes felépíteni egy vázlatot, körvonalazni az elvárásokat, számításba venni a lehetőségeket. ➢ Mit kell bemutatni és ki(k)nek? ➢ Milyen funkciókat kell és mit nem kell tartalmaznia? Hogyan lehet integrálni a rendszerbe? ➢ Működtetéséhez milyen infrastruktúra szükséges? ➢ Fenntartása és üzemeltetése mennyire biztonságos és mennyibe kerül? ➢ Ki fogja karbantartani? Mennyire lehet automatizálni?

Weboldalak térbeli felosztása, grafikai szétválasztása

A(z) (X)HTML oldalakat több módon lehet felosztani, de mindig lényeges, hogy tartalmi összetevői logikusan kapcsolódva kerüljenek a legmegfelelőbb helyeikre. A jó struktúra szervezésének fontossága, hogy könnyen és lehetőleg minél kevesebb emberi munkával lehessen manipulálni, szükség esetén megváltoztatni a kinézetet vagy tartalmat úgy, hogy a honlap egészében ne keletkezzenek törések. Nagyon sok többlet munka és energia megspórolható.

Az oldalak felosztására még gyakran használják az elavult keretes (frameset) technikát. Az eljárás arra született, hogy csupán HTML eszközökkel egyszerűen megoldható legyen a honlap navigációs rendszere és a tartalom elhelyezése. Az elv,

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/89 több külön funkciókkal ellátott HTML oldal egybe ágyazása, ami nem egy elvetemült elképzelés, csakhogy a böngészőprogramok és internetes keresők a dokumentum (X)HTML forráskódjának alapján tudják megjeleníteni a tartalmat. Eddig minden rendben is van, azonban egy beágyazott oldal külön megjelenítése igencsak problémás lehet és ennek kivédésére semmilyen lehetőség nincs. ➢ Egy térben felosztott oldal csupasz HTML kódja (sample.html): Minta dokumentum

Fejléc

Állandó tartalom… Lógó, főmenü stb.

Almenü, speciális funkciók…

Az aloldal tartalmának főcíme

Alcím

Oldalanként változó tartalom…

 A dobozmodell (
) használata, még a böngészők eltérő értelmezésének ellenére is gyorsabb és rugalmasabban használható, mint a táblázatos felosztás, melynek

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/90

lassú betöltése egy méretesebb weboldal halálát is jelentheti. ➢ Az előbbi dokumentumhoz tartozó CSS kód: (sample.css): @CHARSET "UTF-8";

/* START common elements */ html,body { width: 1000px; margin: 0 auto; font-family: sans-serif; font-size: 0.9em; }

h2 { font-size: 1.1em; }

.green_border { color: green; border: 1px solid green; }

.gray_bg { background-color: #ccc; width: 100%; } /* END common elements */

/* START #top */ #top { width: 1000px; height: 125px; background-color: aqua; } /* END #top */

/* START #body_content */ #body_content { float: left; background: url("bg_sample.gif") #fff center repeat-y; }

#left { float: left; width: 230px; padding: 0 10px 0 10px; }

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/91

#center { float: left; width: 480px; padding: 0 10px 0 10px; }

#center h1 { font-size: 1.4em; }

#right { float: left; width: 230px; padding: 0 10px 0 10px; } /* END #body_content */

/* START #foot */ #foot { clear: both; width: 1000px; height: 75px; background-color: #aca; width: 1000px; }

#foot p { text-align: center; } /* END #foot */

Fontos, hogy a HTML címkék tulajdonságait CSS dokumentumban kell paraméterezni, így könnyen biztosítható minden további aloldal azonos grafikai sémája. Az előbbi kódokkal készült oldal itt tekinthető meg és a hozzá tartozó forrás háttérképpel együtt innen egyben letölthető. Módosításához egyszerű szöveges szerkesztő is használható, amennyiben UTF–8 kódolással tud menteni. Az UTF–8 kódolással kapcsolatos fogalmak a Karakterkódolások című oldalon vannak részletezve.

A HTML kód darabolása

A fentihez hasonló CSS kód, akár egy honlap összes aloldalain alkalmazható. A HTML kód ennél bonyolultabb, míg felépítés szempontjából nem változik, a tartalmi rész annál inkább.

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/92

Korábban volt szó az elavult keretes technika hátrányairól, viszont „egy kicsit átalakítva”, szerver oldali programozással továbbfejlesztve, meg lehet szabadulni az összes negatív tulajdonságaitól, kialakítható egy olyan rendszer, melyben a későbbiek során, az újabb tartalmak kreálásához már nincs szükség az ismétlődő kódok újraírására, sem pedig szakirányú tudásra.

A HTML kód darabolása három részre egyszerűsített példával szemléltetve: ➢ head.php " . print_title() . "\n"; ?>

Fejléc

Állandó tartalom… Lógó, főmenü stb.

Almenü, speciális funkciók…

 A head.php az összes HTML dokumentum kódjának első részét helyettesíti. A példában egy beépített PHP függvény váltogatja az oldal címére vonatkozó kódot. Megjegyzendő, ez a megoldás nem helyes, hasonló adatokat inkább adatbázisból szokás venni. ➢ foot.php

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/93

 A foot.php helyettesíti az összes további HTML dokumentum kódjának befejező részét. Jelen esetben nincs eszközölve semmi változtatás, de ugyanúgy lehetne dinamikus tartalmat bevinni, mint a dokumentum első részében. ➢ xy.php:

XY oldal tartalmának főcíme

Alcím

XY oldalhoz tartozó tartalom…

 Az xy.php az oldalanként eltérő kézzel szerkesztett tartalmát (adatbázisból generált is lehet) és a részekre bontott HTML kódokat foglalja egységbe, így jön létre a teljes HTML forrás, amit a böngészőprogramok már egy teljesen szabályos weboldalként érzékelnek. A szerver oldali programozás kódjából semmit, csak a számukra legenerált tartalmat adják vissza. ➢ xyz.php:

XYZ dokumentum főcíme

Alcím

XYZ oldalhoz tartozó tartalom…

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/94

include 'foot.php'; ?>  Az xyz.php bizonyíték arra, hogy a célnak megfelelő rendszer kialakítása után, többszörösen minimalizált emberi munkával, az egyes elemek nagyon egyszerűen, a végtelenségig újrafelhasználhatóak.

A PHP kódok csak akkor próbálhatók ki saját számítógépen, ha arra szerver program van telepítve PHP motorral. Linux rendszerre való telepítésére útmutató található a LAMP szerver, valamint a VirtualHostok című oldalakon. Windows rendszerre hozzávetőlegesen jó megoldás lehet a XAMPP csomag telepítése.

A dokumentum legújabb kiadása: http://intermatrix.hu/download Dinamikus Web-oldalak programozásának alapja

(Frissítve: 2012-08-27 19:19) Egy fiktív portálmotor felépítése, kipróbálása, letöltése egyszerűsített példákkal, forráskódokkal illusztrálva.

Szerver oldali PHP programozás lényege

A PHP vagy más CGI (Common Gateway Interface) programozásra épülő webes rendszerek (portálmotorok, web-áruházak, fórumok, híroldalak, blogok…) gyakorlatilag csak a tartalom formázására használják a HTML nyelvet. A szerver- program feldolgozza a PHP utasításokat, csak a generált HTML kimenetet küldi el a látogató böngészőjének. Az eredeti programkód kliens oldalról nem látható és nem is követhető vissza.

A PHP az egyik legelterjedtebb szerver-oldali kódnyelv, képes együttműködni a MySQL~ és egyéb adatbázis-kezelő rendszerrel, rugalmasan lehet integrálni HTML kódokba, vagy éppen HTML és egyéb kódokat generálni vele. Olyan feladatok végezhetőek el, amelyekre ügyféloldali szkriptek csak korlátozottan vagy nem is képesek, biztonságilag kockázatosak. Ilyenek például az űrlapok adategyeztetése és feldolgozása, fájlkezelő műveletek, adatfeldolgozás és adatbázis kezelés, adatokból dinamikus tartalom előállítása és rendezése, automatikus e-mail visszaigazolás stb. Egy igazi szerver-oldali alkalmazás, az integrált funkciók tudásának függvényében a munka ezen részét, emberi beavatkozás nélkül automatikusan végrehajtja.

A cikk a továbbiakban, egyszerűsített gyakorlati példával megpróbálja illusztrálni, a weben alkalmazott korszerű programozási megoldásokat, vezérlési algoritmusokat, melyek képesek a Web-oldalak intelligenssé tételének megvalósítására. Mindezt azok számára, akik kevésbé ismerik az Interneten ma alkalmazott technológiák mibenlétét. Részben inspiratív lehet egy bemutatkozó portál létrehozására.

Egy egyszerű dinamikus portálmotor felépítése

A Dinamikus Web-oldalak működésének alapja című oldal részletesebben tárgyalja az weboldalak szerkezeti felosztásával kapcsolatos okokat, miérteket, így erre most szükségtelen ismételten kitérni. A példák e korábbi cikktől eltérően csak a szükséges mértékben, minimálisan vannak tovább fejlesztve. Minden megváltozott állomány új elnevezést kapott, továbbá a minta oldalakat leszámítva, a teljes térkép, egy adat és egy feldolgozó fájl létrehozásával bővült. ______

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/96

| Közös fájlok: | |_____ adat fájl:...... data_file.txt |_____ feldolgozó:...... motor.php |_____ kezdő töredék:.... dinamic_head.php |_____ záró töredék:..... dinamic_foot.php |_____ stílus fájl:...... dinamic_sample.css |_____ háttérkép:...... bg_sample.gif ______| Minta oldalak: | |_____ Cím oldal:...... index.php |_____ Termékek:...... products.php |_____ Sikerstory:...... story.php |_____ Impresszum:...... impress.php

A közös fájlok a könnyebb érthetőség és áttekinthetőség kedvéért most nincsenek külön védett könyvtárba helyezve, de éles helyzetben mindenképpen ajánlott, mint ahogy a külső hozzáférést és listázhatóságot megakadályozni.

Közös fájlok

➢ Adat fájl (data_file.txt) Cím oldal|index.php|Szalmaszál Kft.|A Szalmaszál Kft. palimadarat keres… bla… bla…| Termékek|products.php|A Szalmaszál Kft. termékpalettája|A Szalmaszál Kft.gazdag termékpalettája már a nullát is meghaladja… bla…bla…| Sikerstory|story.php|A Szalmaszál Kft. működése és céljai|Legyen sikeres, szabaduljon utolsó fillérjeitől… bla…bla…| Impresszum|impress.php|A Szalmaszál Kft. szervezeti felépítése|A Szalmaszál Kft. felépítése… bla…bla…|

Nem ritka eset, amikor kisebb adatbázist egyszerű szöveges állomány reprezentál. Jelen alkalmazását semmi más, csupán a működtető algoritmusok sokkal egyszerűbb, átláthatóbb bemutatása indokolja. Soronként a »|« (vertical bar) karakterrel elválasztva egy-egy oldal hivatkozásának címét, a fájl nevét, az oldal saját címét, és az oldal rövid meta leírását tartalmazza. A példákban szereplő feldolgozó algoritmusok megkövetelik, hogy ne legyenek benne üres sorok. A kriksz-krakszok elkerülése végett, a fájlt UTF–8 karakterkódolással kell elmenteni. ➢ Feldolgozó (motor.php)

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/97

function MOTOR($data_file) { $this->DATA_FILE = $data_file; $this->ACTUAL_PAGE = pathinfo ($_SERVER ['PHP_SELF']); $handle = fopen ($this->DATA_FILE, "r"); if ($handle) { while (! feof ($handle)) { $buffer = fgets ($handle, filesize ($this- >DATA_FILE)); $row = explode ("|", $buffer); array_push ($this->TEMP_ARRAY, $row); } fclose ($handle); } else { die ("Az adat fájlt nem lehet olvasni!"); } }

function print_meta() { print "\n\n"; foreach ($this->TEMP_ARRAY as $position) { if ($this->ACTUAL_PAGE ['basename'] == $position [1]) { print "\n"; print "" . $position [2] . "\n"; } } print "\n\n"; }

function print_article_title() { print "\n\n"; foreach ($this->TEMP_ARRAY as $position) { if ($this->ACTUAL_PAGE ['basename'] === $position [1]) { print "\t\t\t

" . $position [2] . "

\n"; } } print "\n\n"; }

function print_menu() { print "\n\n"; print "\t\t\t

\n\t\t\t\t
    ";

    A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/98

    foreach ($this->TEMP_ARRAY as $position) { $file_path = pathinfo ($position [1], PATHINFO_BASENAME); print "\n\t\t\t\t\t

  • " . $position [0] . "
  • "; } print "\n\t\t\t\t
\n\t\t\t
"; print "\n\n\n"; } } ?>  A function MOTOR($data_file) (a PHP osztály konstruktora) beolvassa az adatfájl (data_file.txt) tartalmát, soronként végigmegy, minden egyes sort külön tömbbe helyezve. A tömb elemeit a »|« jel mentén választja szét.  A function print_meta() függvény az adatfájlból kiolvassa az egyes oldalakra vonatkozó változó metaadatokat és beilleszti a HTML kódba. Ezen információk az internetes látogatok, valamint a szabad-szavas keresők számára fontos.  A function print_article_title() függvény jelenleg csak az oldalon megjelenő cikknek a címét illeszti be a HTML kódba. Funkcióit lehetne bővíteni pl.: keltezés dátuma, szerző stb.  A function print_menu() függvény, az osztály-konstruktor által generált tömbökből kiolvassa a hiperhivatkozásokhoz szükséges tömbelemeket, majd formázott HTML kódot generál a függvény meghíváskor. ➢ Kezdő töredék (dinamic_head.php) print_meta(); ?>

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/99

Fejléc

Állandó tartalom… Lógó, főmenü stb.

Almenü, speciális funkciók…

print_menu(); ?>
print_article_title() ?>

 A dinamikus adatok a HTML kód azon részére kerülnek, ahol a feldolgozó motor függvényei meghívásra kerülnek. ➢ Záró töredék (dinamic_foot.php)

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/100

 Ebben a részben nem szerepel dinamikus adat, ami természetesen nem jelenti azt, hogy itt nem is lehetne, ha a portál szolgáltatásai úgy kívánják. ➢ Stílus fájl (dinamic_sample.css) @CHARSET "UTF-8";

/* START common elements */ html,body { width: 1000px; margin: 0 auto; font-family: sans-serif; font-size: 0.9em; }

h2 { font-size: 1.1em; }

.green_border { color: green; border: 1px solid green; }

.gray_bg { background-color: #ddd; width: 100%; }

.warning_text { color: #f22; background-color: #ddd; width: 100%; } /* END common elements */

/* START #top */ #top { width: 1000px; height: 125px; background-color: aqua; } /* END #top */

/* START #body_content */ #body_content {

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/101

float: left; background: url("bg_sample.gif") #fff center repeat-y; }

#left { float: left; width: 230px; padding: 0 10px 0 10px; }

#left ul { list-style: none; display: block; margin-left: -40px; }

#center { float: left; width: 480px; padding: 0 10px 0 10px; }

#center h1 { font-size: 1.4em; }

#right { float: left; width: 230px; padding: 0 10px 0 10px; } /* END #body_content */

/* START #foot */ #foot { clear: both; width: 1000px; height: 75px; background-color: #aca; width: 1000px; }

#foot p { text-align: center; } /* END #foot */  A stílusfájl kódját kissé tovább fejlesztve, ebben már a menühöz alkalmazott

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/102

felsorolás tulajdonságai is szerepelnek. ➢ Háttérkép (bg_sample.gif)  A háttérkép nem változott, akár el is hagyható vagy lecserélhető. Mint ahogy nagyobb cégnél a CSS szerkesztése, úgy ez is, a dizájner munkája.

Minta oldalak

Az alábbi példákból kikövetkeztethető, hogy egy dinamikus internetes portál dizájnjának és vezérlésének megoldása után, igazából már csak a tatalom feltöltésre kell koncentrálni. Egy jó adminisztrációs felülettel kiegészítve, már egy átlagos informatikai tapasztalat is elegendő.

➢ Cím oldal (index.php)

Céginformáció

A Szalmaszál Kft. a hazai piacon az egyetlen olyan cég, amely teljes és skálázható megoldást tud nyújtani a szalmaszálak keresztbe rakása minden területére, tetszőleges méretű és tevékenységű világcég számára. A Szalmaszál, mára a Naprendszer magyarországi megoldásszállító partnere, képviseli a szalma-szoftvergyártás teljes termékpalettáját.

➢ Termékek (products.php)

Szalmakereszt szoftver

A Szalmaszál Kft. egyetlen szoftvertermékének segítségével vállalkozása szalma készletének aktuális állapota naprakészen nyomon követhető és a szalmakeresztek folyamatainak kimutatásai is bármikor lekérdezhetőek, összehasonlíthatóak. Beruházása jól kimutatható azonnali és hosszú távú költségmegtakarítást és forradalmi fellendülést eredményezhet a Világegyetem minden szegletében.

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/103

➢ Sikerstory (story.php)

Hatékonyság növelés

A XX. század végén alapított Szalmaszál Kft. mára új lehetőségekkel bővítette a cég szoftvertermékének portfólióját, az alkalmazás hatékonyságának megkétszerezésével. Az extra funkció használatba vétele után az Ön vállalkozása, míg eddig egyet sem, immár évente két szalmaszálat rakhat keresztbe elfogadható biztonsággal.

A sikeresség titka

A Szalmakereszt szoftver a Világegyetem legsikeresebb terméke, megvásárlása következtében olyan mértékben megszűnnek anyagi függőségei, hogy az utolsó két szalmaszálat sem kell már keresztbe tennie, minden tulajdonától tehermentesítjük.

➢ Impresszum (impress.php)

A sikeresség titka

A Szalmaszál Kft. minden egyes tagja zseniálisan képzett vezető beosztású, kizárólag rokonsági és …bajtársi kapcsolatok alapján tevődik össze… … …

A fenti négy mintaoldalhoz hasonlóan (egy elképzelt nem létező vállalkozás internetes portálja), további oldalak hozhatók létre, persze a statikus tartalmat, helyenként dinamikussal is lehetne keverni, vagy éppen lecserélni. Megfigyelhető, hogy bármelyik oldalról ugyanúgy elérhető a többi másik.

Néhány szóban a kódolás formázásáról

Dinamikus technológiák használatánál rendkívülien fontos, hogy az esetlegesen közbecsúszott hibákat gyorsan kell kijavítani, mert minden oldal rosszul fog működni, vagy tönkre megy, ahol a hibás kód jelen van.

A forráskódok formázása behúzással, sortöréssel, új sorok beszúrásával történik. A

A dokumentum legújabb kiadása: http://intermatrix.hu/download Az Internet működésének gyakorlati oldala (2015-06-25 verzió) 104/104 kódok angol nyelvű kifejezéseket tartalmaznak, bonyolultabb kódoknál angol nyelvű megjegyzések segítik a programozó eligazodását, melyet a világ minden területén megértenek, ami következésképpen azt jelenti, hogy egy távol-keleti programozó is épp úgy ki tudja javítani a programhibákat mint egy magyar.

Érdemes böngészőből sorra megnézni, összehasonlítani a négy megnyitott példa- oldal forráskódját, elemezni, megkeresni a dinamikus, valamint statikus részeket és megsaccolni a még csak kezdetlegesnek mondható portál-motor által elvégzett munka mennyiségét.

A kódok letöltése kipróbálásra.

Forrásanyag

➢ www.apache.org ➢ www.debian.org ➢ fedoraproject.org ➢ www.google.com ➢ www.opensuse.org ➢ www.php.net ➢ www.ubuntu.com ➢ www.ubuntu.hu ➢ www.unicode.org ➢ www.w3.org ➢ wikipedia.org

A dokumentum legújabb kiadása: http://intermatrix.hu/download