Archiv verlassen und diese Seite im Standarddesign anzeigen : CTracker
Cerberus
24.03.2008, 18:28
ctracker.php in das include-Verzeichnis
************
<?php
// Cracker Tracker Protection System
// Created by: Christian Knerr - CBACK.DE - Der Online Computerguide (www.cback.de)
// phpBB Users: Please use our complete phpBB2 Mod!
// Version: 2.0.0
//
// License: GPL
//
//
// Begin CrackerTracker StandAlone
//
require_once("bittorrent.php");
require_once("global.php");
dbconn(true);
$cracktrack = $_SERVER['QUERY_STRING'];
$wormprotector = array('chr(', 'chr=', 'chr%20', '%20chr', 'wget%20', '%20wget', 'wget(',
'cmd=', '%20cmd', 'cmd%20', 'rush=', '%20rush', 'rush%20',
'union%20', '%20union', 'union(', 'union=', 'echr(', '%20echr', 'echr%20', 'echr=',
'esystem(', 'esystem%20', 'cp%20', '%20cp', 'cp(', 'mdir%20', '%20mdir', 'mdir(',
'mcd%20', 'mrd%20', 'rm%20', '%20mcd', '%20mrd', '%20rm',
'mcd(', 'mrd(', 'rm(', 'mcd=', 'mrd=', 'mv%20', 'rmdir%20', 'mv(', 'rmdir(',
'chmod(', 'chmod%20', '%20chmod', 'chmod(', 'chmod=', 'chown%20', 'chgrp%20', 'chown(', 'chgrp(',
'locate%20', 'grep%20', 'locate(', 'grep(', 'diff%20', 'kill%20', 'kill(', 'killall',
'passwd%20', '%20passwd', 'passwd(', 'telnet%20', 'vi(', 'vi%20',
'insert%20into', 'select%20', 'nigga(', '%20nigga', 'nigga%20', 'fopen', 'fwrite', '%20like', 'like%20',
'$_request', '$_get', '$request', '$get', '.system', 'HTTP_PHP', '&aim', '%20getenv', 'getenv%20',
'new_password', '&icq','/etc/password','/etc/shadow', '/etc/groups', '/etc/gshadow',
'HTTP_USER_AGENT', 'HTTP_HOST', '/bin/ps', 'wget%20', 'uname\x20-a', '/usr/bin/id',
'/bin/echo', '/bin/kill', '/bin/', '/chgrp', '/chown', '/usr/bin', 'g\+\+', 'bin/python',
'bin/tclsh', 'bin/nasm', 'perl%20', 'traceroute%20', 'ping%20', '.pl', '/usr/X11R6/bin/xterm', 'lsof%20',
'/bin/mail', '.conf', 'motd%20', 'HTTP/1.', '.inc.php', 'config.php', 'cgi-', '.eml',
'file\://', 'window.open', '<SCRIPT>', 'javascript\://','img src', 'img%20src','.jsp','ftp.exe',
'xp_enumdsn', 'xp_availablemedia', 'xp_filelist', 'xp_cmdshell', 'nc.exe', '.htpasswd',
'servlet', '/etc/passwd', 'wwwacl', '~root', '~ftp', '.js', '.jsp', 'admin_', '.history',
'bash_history', '.bash_history', '~nobody', 'server-info', 'server-status', 'reboot%20', 'halt%20',
'powerdown%20', '/home/ftp', '/home/www', 'secure_site, ok', 'chunked', 'org.apache', '/servlet/con',
'<script', '/robot.txt' ,'/perl' ,'mod_gzip_status', 'db_mysql.inc', '.inc', 'select%20from',
'select from', 'drop%20', '.system', 'getenv', 'http_', '_php', 'php_', 'phpinfo()', '<?php', '?>', 'sql=',
'UPDATE', 'DELETE', 'DROP', 'INSERT', '$mysql_', 'java script:');
$checkworm = str_replace($wormprotector, '*', $cracktrack);
if ($cracktrack != $checkworm)
{
$cremotead = $_SERVER['REMOTE_ADDR'];
$cuseragent = $_SERVER['HTTP_USER_AGENT'];
write_log("ctracker", "$cremotead - $cuseragent");
die( "Attack detected! <br /><br /><b>Dieser Angriff wurde erkannt und blockiert:</b><br />$cremotead - $cuseragent" );
}
//
// End CrackerTracker StandAlone
//
?>bittorrent.php
**************
require_once("include/shoutcast.php");danach
require_once('include/ctracker.php');für die loganzeige
füge die tabelle 'ctracker' in der sitelog struktur hinzu
öffne log.php
*************
case "remwarn": return "Verwarnung entfernt";danach
case "ctracker": return "Versuchte Angriffe";20 zeilen darunter ist folgende spalte
$types = array('torrentupload', 'torrentedit',...........einfach hier auch die 'ctracker' abfrage dazu, z.b.
$types = array('torrentupload', 'ctracker', 'torrentedit',...........einfach in deine DB, danach die Tabelle "sitelog" auswählen
Dann das Feld "Typ" bearbeiten und 'ctracker' einfügen
'torrentupload','torrentedit','torrentdelete','promotion','demotion','addwarn','remwarn','accenabled','parked','accdisabled','accdeleted','waitgrant','waitreject','passkeyreset','passkeyadminreset','torrentgranted','ctracker'
hier mal der komplette SQL-Part
ALTER TABLE sitelog CHANGE COLUMN `typ` `typ` ENUM('torrentupload','torrentedit','torrentdelete','promotion','demotion','addwarn','remwarn','accenabled','parked','accdisabled','accdeleted','waitgrant','waitreject','passkeyreset','passkeyadminreset','torrentgranted','ctracker','modmessages','sledit') NOT NULL DEFAULT 'torrentupload' COLLATE latin1_swedish_ci ;
Das ist in unserer DB so -- Bitte anpassen
das ist inclusive der Fixes gegen SQL-Injection
BiGPoWeR
24.03.2008, 20:05
Hi
Habe es eben mal getestet aber dann kommt der Fehler im Client!
Tracker sendet ungültige Daten: <NULL>
Hat jemand eine Idee wieso ?
Ich nämlich nicht :eek: und wenn ich die alte wieder nehme geht alles :)
Greetz BiGPoWeR
nehem an falsch eingefügt in der bittorrent.php
wenn nicht versuch mal die hier :)
<?php
/***********************\
--DO NOT EDIT THIS FILE--
\***********************/
if(!defined('IN_TRACKER'))
die('Hacking attempt!');
// Cracker Tracker Protection System
// Created by: Christian Knerr - www.cback.de
// phpBB Users: Please use our complete phpBB2 Mod!
// Version: 2.0.0
//
// License: GPL
//
//
// Begin CrackerTracker StandAlone
//
$cracktrack = urldecode($_SERVER['QUERY_STRING']);
$wormprotector = array('chr(', 'chr=', 'chr%20', '%20chr', 'wget%20', '%20wget', 'wget(',
'cmd=', '%20cmd', 'cmd%20', 'rush=', '%20rush', 'rush%20',
'union%20', '%20union', 'union(', 'union=', 'echr(', '%20echr', 'echr%20', 'echr=',
'esystem(', 'esystem%20', 'cp%20', '%20cp', 'cp(', 'mdir%20', '%20mdir', 'mdir(',
'mcd%20', 'mrd%20', 'rm%20', '%20mcd', '%20mrd', '%20rm',
'mcd(', 'mrd(', 'rm(', 'mcd=', 'mrd=', 'mv%20', 'rmdir%20', 'mv(', 'rmdir(',
'chmod(', 'chmod%20', '%20chmod', 'chmod(', 'chmod=', 'chown%20', 'chgrp%20', 'chown(', 'chgrp(',
'locate%20', 'grep%20', 'locate(', 'grep(', 'diff%20', 'kill%20', 'kill(', 'killall',
'passwd%20', '%20passwd', 'passwd(', 'telnet%20', 'vi(', 'vi%20',
'insert%20into', 'select%20', 'nigga(', '%20nigga', 'nigga%20', 'fopen', 'fwrite', '%20like', 'like%20',
'$_request', '$_get', '$request', '$get', '.system', 'HTTP_PHP', '&aim', '%20getenv', 'getenv%20',
'new_password', '&icq','/etc/password','/etc/shadow', '/etc/groups', '/etc/gshadow',
'HTTP_USER_AGENT', 'HTTP_HOST', '/bin/ps', 'wget%20', 'uname\x20-a', '/usr/bin/id',
'/bin/echo', '/bin/kill', '/bin/', '/chgrp', '/chown', '/usr/bin', 'g\+\+', 'bin/python',
'bin/tclsh', 'bin/nasm', 'perl%20', 'traceroute%20', 'ping%20', '.pl', '/usr/X11R6/bin/xterm', 'lsof%20',
'/bin/mail', '.conf', 'motd%20', 'HTTP/1.', '.inc.php', 'config.php', 'cgi-', '.eml',
'file\://', 'window.open', '<script>', 'javascript\://','img src', 'img%20src','.jsp','ftp.exe',
'xp_enumdsn', 'xp_availablemedia', 'xp_filelist', 'xp_cmdshell', 'nc.exe', '.htpasswd',
'servlet', '/etc/passwd', 'wwwacl', '~root', '~ftp', '.js', '.jsp', 'admin_', '.history',
'bash_history', '.bash_history', '~nobody', 'server-info', 'server-status', 'reboot%20', 'halt%20',
'powerdown%20', '/home/ftp', '/home/www', 'secure_site, ok', 'chunked', 'org.apache', '/servlet/con',
'<script', '/robot.txt' ,'/perl' ,'mod_gzip_status', 'db_mysql.inc', '.inc', 'select%20from',
'select from', 'drop%20', '.system', 'getenv', 'http_', '_php', 'php_', 'phpinfo()', '<?php', '?>', 'sql=');
$checkworm = str_replace($wormprotector, '*', $cracktrack);
$checkworm = str_replace($wormprotector, '*', strtolower($cracktrack));
$cracktrack = strtolower($cracktrack);
if ($cracktrack != $checkworm)
{
$cremotead = $_SERVER['REMOTE_ADDR'];
$cuseragent = $_SERVER['HTTP_USER_AGENT'];
$fp = fopen ('./log.txt', 'a');
fwrite ($fp, 'Blocked attack from: IP - ' . $_SERVER['REMOTE_ADDR'] . ' User Agent - ' . $_SERVER['HTTP_USER_AGENT'] . '
');
fclose ($fp);
die( "Attack detected! <br /><br /><b>Dein Versuch den Tracker zu manipulieren wurde geblockt, alle relevanten Daten wie deine IP usw wurden gelogged und werden an den Serverhoster weitergegeben:</b><br />$cremotead - $cuseragent" );
}
//
// End CrackerTracker StandAlone
//
?>aso log.txt auf 777 und in den rootfolder
BiGPoWeR
24.03.2008, 20:15
nehem an falsch eingefügt in der bittorrent.php
wenn nicht versuch mal die hier :)
<?php
/***********************\
--DO NOT EDIT THIS FILE--
\***********************/
if(!defined('IN_TRACKER'))
die('Hacking attempt!');
// Cracker Tracker Protection System
// Created by: Christian Knerr - www.cback.de
// phpBB Users: Please use our complete phpBB2 Mod!
// Version: 2.0.0
//
// License: GPL
//
//
// Begin CrackerTracker StandAlone
//
$cracktrack = urldecode($_SERVER['QUERY_STRING']);
$wormprotector = array('chr(', 'chr=', 'chr%20', '%20chr', 'wget%20', '%20wget', 'wget(',
'cmd=', '%20cmd', 'cmd%20', 'rush=', '%20rush', 'rush%20',
'union%20', '%20union', 'union(', 'union=', 'echr(', '%20echr', 'echr%20', 'echr=',
'esystem(', 'esystem%20', 'cp%20', '%20cp', 'cp(', 'mdir%20', '%20mdir', 'mdir(',
'mcd%20', 'mrd%20', 'rm%20', '%20mcd', '%20mrd', '%20rm',
'mcd(', 'mrd(', 'rm(', 'mcd=', 'mrd=', 'mv%20', 'rmdir%20', 'mv(', 'rmdir(',
'chmod(', 'chmod%20', '%20chmod', 'chmod(', 'chmod=', 'chown%20', 'chgrp%20', 'chown(', 'chgrp(',
'locate%20', 'grep%20', 'locate(', 'grep(', 'diff%20', 'kill%20', 'kill(', 'killall',
'passwd%20', '%20passwd', 'passwd(', 'telnet%20', 'vi(', 'vi%20',
'insert%20into', 'select%20', 'nigga(', '%20nigga', 'nigga%20', 'fopen', 'fwrite', '%20like', 'like%20',
'$_request', '$_get', '$request', '$get', '.system', 'HTTP_PHP', '&aim', '%20getenv', 'getenv%20',
'new_password', '&icq','/etc/password','/etc/shadow', '/etc/groups', '/etc/gshadow',
'HTTP_USER_AGENT', 'HTTP_HOST', '/bin/ps', 'wget%20', 'uname\x20-a', '/usr/bin/id',
'/bin/echo', '/bin/kill', '/bin/', '/chgrp', '/chown', '/usr/bin', 'g\+\+', 'bin/python',
'bin/tclsh', 'bin/nasm', 'perl%20', 'traceroute%20', 'ping%20', '.pl', '/usr/X11R6/bin/xterm', 'lsof%20',
'/bin/mail', '.conf', 'motd%20', 'HTTP/1.', '.inc.php', 'config.php', 'cgi-', '.eml',
'file\://', 'window.open', '<script>', 'javascript\://','img src', 'img%20src','.jsp','ftp.exe',
'xp_enumdsn', 'xp_availablemedia', 'xp_filelist', 'xp_cmdshell', 'nc.exe', '.htpasswd',
'servlet', '/etc/passwd', 'wwwacl', '~root', '~ftp', '.js', '.jsp', 'admin_', '.history',
'bash_history', '.bash_history', '~nobody', 'server-info', 'server-status', 'reboot%20', 'halt%20',
'powerdown%20', '/home/ftp', '/home/www', 'secure_site, ok', 'chunked', 'org.apache', '/servlet/con',
'<script', '/robot.txt' ,'/perl' ,'mod_gzip_status', 'db_mysql.inc', '.inc', 'select%20from',
'select from', 'drop%20', '.system', 'getenv', 'http_', '_php', 'php_', 'phpinfo()', '<?php', '?>', 'sql=');
$checkworm = str_replace($wormprotector, '*', $cracktrack);
$checkworm = str_replace($wormprotector, '*', strtolower($cracktrack));
$cracktrack = strtolower($cracktrack);
if ($cracktrack != $checkworm)
{
$cremotead = $_SERVER['REMOTE_ADDR'];
$cuseragent = $_SERVER['HTTP_USER_AGENT'];
$fp = fopen ('./log.txt', 'a');
fwrite ($fp, 'Blocked attack from: IP - ' . $_SERVER['REMOTE_ADDR'] . ' User Agent - ' . $_SERVER['HTTP_USER_AGENT'] . '
');
fclose ($fp);
die( "Attack detected! <br /><br /><b>Dein Versuch den Tracker zu manipulieren wurde geblockt, alle relevanten Daten wie deine IP usw wurden gelogged und werden an den Serverhoster weitergegeben:</b><br />$cremotead - $cuseragent" );
}
//
// End CrackerTracker StandAlone
//
?>aso log.txt auf 777 und in den rootfolder
Haben das schon drinne :P
Habe nur unsere ersetzt mit der neuen ;) und dann kam die Meldung ...
Naja ich guck morgen mal genauer :cool:
Lg BiGPoWeR
gotthummer
24.03.2008, 20:18
Also ich habe Gerade mal die von Cerberus getestet und habe keine probs also Downloaden usw geht alles
Cerberus
24.03.2008, 20:39
ich hab mal den include rausgenommen ....
am ende war der das "Problem" ...
bei uns ist eine ähnliche Version in Benutzung - ohne Probleme
gotthummer
24.03.2008, 20:43
Welches Problem denn ? wie gesagt bei mir lief Sie was genau wurde denn nun schonw ieder geändert ?
Cerberus
24.03.2008, 21:17
ich hab mal den include rausgenommen ....
mehr nicht ...
aber eigentlich gehört das rein
ich wollt die von Pr1me mal testen mit der log.txt aber sobald ich die einfüge kommt nur noch ne weiße Seite und der Text Hacking attempt!
kann dannach nicht eine php mehr aufrufen kommt immer der selbe Text. Hat das noch einer ?
gotthummer
25.03.2008, 11:30
Musst du das
if(!defined('IN_TRACKER'))
die('Hacking attempt!');
rausnehmen da wird noch ein eintrag für fehlen
jo oder wenn Pr1me den fehlenden Eintrag nach reichen würde wäre auch wat
bei mig gehts 1A ob was fehlt kA^^ :D ich
schau mal
jo und zwar das
define ('IN_TRACKER', 'God! Your so sexy...');
require "ctracker.php"; unter
require_once('global.php'); in der bittorrent.php
Cerberus
26.03.2008, 21:46
lol -- na das nenn ich mal ne Fehlermeldung :D
Also auch mit dem neuen DB eintrag eine weisse Seite...musste es wieder ausbauen...shit...naja
Cerberus
04.05.2008, 11:16
dann versuche mal mit absoluten Pfaden zu arbeiten....
ich denke mal, er findet einfach die Datei nicht
Solstice
04.05.2008, 11:34
Wie aktuell ist diese ctracker?
Ich habe bereits einen Schutz drin, aber vielleicht lohnt es sich ja als update?
mfg,
Sol
Cerberus
04.05.2008, 11:36
ich hab einige zusätzliche Sachen in den Schutz mit reingenommen ...
ich erweitere unsren ständig -- somit ist eine Aktualität schneller gewährleistet
Solstice
04.05.2008, 11:54
Da wirs ja grad mal ansprechen, die cTracker.
Ich hab mich mit der schonmal auseinandergesetzt, aber ich versteh net, was sie jetzt genau macht, bzw wie sie arbeitet. Dann könnt ich sie nähmlich auch selber aktuell halten und nicht nur durch Hilfe von anderen.
Ich seh zwar dass einige SQL befehle im "wormprotector" drin sind, aber sagen tuts mir konkret nichts.
mfg,
Sol
Cerberus
04.05.2008, 11:58
Das Tool fängt den Übergabe-String $_SERVER['QUERY_STRING']ab und analysiert ihn.
Wenn in dem String nun Zeichenketten aus dem Array auftauchen, welche als $wormprotector() definiert wurden, bricht er die Ausführung ab und trägt es als Angriff in die LOG ein....
reicht das soweit ???
Solstice
04.05.2008, 12:04
hmm...
Soweit so gut...
ist %20 dann ein platzhalter *nervige Fragensteller*
mfg,
Sol
Cerberus
04.05.2008, 12:11
%20 ist einfach nur ein Leerzeichen :)
Solstice
04.05.2008, 12:12
jo gut... danke
beachtet er groß und kleinschreibung?
Denk schon, aber sicher is sicher.
mfg,
Sol
Berzerker
15.06.2008, 19:56
Also wenn ich die ctracker.php nehme, funzen die Ä,Ö und Ü nicht mehr und es kommt ne Fehlermeldung cannot modify header... :(
Cerberus
15.06.2008, 20:01
wo kommt diese Fehlermeldung ...
und wo funzen die Umlaute nicht mehr ???
der ctTracker greift in das aber im Grunde gar nicht ein
Berzerker
15.06.2008, 20:04
Sobald ich die controlpanel.php aufrufe und die ctracker.php nehme, funzen die äöü in den Linknamen des controlpanels nicht mehr und die Fehlermeldungen sind :
Warning: Cannot modify header information - headers already sent by (output started at /var/www/metaltorrents/include/ctracker.php:57) in /var/www/metaltorrents/include/bittorrent.php on line 786
Warning: Cannot modify header information - headers already sent by (output started at /var/www/metaltorrents/include/ctracker.php:57) in /var/www/metaltorrents/include/bittorrent.php on line 787
Warning: Cannot modify header information - headers already sent by (output started at /var/www/metaltorrents/include/ctracker.php:57) in /var/www/metaltorrents/include/bittorrent.php on line 788
Warning: Cannot modify header information - headers already sent by (output started at /var/www/metaltorrents/include/ctracker.php:57) in /var/www/metaltorrents/include/bittorrent.php on line 789
Cerberus
15.06.2008, 20:07
aber der cttracker hat gar keine Ausgaben ....
sehr komisch ...
das mit den Umlauten kann möglich sein -- da hilft nur sauber schreiben
ä = ä
ö = ö
ü = ü
Ä = Ä
Ö = Ö
Ü = Ü
Hat jemand ne tip für mich wie ich das auf der Index anzeigen lassen kann?
zbs es wurden 2 Hack-Angriffe von Tracker-Namen abgewert...
ich komm jetzt einfach nicht drauf wie ich das machen soll
Moin Moin zb so
<table cellpadding="4" cellspacing="1" border="0" width=100% class=tableinborder>
<tr width="100%" class=tablecat>
<td colspan="10" width="100%">
<center>
<?php
$query = mysql_query("SELECT COUNT(*) AS attacks FROM sitelog WHERE typ = 'ctracker'") or sqlerr();
$row = mysql_fetch_array($query);
echo $row['attacks'];
?>
Angriffe von der Tracker-Source erfolgreich erkannt und abgewehrt.</center></td></tr>
lg
Ironman
Ja genau... ich hab mir nur den oberen teil noch um
geändert.
in
<table cellpadding="4" cellspacing="1" border="0" style="width:100%" class="tableinborder">
<tr class="tabletitle" width="100%">
<td colspan="10" width="100%">
<span class="normalfont">
So sieht es bei mir schöner aus.
Danke für deine Hilfe...
Cerberus
08.01.2009, 11:51
wenn, dann schon so:
<table cellpadding="4" cellspacing="1" border="0" style="width:100%" class="tableinborder">
<tr>
<td class="tabletitle" colspan="10" width="100%">
LieberSchwager
22.11.2009, 15:37
hab mal eine Frage was diesem Schritt angeht
"für die loganzeige
füge die tabelle 'ctracker' in der sitelog struktur hinzu"
was ist damit genau gemeint?
stehe dabei mal wieder gewaltig auf dem Schlauch
Dass du deine sitelog um eine Tabelle 'ctracker' erweitern sollst,
damit die Ereignisse richtig angezeigt werden.
LieberSchwager
22.11.2009, 21:16
ist das nicht das selbe wie das ?
einfach in deine DB, danach die Tabelle "sitelog" auswählen
Dann das Feld "Typ" bearbeiten und 'ctracker' einfügen
Ja,
aber du musst die Sparte 'ctracker' auch noch in der sitelog.php einfügen ;)
LieberSchwager
23.11.2009, 18:29
ja das meinste ?
$types = array('torrentupload', 'ctracker', 'torrentedit',...........
edit weil eine sitlog.php besitze ich net nur ne log.php
Bluesteel
23.11.2009, 19:05
richtig und in die log.php muss es rein genau hier hinein
suche das:
$timerange = array(3600 => "1 Stunde",
3 * 3600 => "3 Stunden",
6 * 3600 => "6 Stunden",
9 * 3600 => "9 Stunden",
12 * 3600 => "12 Stunden",
18 * 3600 => "18 Stunden",
24 * 3600 => "1 Tag",
2 * 24 * 3600 => "2 Tage",
3 * 24 * 3600 => "3 Tage",
4 * 24 * 3600 => "4 Tage",
5 * 24 * 3600 => "5 Tage",
6 * 24 * 3600 => "6 Tage",
7 * 24 * 3600 => "1 Woche",
14 * 24 * 3600 => "2 Wochen"
);
und darunter in dem arry fügst du 'ctracker' ein
das das so aussieht
$types = array('torrentupload', 'ctracker', 'torrentedit', 'torrentdelete', 'torrentgranted', 'promotion', 'demotion', 'addwarn', 'remwarn', 'accenabled', 'parked', 'accdisabled', 'accdeleted', 'waitgrant', 'waitreject', 'passkeyreset', 'passkeyadminreset', 'Kategorien', 'autowarn', 'autodewarn', 'autoban', 'cleaner','cleanup' );
alle einträge die du nicht brauchst kannst du entfernen
LieberSchwager
23.11.2009, 19:09
ok dann hab ich es ja richtig gemacht ^^ es hat ein wenig irretiert was da stand sorry ^^
Bluesteel
23.11.2009, 19:39
na dann ist doch kein Problem sind ja zum helfen da ^^
$cracktrack = $_SERVER['QUERY_STRING'];
ist ein bisschen GAGA bei $_POST
deshalb
$creqmethod = $_SERVER['REQUEST_METHOD'];
if($creqmethod == "GET") {
$cracktrack = mysql_real_escape_string($_SERVER['QUERY_STRING']);
} else {
$kv = array();
foreach($_POST as $key => $value) {
$kv[] = "$key=$value";
}
$cracktrack = mysql_real_escape_string(@join("&", $kv));
}
vBulletin® v3.8.9, Copyright ©2000-2024, vBulletin Solutions, Inc.