35444 items (32819 unread) in 65 feeds
seo
(12771 unread)
onlinemarketing
(10782 unread)
grafika
(75 unread)
sitebuild
(62 unread)
honlapkeszites
(757 unread)
webketto
(600 unread)
flash
(65 unread)
internet
(6099 unread)
fejlesztes
(639 unread)
google
(31 unread)
ekereskedelem
(30 unread)
egyeb
(40 unread)
szoftver
(30 unread)
wireless
(20 unread)
cms
(713 unread)
Röviden összefoglalva a click fraud az a jelenség, amikor egy személy, vagy egy program rossz szándékkal egy fizetett hirdetésre kattint. A jelenség motiváló tényezőjének boncolgatását inkább a pszichológusokra bíznám, inkább valami másra koncentrálnék az elkövetkezőkben.
Egy-két oldalt és prezentációt átnézve egyre inkább úgy tűnik számomra, hogy az ipari méretű csalások mögött leginkább robot hálózatok állnak. Az oldalletöltések azonos IP-ről egyszerre akár több operációs rendszert azonosítva is érkezhetnek.
A probléma ezzel a jelenséggel az, hogy vétlen hirdetés publikálók is áldozatául eshetnek a Google válaszának, az AdSense fiók felfüggesztésnek.
Pár óra alatt azonban sikerült valamiféle dögös megoldást összeeszkábálnom, amit így utólag végiggondolva nem sok teret fog engedni a click fraud kártékony jelenségének.
Első lépésként bemutatnék egy képzeletbeli AdSense kódot, hogy mindjárt bele is kezdhessünk hirdetői fiókunk biztonságosabbá tételébe.
<script type="text/javascript">
google_ad_client = "pub-xxxxxxxxxxxxxxxx";
google_ad_slot = "xxxxxx";
google_ad_width = 234;
google_ad_height = 60;
</script>
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
Így néz(ne) ki a te oldaladban is egy Google hirdetés, és a forráskód megjelenítésével ez bárki számára hozzáférhető. Kimásoltam az erre a domainre dedikált kódot, majd beillesztettem egy másik oldalamba és ott is megjelent a hirdetés. Itt már kezdődnek is a gondok. Ha bárki rossz szándékkal kimásolja a javascriptet és bárhová beilleszti, szabadon kattingathat, anélkül, hogy ez neked bármilyen (webstatisztika) módon is feltűnhetne.
Ez a gondolatmenet elvisz minket a legfontosabb lépéshez. A javascript külső, védett fájlba való átmozgatásához.
<script type="text/javascript" src="adsense-kod.js">
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
Ezt követően az adsense-kod.js-be helyezzük a kódnak ezen részletét:
google_ad_client = "pub-xxxxxxxxxxxxxxxx";
/* 234×60, létrehozva 2008.03.01. */
google_ad_slot = "xxxxxx";
google_ad_width = 234;
google_ad_height = 60;
Ezzel a lépéssel az AdSense kód külső fájlba került, de a javascript direkt elérését még nem akadályoztuk meg. Használjuk erre az hotlinking ellen is szükséges .htaccess kódot, a következő formában.
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(www\.)?seo.i-connector.com(/)?.*$ [NC]
RewriteRule .*\.(js)$ http://seo.i-connector.com/ [R,NC]
Ezáltal a .js kiterjesztésű fájlok csak a második sorban specifikált domain fájljai számára lesznek elérhetőek. Direkt eléréskor a harmadik sorban lévő URL lesz az átirányítás végállomása.
Következzék a második lépés, amely során aktív kattinós IP adatgyűjtésbe fogunk kezdeni. Az oldalad kódjában a Google hirdetést ilyen formán építsd be.
<form method="post" action="" id="ads">
<div class="ads">
<script type="text/javascript" src="adsense-code.js">
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>
</form>
Lesz tehát egy ajax posztoló form, amely tartalmazza a hirdetés kódját.
A hirdetést taralmazó oldal head részébe kérlek illeszd be ezt a három sort, és már majdnem készen is leszünk.
<script src="mootools.js" type="text/javascript"></script>
<script src="control.js" type="text/javascript"></script>
<?php require "ads-controller.php" >
Amint a három fájlon szépen végigmentünk, addigra a védelem össze is áll (tartalmuk lementésekor kérlek nagyon ügyelj arra, hogy azt a szükséges fájlkiterjeszés megadásával illeszd az oldaladba).
mootools.js
Mootools.net-ről szabadon letölthető javascript keretrendszer.
control.js
Az AdSense hirdetést tartalmazó ads class-szal azonosított div felett végrehajtott egérkattintás (mousedown esemény) válaszául a div-et 800 milisecundum alatt teljesen átlátszóvá transzformálja, valamint vezérli az ajax posztolást az ip-log.php fájl futtatásaként.
Az ip-log.php fájl fogja végezni a statisztikai adatgyűjtést gyűjtést. A benne meghatározott limit változóval ($limit=1000;) indirekt módon szabályozható, hogy hányadik kattintást követően kerüljön a logfájl törlésre, azaz ismét kattinthatóvá válnak a hirdetések a korábban már kattintók számára.
Az indirekt szabályozás abból áll, hogy a logfájl mérete kerül összehasonlításra a limit változóval. Egy IP körülbelül 13 byte. 1000 osztva 13-mal durván 75 kattintás. Azt gondolom a logfájl törlésésére olyan nagyon égető szükségünk nincs is, hiszen a visszatérő látogatóid jellemzően a tartalmadra kíváncsiak, nem is igazán a hirdetések érdeklik őket, de a szkripted futását a fájlméretének növekedésével arányosan lassítani fogja, tehát inkább a fájlméret alapján válassz limitet, mintsem a kattintások száma alapján.
ads-controller.php
Működése roppant mód egyszerű, ha a látogató hirdetési kattantása miatt a logfájlba került, akkor az oldal töltődésekor eszközli a hirdetés eltűnését.
<script type="text/javascript">
window.onload = function()
{ new Fx.Style( "ads", ‘opacity’, {duration: 1000} ).start(1,0);}</script>
A szkript működését ezen a demo oldalon megtekintheted.
Kérlek, hogy ne kattints a hirdetésre, helyette Google Ads képre kattintva ugyanazt a hatást éred el!
Nyilatkozat:
Ha a posztomat végig bírtad olvasni és megértetted, javaslom, hogy nyiss egy sört és dőlj hátra, mert rászolgáltál.
További kellemes napot kívánok!
Úgy érzem eleget teszteltem már a védelmi szkriptemet, így már elérkezettnek látom az időt, hogy itt is közzétegyem. 
Előrebocsájtom, hogy használatáért semmilyen felelősséget nem vállalok, és programozó sem vagyok, de nagyon igyekeztem.
Egy kicsit azért visszacsévélem az időt, hogy a credit ne maradjon ki. Az egész bűvészkedésnek az alapját a CrawlerController script adta, amely a referrer spammerek ellen védelmezi az oldalunkat. Sajnos, nem voltam eléggé ügyes, hogy működésre bírjam, de nagyon sok részt használtam belőle így aztán jár neki az elismerés. Nem hagyhatom ki kow-t sem, aki birka türelemmel válaszolgatott a sokszor értelmetlen kérdéseimre.
Akkor most veszek ismét egy éles visszakanyart, és folytatom ott, ahol abbahagytam, de először egy bajuszhalmaz, amolyan felsorolás a funkciókról:
A telepítés rendkívül egyszerű, a csomag letöltését, kicsomagolását követően egy tetszőleges könyvtárba kell feltölteni a fájlokat majd a könyvtár security.php fájlját minden védelem alá helyezendő oldalba behívni a legelső sorban.
<?php require “/ide/jön/a/path/tetszolegeskonyvtarnev/security.php”; ?>
És akkor lássuk jelen esetben most mi is lapul a security.php fájlban
<?php
$ua = $_SERVER[’HTTP_USER_AGENT’];
$webadress = $_SERVER[’REQUEST_URI’];
$ip = $_SERVER[’REMOTE_ADDR’];
$target = file(dirname(__FILE__).”/ip-logfile.txt”);
$sqltarget = file(dirname(__FILE__).”/sql-injection.txt”);
$ualist = file(dirname(__FILE__).”/banned-ua.txt”);
$loc = dirname(__FILE__);//Indul a szkript
//ha a látogató azt mondja magáról, hogy robot
if(strstr($ua, ‘msnbot’) || stristr($ua, ‘Googlebot’) || stristr($ua, ‘Yahoo! Slurp’)){
//lefut a robot validálása
require “$loc/security-proxy-checker.php”;
}
else{//bannolt user-agentek
foreach($ualist as $item){
$item = trim($item);
if(stristr($ua, $item)){
require “$loc/message.php”;
exit;}}
//IP ellenorzés követketik
foreach($target as $item){
$item = trim($item);
if(stristr($ip, $item)){
require “$loc/message.php”;
exit;
}}//sql támadásának ellenorzése
foreach($sqltarget as $sqlitem){
$sqlitem = trim($sqlitem);
if(stristr($webadress, $sqlitem)){
require “$loc/index.php”;
exit;}}}
?>
Az sql injekciós támadások azonosításához ezen az oldalon megtalálható remek kis táblázatot használtam, valamint kiegészítettem ezekkel a szavakkal:
Szerintem az a legszerencsésebb, ha beszerelsz egy olyan statot, amely logolja a lekért url-eket és ennek megfelelően bővíted az sql-injection.txt-ben található tartalmat.
Ahogy, az az iménti kódból kiderült lesznek logfájljaink és lesz egy üzenet valamint egy index.php fájl is amely a kettővel korábbi posztom index fájljának felel meg, de egy kicsit okosabb lett azóta. Ezek a fájlok fognak a rosszalkodók ellen fellépni.
Az index.php tartalma a következő:
<?php
$ip = $_SERVER["REMOTE_ADDR"];
$webadress = $_SERVER['REQUEST_URI'];
$loc = dirname(__FILE__);
$logfile = "$loc/ip-logfile.txt";
$urllogfile = "$loc/requested-string.txt";
require "$loc/message.php";
//Indul a statisztikai adatgyujtés
//Tároljuk el eloször az IP-t
$fp = fopen($logfile, 'a');
fputs($fp, "$ip
");
fclose($fp);
$fpstring = fopen($urllogfile, 'a');
//Tároljuk el a stringet is, ha már itt vagyunk
fputs($fpstring, "$ip kérte ezt $webadress
");
fclose($fpstring);
exit;
?>
Hívhatnánk akár adatgyűjtő.php-nek is funkciója alapján. Elteszi biztos helyre a játékos kedvű próbálkozó IP címét, valamint egy ellenőrző logfájlba (requested-string.txt) bepakolja a lekért URL-t, a hozzátartozó IP-t és a lekérést időpontját. Ezt a fájlt mindenképpen érdemes időnként felülvizsgálni, hogy a véletlenül (?) bannolt népnek ismét hozzáférést biztosíthassunk.
A message.php-mat a csomagban megtalálhatod, ez már egy nagyon Úriemberhez méltó tartalommal rendelkezik. A legelső verzióban több volt a vulgáris szó, mint a felkiáltójel.
Jó ötlet lehet esetleg az ördögűző, vagy valamely egyéb paráztató film félelmetes jeleneténél készült printscreen megjelenítése…
Mit kellene még leírnom?
Szerintem semmi nem maradt ki, szóval védelemre fel!
További kellemes napot!
..és nem Yahoo Slurp.
Sajnálattal kellett ma felismernem, hogy a reversedns.php fájl nem validálta a Yahoo! robotot, hiszen a nevét rosszul szerkesztettem be, a ! jel elmaradt.
A helyes user agent vizsgáló feltétel így néz ki
if(strstr($ua, ‘msnbot’) || stristr($ua, ‘Googlebot’) || stristr($ua, ‘Yahoo! Slurp’))
Nem röhögtem hangosan, amikor megláttam a Yahoo!-ban egy proxy linket, most már legalább tudom az okát.
Javítottam a WordPress plugint és a többi blogon található szkriptet, így azokat már helyes formában lehet letölteni.
Terveim szerint hétvégén sikerül beszerelnem egy letöltésvezérlőt, mert új csomag lesz elérhető.
A tévedésért elnézéseteket kérem!
Mostanában nagyon ráálttam a weboldalak biztonságának erősítésére, aminek eredeti oka a katalógusom meghackelése volt. Majd megszakadt a szívem úgy látni azt a remek oldalt:)
None kívánsága szerint egy automata bad robot defender szkriptet fogok most itt prezentálni. Az összeállításához a metodikát innen szereztem. Ez az oldal részletesen bemutatja a bad robotok azon rossz tulajdonságát, hogy nem hallgatbak a jó szóra és a robots.txt-ben korlátozottként specifikált tartalmat is látni akarják a hackerekhez hasonlóan.
Pár poszttal korábban megismertettem egy módszert, amivel a robots.txt fájl-t az illetéktelenek elől elrejthetjük. Sajnos ezt most majd ki kell szerelni az oldalból, de azt gondolom megéri.
Hát akkor kezdem a védelem ismertetését.
1. Nyisd meg a robots.txt fájl-t és helyezd bele ezt a két sort
User-agent: *
Disallow: /core
A mappa neve bármi lehet, a lényeg az, hogy a rosszindulatú humanoidok is rákapjanak a nevére, mert amint megteszik vége a dalnak.
2. Hozd létre a robots.txt.-ben definiált mappát, és a könyvtárba másold fel az alábbi tartalmú index.php fájlt.
<?php
//gyujtsük össze az IP-t, vagy bármi mást, amit szeretnénk
$ip = $_SERVER[”REMOTE_ADDR”];
$logfile = ‘bannolnilog.txt’;
//logfájlba vele
$fp = fopen($logfile, ‘a’);
fputs($fp, “$ip
“);
fputs($fp, ” “);
fclose($fp);
// kézfogás közben ne felejtsünk el mosolyogni
echo “az IP biztonsági okokból rögzítésre került, sajnos a látogatásod itt véget ért”;
?>
3. A létrehozott mappába (példánál maradva core) másoljuk fel az imént logfile-ként definiált üres bannolnilog.txt-t (644-es attributúmmal működik nálam). Ő fogja majd gyűjteni a bűnösök neveit.
4. A györkérmappába, de oda tesszük, ahová csak szeretnénk töltsük fel az alábbi tartalmű validator.php fájlt.
<?php
$ip = $_SERVER[”REMOTE_ADDR”];
//fontos a target megfelelő elérése, a hibaüzenetek majd tudtunkra adják, ha elrontottunk valamit
$target = file(dirname(__FILE__). “/core/bannolnilog.txt”);
foreach($target as $item){
$item = trim($item);
if(stristr($ip, $item)){
//sima 403 hiba a válasz, de ha gondolod, mond meg nekik a magadét
header(”HTTP/1.0 403 Forbidden”);
exit;
}
}
?>
5. Nyisd meg a header.php fájlt, vagy bármi, ami elkezdi a szkriptet futtatni, és minden elé illeszd be
<?php require “/ide/jön/a/path/validator.php”;?>
6. A védelem felállt, ha véletlenül magadat sikerült kibannolod, ürítsd ki a logfájlt ftpvel és meg is vagy.
További kellemes napot!