Saugumo patarimai
Parašė ozzWANTED 2009 sausio 2 10:01:15
Patarimas nr. 1:
[b]Neleiskime mūsų šnipinėti:[/b]

Papostinu vieną svarbu mano pasirašytą koduką - kurį naudokite administration/articles.php, administration/news.php, administration/faq.php prieš išsiunčiant kodą. Šis dalykas dalinai turėtų apsaugoti nuo tokių bjaurybių lietuvos hackerių kišančių snifferius į naujienas ar straipsnius.

[code]// Strip Input Function for Members, prevents HTML in unwanted places
function superinput($text) {
if (QUOTES_GPC) $text = stripslashes($text);
$search = array("<script", "script>", "/script", "<?", "?>", "document.cookie", "+document", "cookie;", "Cookie:", "Image()", "_GET", "REMOTE_ADDR", "HTTP_REFERER",);
$replace = array("&#45;script&#45;", "&#45;script&#45;", "&#45;script&#45;", "&lt;&#46;&#63;", "&#63;&#46;&gt;", "&#45;document&#45;", "&#45;document&#45;", "&#45;cookie&#45;", "&#45;cookie&#45;", "&#45;Image&#45;", "&#45;get&#45;", "&#45;remote&#45;addr&#45;", "&#45;http&#45;referer&#45;");
$text = str_replace($search, $replace, $text);
return $text;
}[/code]

Įtepti reikia čia:
dalyje $_POST['save'] (articles.php)
keiskite kodą:
[c]$body = addslash($_POST['body']);
$body2 = addslash($_POST['body2']);[/c]
Į:
[c]$body = superinput(addslash($_POST['body']));
$body2 = superinput(addslash($_POST['body2']));[/c]

Taip pat darykite ir su news.php.

=========================================================

Patarimas nr. 2:
Duom. bazės lentelėje users (Php MyAdmin) atsidarykite dalį "SQL" ir įvykdykite šią eilutę:
[code]ALTER TABLE `[b]PREFIX[/b]_users` ADD `user_specid` VARCHAR( 6 ) NOT NULL DEFAULT '[b]999999[/b]' AFTER `user_id`[/code]
[b]PREFIX[/b] - Jūsų duom. bazės priesaga.
[b]999999[/b] - bet koks 6-ženklis skaičius(sugalvokite bet ką).

