Temos pavadinimas: WordPress, Shopify ir PHPFusion programuotojų bendruomenė :: Kitoks sausainėlis (+special_id)

Parašė BloodKiller· 2008 Lie. 13 01:07:30
#1

Standartinis sausainėlis PHP-Fusion sistemoje yra kažkas panašaus į tai:

fusion_user=1.872ab031e6d4f347fd996aaabfd0ecb7

Na o nenorėtumėte, kad jūsų fusion_user atrodytų taip?

fusion_user=86dd43a66aae4170666177d8a57a80a1.872ab031e6d4f347fd996aaabfd0ecb7

Kuo tai geriau būtų? Kol kas dar nežinom, nes neaišku, kas per daiktas yra tas šifras vietoj 1. Na bet nuosekliai nagrinėdami straipsnį, jūs tai puikiai surpasite. :)

ALTER TABLE {prefix}users ADD special_id VARCHAR(255) NOT NULL AFTER user_status;

Dabar atsidarę register.php, susiraskite šią eilutę:
$result = dbquery("INSERT INTO ".$db_prefix."users (user_name, user_password, user_email, user_hide_email, user_location, user_birthdate, user_aim, user_icq, user_msn, user_yahoo, user_web, user_theme, user_offset, user_avatar, user_sig, user_posts, user_joined, user_lastvisit, user_ip, user_rights, user_groups, user_level, user_status) VALUES('".$user_info['user_name']."', '".$user_info['user_password']."', '".$user_info['user_email']."', '".$user_info['user_hide_email']."', '', '0000-00-00', '', '', '', '', '', 'Default', '0', '', '', '0', '".time()."', '0', '".USER_IP."', '', '', '101', '$activation')");




ir ją pakeiskite į:

$spec_id = md5(sha1(mt_rand()+time()).microtime());
$result = dbquery("INSERT INTO ".$db_prefix."users (user_name, user_password, user_email, user_hide_email, user_location, user_birthdate, user_aim, user_icq, user_msn, user_yahoo, user_web, user_theme, user_offset, user_avatar, user_sig, user_posts, user_joined, user_lastvisit, user_ip, user_rights, user_groups, user_level, user_status, special_id) VALUES('".$user_info['user_name']."', '".$user_info['user_password']."', '".$user_info['user_email']."', '".$user_info['user_hide_email']."', '', '0000-00-00', '', '', '', '', '', 'Default', '0', '', '', '0', '".time()."', '0', '".USER_IP."', '', '', '101', '$activation','$spec_id')");




Tada tame pačiame faile suraskite šią eilutę:

$result = dbquery("INSERT INTO ".$db_prefix."users (user_name, user_password, user_email, user_hide_email, user_location, user_birthdate, user_aim, user_icq, user_msn, user_yahoo, user_web, user_theme, user_offset, user_avatar, user_sig, user_posts, user_joined, user_lastvisit, user_ip, user_rights, user_groups, user_level, user_status) VALUES('$username', '".md5(md5($password1))."', '".$email."', '$user_hide_email', '$user_location', '$user_birthdate', '$user_aim', '$user_icq', '$user_msn', '$user_yahoo', '$user_web', '$user_theme', '$user_offset', '', '$user_sig', '0', '".time()."', '0', '".USER_IP."', '', '', '101', '$activation')");




ją pakeiskite į:

$spec_id = md5(microtime().sha1(mt_rand()+time()));
$result = dbquery("INSERT INTO ".$db_prefix."users (user_name, user_password, user_email, user_hide_email, user_location, user_birthdate, user_aim, user_icq, user_msn, user_yahoo, user_web, user_theme, user_offset, user_avatar, user_sig, user_posts, user_joined, user_lastvisit, user_ip, user_rights, user_groups, user_level, user_status, special_id) VALUES('$username', '".md5(md5($password1))."', '".$email."', '$user_hide_email', '$user_location', '$user_birthdate', '$user_aim', '$user_icq', '$user_msn', '$user_yahoo', '$user_web', '$user_theme', '$user_offset', '', '$user_sig', '0', '".time()."', '0', '".USER_IP."', '', '', '101', '$activation','$spec_id')");




register.php sutvarkytas. Dabar atsidarykite administration/members.php ir susiraskite šią eilutę:

$result = dbquery("INSERT INTO ".$db_prefix."users (user_name, user_password, user_email, user_hide_email, user_location, user_birthdate, user_aim, user_icq, user_msn, user_yahoo, user_web, user_theme, user_offset, user_avatar, user_sig, user_posts, user_joined, user_lastvisit, user_ip, user_rights, user_groups, user_level, user_status) VALUES ('$username', '".md5(md5($_POST['password1']))."', '$email', '$hide_email', '', '0000-00-00', '', '', '', '', '', 'Default', '0', '', '', '0', '".time()."', '0', '".USER_IP."', '', '', '101', '0')");




ją pakeiskite į:

$spec_id = md5(microtime().sha1(mt_rand()+mt_rand(1,2)*time()));
$result = dbquery("INSERT INTO ".$db_prefix."users (user_name, user_password, user_email, user_hide_email, user_location, user_birthdate, user_aim, user_icq, user_msn, user_yahoo, user_web, user_theme, user_offset, user_avatar, user_sig, user_posts, user_joined, user_lastvisit, user_ip, user_rights, user_groups, user_level, user_status, special_id) VALUES ('$username', '".md5(md5($_POST['password1']))."', '$email', '$hide_email', '', '0000-00-00', '', '', '', '', '', 'Default', '0', '', '', '0', '".time()."', '0', '".USER_IP."', '', '', '101', '0', '$spec_id')");




Po šio pakeitimo atsidarykite maincore.php failą ir susiraskite:
$cookie_value = $data['user_id'].".".$user_pass;



tai pakeiskite į:
$cookie_value = $data['special_id'].".".$user_pass;




Dabar tame pačiame faile suraskite šią eilutę:
$result = dbquery("SELECT * FROM ".$db_prefix."users WHERE user_id='$cookie_1' AND user_password='".md5($cookie_2)."'");



ir ją pakeiskite į:
$result = dbquery("SELECT * FROM ".$db_prefix."users WHERE special_id='$cookie_1' AND user_password='".md5($cookie_2)."'");




Po to suraskite šią eilutę:
$cookie_1 = isNum($cookie_vars['0']) ? $cookie_vars['0'] : "0";



ir ją pakeiskite į:
$cookie_1 = isset($cookie_vars['0']) && preg_match("/^[a-z0-9]+$/i",$cookie_vars['0']) ? $cookie_vars['0'] : "0";






BAIGTA. :)

Dabar išsamiai aš jums paaiškinsiu, kuo tai geriau nei paprastas ID. Matote, kai yra paprastas ID, per ciklines socket užklausas lengviau vykdyti bruteforce ataką, spėliojant vartotojų ID nei jų special_id, kurio niekas visiškai nežino ir net negali numatyti, nes jis niekur nėra skelbiamas, priešingai nei paprastas vartotojo ID - jis yra sugeneruojamas ir suteikiamas visiems skirtingas. Tokiu būdu yra visiškai užkertamas kelias bruteforce atakoms per sausainėlius.





P.S. Jeigu kils problemų, rašykite čia, nes šitos sistemos neištestavau visu 100%, tad gali būti nesklandumų.

Parašė ramon· 2008 Lie. 13 01:07:16
#2

Joa gan neblogai padirbejai ;)

Parašė Kelmas· 2008 Lie. 13 10:07:42
#3

Kaško nesupratau, ar durnas, bet tik tos apsaugos nesugebų įsidėt į saitą, nes tada neleidžia logintis.

Parašė MAnjack· 2008 Lie. 13 10:07:16
#4

Šiaip galima ir papraščiau. md5 paswordą užkoduot base64(), o vėliau jį atkoduot. O išėmus iš sausainėlio tą dalį, bent jauper Operą jos atkoduoti nepavyko.