Leiskite tik "legalius" prisijungimus. Redaguokite failą "[b]maincore.php[/b]".
[b]LOGIN DALIS:[/b]
Po:
[code]if (isset($_POST['login'])) {
$user_pass = md5($_POST['user_pass']);[/code]

Dėkite šią eilutę:
[code]$spec_id = ""; for ($i=0;$i<=5;$i++) { $spec_id .= chr(rand(97, 122)); }[/code]
Jeigu kam nors kada nors kiltų klausimas kaip veikia chr(rand(97, 122)); , tai informuoju:
Rand ima bet kurį skaičių tarp, šiuo atveju, 97 ir 122 (įskaitytinai), o chr() paverčia skaičių raide per Ascii kodų lentelę. Ten atitinkamai [b]a=97 (dec)[/b].

Prieš:
[code]redirect(BASEDIR."setuser.php?user=".$data['user_name'], true);[/code]
Dėkite šią eilutę:
[code]$res = dbquery("UPDATE ".DB_USERS." SET user_specid='$spec_id' WHERE user_id='".$data['user_id']."'");[/code]

Eilutę:
[code]$cookie_value = $data['user_id'].".".$user_pass;[/code]
Keiskite į:
[code]$cookie_value = $data['user_id'].".".$user_pass.$spec_id;[/code]

[b][i]if (isset($_COOKIE[COOKIE_PREFIX.'user'])) {[/i] dalis:[/b]
Po:
[code]$cookie_2 = (preg_check("/^[0-9a-z]{32}$/", $cookie_vars['1']) ? $cookie_vars['1'] : "");[/code]
Dėkite šią eilutę:
[code]$cookie_3 = (preg_check("/^[0-9a-z]{6}$/", $cookie_vars['2']) ? $cookie_vars['2'] : "");[/code]

Eilutę:
[code]$result = dbquery("SELECT * FROM ".DB_USERS." WHERE user_id='$cookie_1' AND user_password='".md5($cookie_2)."' LIMIT 1");[/code]
Keiskite į:
[code]$result = dbquery("SELECT * FROM ".DB_USERS." WHERE user_id='$cookie_1', user_specid='$cookie_3' AND user_password='".md5($cookie_2)."' LIMIT 1");[/code]

=========================================================
Patarimas nr. 3:
"Deaktyvuokite" senus narius. Maincore.php faile keiskite:
[code]if (isset($_COOKIE[COOKIE_PREFIX.'user'])) {
$cookie_vars = explode(".", $_COOKIE[COOKIE_PREFIX.'user']);
$cookie_1 = isnum($cookie_vars['0']) ? $cookie_vars['0'] : "0";
$cookie_2 = (preg_check("/^[0-9a-z]{32}$/", $cookie_vars['1']) ? $cookie_vars['1'] : "");
$result = dbquery("SELECT * FROM ".DB_USERS." WHERE user_id='$cookie_1' AND user_password='".md5($cookie_2)."' LIMIT 1");[/code]
į
[code]if (isset($_COOKIE[COOKIE_PREFIX.'user'])) {
$cookie_vars = explode(".", $_COOKIE[COOKIE_PREFIX.'user']);
$cookie_1 = isnum($cookie_vars['0']) ? $cookie_vars['0'] : "0";
$cookie_2 = (preg_check("/^[0-9a-z]{32}$/", $cookie_vars['1']) ? $cookie_vars['1'] : "");
$result = dbquery("SELECT * FROM ".DB_USERS." WHERE user_id='$cookie_1' AND user_password='".md5($cookie_2)."' [b]AND user_lastvisit>'".(time()-3600*24*30)."'[/b] LIMIT 1");[/code]

Ir:
[code]if (isset($_POST['login'])) {
$user_pass = md5($_POST['user_pass']);
$user_name = preg_replace(array("/\=/","/\#/","/\sOR\s/"), "", stripinput($_POST['user_name']));
$result = dbquery("SELECT * FROM ".DB_USERS." WHERE user_name='$user_name' AND (user_password='".md5($user_pass)."' OR user_password='$user_pass') LIMIT 1");[/code]

į:
[code]if (isset($_POST['login'])) {
$user_pass = md5($_POST['user_pass']);
$user_name = preg_replace(array("/\=/","/\#/","/\sOR\s/"), "", stripinput($_POST['user_name']));
$result = dbquery("SELECT * FROM ".DB_USERS." WHERE user_name='$user_name' AND (user_password='".md5($user_pass)."' OR user_password='$user_pass') [b]AND user_lastvisit>'".(time()-3600*24*30)."'[/b] LIMIT 1");[/code]


Aktyvacijos faile, darote kopiją login.php failo, tik:
[code]<input type='submit' name='login'[/code]
keičiate į:
[code]<input type='submit' name='refreshuser'[/code]

Refresh kodas vartotojo aktyvacijos faile:
[code]if (isset($_POST['refreshuser'])) {
$user_pass = md5($_POST['user_pass']);
$user_name = preg_replace(array("/\=/","/\#/","/\sOR\s/"), "", stripinput($_POST['user_name']));
$result = dbquery("SELECT user_password,user_lastvisit,user_id FROM ".DB_USERS." WHERE user_name='$user_name' AND (user_password='".md5($user_pass)."' OR user_password='$user_pass') [b]AND user_lastvisit<='".(time()-3600*24*30)."'[/b] ");
if (dbrows($result) != 0) {
$data = dbarray($result);
if ($data['user_password'] == $user_pass) {
$result = dbquery("UPDATE ".$db_prefix."users SET user_password='".md5($user_pass)."' WHERE user_id='".$data['user_id']."'");
}
if ($data['user_status'] == 0 && ($data['user_lastvisit'] < (time()-3600*24*183))) {
$result = dbquery("UPDATE ".$db_prefix."users SET user_lastvisit='".time()."' WHERE user_id='".$data['user_id']."'");
}
redirect(FUSION_SELF."?inf=done");
} else {
redirect(BASEDIR."index.php");
}
}[/code]

==============================
Patarimas nr.4:
Leiskite tik "tikrus" administratorius. Dabar dauguma IP statiniai, taigi:

administration/navigation.php faile pradžioje įrašome šį kodą:
[code]
$legal_ips = array(
"[b]78.11.22.33[/b]",
"[b]78.11.22.34[/b]",
"[b]78.11.22.35[/b]",
"[b]78.11.22.36[/b]"
);

if(!in_array(USER_IP, $legal_ips)) {
if(iMEMBER) {
$id = $userdata['user_id'];
$name = $userdata['user_name'];
} else {
$id = "Svečias";
$name = "";
}
$time = date("Y-m-d H:i:s");
$reason = "Mėginimas įsilaužti. Vartotojo ID: $id , Nickas: $name . Data $time";

$result = dbquery("INSERT INTO ".$db_prefix."blacklist (blacklist_ip, blacklist_reason) VALUES ('".USER_IP."', '$reason')");
fallback(BASEDIR."index.php");
}[/code]

Tą pati darome ir administration .htaccess faile:
[code]order deny,allow
allow from [b]78.11.22.33[/b]
allow from [b]78.11.22.34[/b]
allow from [b]78.11.22.35[/b]
allow from [b]78.11.22.36[/b]
deny from all[/code]


[color=green][b]Pagal @ozzWANTED 2008 © PhpFusion-Lt.com[/b][/color]