Parašė MaFetas· 2008 Lie. 13 10:07:58
#5

Turiu laisvo laiko reiks manau išbandyti :) ;)

Parašė ozzWANTED· 2008 Lie. 13 12:07:09
#6

Mldc blood, šitą ir į straipsnius galima pateikt. :)

Parašė bruzgis· 2008 Lie. 13 15:07:07
#7

taip dragelis, sitas modas turi spragu, ji ikisus negalima prie svetaines prisijunt.
leisk paklaust o kurioj vietoj i db iraso special id? :D
tik tada kai uzsiregistruoja isnaujo matyt... o esamiem vartotojam taip ir nesukuria to special_id

Parašė bruzgis· 2008 Lie. 13 15:07:51
#8

Nu tai ir sukurkim mes ta special_id esamiems vartotojams:

atsidarom maincore.php
susirandam
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_prefix."users WHERE user_name='$user_name' AND (user_password='".md5($user_pass)."' OR user_password='$user_pass')");
        if (dbrows($result) != 0 && check_captcha($_POST['captcha_encode'],$_POST['captcha_code'])) {      
            
                $data = dbarray($result);




ir po juo pridedam si koda

if ($data['special_id'] == '') {
            $spec_id = md5(microtime().sha1(mt_rand()+mt_rand(1,2)*time()));
            $result = dbquery("UPDATE ".$db_prefix."users SET special_id='$spec_id' WHERE user_id='".$data['user_id']."'"); }



Parašė MAnjack· 2008 Lie. 13 16:07:11
#9

Man irgi šitas klausimas buvo iškilęs. Ką darys senesnį saito nariai. Norėjau jau aš papildymą šitą įdėt.

Parašė bruzgis· 2008 Lie. 13 23:07:42
#10

tik manycia reiktu if ($data['special_id'] == 0) { keist i if ($data['special_id'] == '') {
nes gi seno nario special_id lygus niekam

Parašė mXt· 2008 Lie. 13 23:07:37
#11

Apkeiciant cookies vistiek imanoma isilauzt. Ar klystu?

Parašė bruzgis· 2008 Lie. 13 23:07:13
#12

nu su situ kazi id tai nezinai special to :) cookiuose tai hasha gaudavai ir id suzinodavai nario ir vsio sukeisti refresh ir turi o cia vietoj id eina special_id


Parašė ramon· 2008 Lie. 13 23:07:26
#13

Isilauzti imanoma bet reikia zn user_id='1' special_id bei jo hasha :]

Parašė Kelmas· 2008 Lie. 14 08:07:20
#14

Nu ačiū chipass, bet man vistiek neįrašo po tavo pakeitimo į db special_id. ?|

Redagavo Kelmas· 2008 Lie. 14 08:07:38

Parašė MAnjack· 2008 Lie. 14 09:07:09
#15

Bandyk taip:
if (!isset($data['special_id'])) {

Be to manau naudojant šitą kodą maincore.php, dalies kodo nelabai ir reikia. Tingiu plčiau aiškint. Kam reikės tas supras :D

Parašė Kelmas· 2008 Lie. 14 09:07:30
#16

Dėl to kur įrašo jau įsirašiau automatiškai naujam faile sugeneraves, bet vistiek šūdas nelogina.

Šitą apsaugą reikia visa perašyt, nes užreginau naują userį irgi taspats.

Redagavo Kelmas· 2008 Lie. 14 09:07:39

Parašė bruzgis· 2008 Lie. 16 20:07:42
#17

nieko perasinet nereikia... viskas kuo puikiausiai vekia... su mano duotu kodu tuo labiau veikia. ir prie nauju useriu prideda ta id. tad pasinagrinek daugiau, pamastyk ir susitvarkysi.

Parašė irmantosas· 2010 Bir. 16 21:06:45
#18

kame beda dabar man meta jog neteisingas nario vardas ar slaptazodis