briedis Posted August 25, 2009 Report Share Posted August 25, 2009 Sveiki! Man ir uztaisīta viesu grāmatas forma (vārds, e-pasts, teksts), kur spiežot submit notiek JS funkcijas izsaukums, kur ar ajax caur GET tiek padoti dati uz php skriptu, kas validē datus un atgriež 1-4 skaitli, kā kļūdas paziņojumu, vai viss veiksmīgi vai nē. Saprotams, ka php skripta adresi nenoslēpsi, ka tam var piekļūt pa taisno un sākt pušot iekšā savus datus nonstopā. Kā lai panāku, ka to php skriptu var izpildīt tikai no konkrētās formas? Esmu lasījis daudz dažādus rakstus par ajax un drošību netā, bet tur pārsvarā tādas vispārējas runas, un nav konkrētu piemēru... Cik saprotu, varētu mēģināt kaut kā ar sesijām - glabāt tur random stringu un to pašu padot caur get - salīdzināt... Būšu pateicīgs par padomiem! Ar cieņu, briedis Quote Link to comment Share on other sites More sharing options...
ohmygod Posted August 25, 2009 Report Share Posted August 25, 2009 Nu, tas skaitlis ko patur sesijā - tas ir tas variants ar kodu, ko parāda bildē un liek ievadīt pie formas submita. Bez šī parametra formas datus nemaz neapskatīt. Bet nu tas nekādīgi nenorobežo tevi no DoS, ko biji pieminējis nosaukumā. DoS ir nenormāls datu flūds, līdz serveris atņirdzas. No datu sūtīšanas vaļā netiksi, to neierobežosi. Vari tikai tos validēt. Quote Link to comment Share on other sites More sharing options...
Aleksejs Posted August 25, 2009 Report Share Posted August 25, 2009 Meklē par to, kā cīnīties ar CSRF - cross site request forgery. Parasti to dara tā, ka pieprasot skriptu tiek prasīts, lai tiktu sūtīts papildus parametrs, kas katru reizi dinamiski tiek ģenerēts no jauna. serveris pie formas nosūtīšanas uzģenerē unikālu identifikatoru, kuru šīs sesijas ietvaros (ierobežotu laiku) var izmantot, lai izsauktu caur AJAX php skriptu. Ja netiek saņemts korekts unikālais identifikators, tad pieprasījums netiek apstrādāts un dati netiek atgriezti. Quote Link to comment Share on other sites More sharing options...
briedis Posted August 25, 2009 Author Report Share Posted August 25, 2009 Pladies par atbildi! Tātad, bez captchas īsti neiztikt? Quote Link to comment Share on other sites More sharing options...
Aleksejs Posted August 25, 2009 Report Share Posted August 25, 2009 Nē, captcha nav obligāti nepieciešama. Quote Link to comment Share on other sites More sharing options...
briedis Posted August 25, 2009 Author Report Share Posted August 25, 2009 (edited) Pašlaik man ir tā, ka php skripts pēc konkrēta pieprasījuma atgriež unikālu stringu, ko ieliek arī sesijā. To unikālo stringu es kabinu klāt formā un padodu kopā ar pārējiem datiem caur ajax uz skriptu. Tad skriptā veicu salīdzināšanu ar to stringu un sesiju. Vai esmu uz pareizā virziena? Vai tas vispār man sniedz kādu drošību? Jo tāpat jebkurš var pieprasīt to stringu tam skriptam... Izskatās tas šitā: PHP skripts: <? session_start(); $session_name = 'unikalais_kods'; if($_GET['get_c']){ $random_code = md5(time() . "random5al75"); $_SESSION[$session_name] = $random_code; exit($random_code); } $name = $_GET['name']; $mail = $_GET['mail']; $text = $_GET['text']; if($_GET['c'] != $_SESSION[$session_name] || strlen($_SESSION[$session_name]) != 32){ exit("5"); } //Validācija un ja ok, pievienošana tālāk seko ?> Javascript: var secret_code; //sheit dabuuju to kodu (kas ir arii sesijaa) $(document).ready( function(){ $.get("ajax/skripts.php", { get_c: '1'}, function(data){ secret_code = data; }); }); //galvenaa funkcija function sendData(){ var name = $("input#vards").val(); var mail = $("input#epasts").val(); var text = $("textarea#teksts").val(); $.get("ajax/skripts.php", { name: name, mail: mail, text: text, c: secret_code}, function(data){ if(data == "1"){ msg = "Veiksmīgi nosūtīts, paldies!"; }else if(data == "2"){ msg = "Kļūda vārdā"; }else if(data == "3"){ msg = "Kļūda e-pastā"; }else if(data == "4"){ msg = "Teksts par īsu vai par garu! (maksimums 2000 zīmes)"; }else if(data == "5"){ msg = "Lūdzu sazinieties ar lapas administratoru..."; }else{ msg = "Servera kļūda"; } $("div#status").html(msg); }); } Edited August 25, 2009 by briedis Quote Link to comment Share on other sites More sharing options...
Aleksejs Posted August 25, 2009 Report Share Posted August 25, 2009 Gandrīz, vienīgi - nevajag padarīt dzīvi vienkāršu uzbrucējam. Nevis skripts.php failā ģenerē kodu, bet gan uzreiz JS piešķir šo kodu: var secret_code; //sheit dabuuju to kodu (kas ir arii sesijaa) <?php session_start(); $session_name = 'unikalais_kods'; $random_code = md5(time() . "random5al75"); $_SESSION[$session_name] = $random_code; echo "secret_code='$random_code'"; ?> $(document).ready( function(){ $.get("ajax/skripts.php", { get_c: '1'}, function(data){ secret_code = data; }); }); //galvenaa funkcija function sendData(){ var name = $("input#vards").val(); var mail = $("input#epasts").val(); var text = $("textarea#teksts").val(); $.get("ajax/skripts.php", { name: name, mail: mail, text: text, c: secret_code}, function(data){ if(data == "1"){ msg = "Veiksmīgi nosūtīts, paldies!"; }else if(data == "2"){ msg = "Kļūda vārdā"; }else if(data == "3"){ msg = "Kļūda e-pastā"; }else if(data == "4"){ msg = "Teksts par īsu vai par garu! (maksimums 2000 zīmes)"; }else if(data == "5"){ msg = "Lūdzu sazinieties ar lapas administratoru..."; }else{ msg = "Servera kļūda"; } $("div#status").html(msg); }); } Un līdz ar to PHP kodā atstāj tikai: <?php if($_GET['c'] != $_SESSION[$session_name] || strlen($_SESSION[$session_name]) != 32){ exit("5"); } //Validācija un ja ok, pievienošana tālāk seko ?> Quote Link to comment Share on other sites More sharing options...
briedis Posted August 25, 2009 Author Report Share Posted August 25, 2009 Ideāli! paldies! :)) Quote Link to comment Share on other sites More sharing options...
Aleksejs Posted August 25, 2009 Report Share Posted August 25, 2009 Nu, gluži ideāli vēl nav, taču sākums ir :) Piemēram, lai pačakarētu prātu "sliktajiem", varētu nodefinēt sesijas mainīgo, kurš jāpadod kā mainīgā nosaukums caur GET nevis, kā ir šobrīd - $_GET['c'] :) Quote Link to comment Share on other sites More sharing options...
werd Posted August 25, 2009 Report Share Posted August 25, 2009 (edited) Papildinot Alekseja teikto, vari to mainīgo veidot ar kādu no hash funkcijām, lai vēl vairāk samazinātu iespēju veikt korektu pieprasījumu. Papildinot par šo tēmu. Laiciņu atpakaļ pats domāju par šo problēmu, viens no maniem risinājumiem bija: 1. PHP failu nokopēt. 2. Pārsaukt konkrēto failu gadījuma simbolu virknē un padot sesijas mainīgajā. 3. Pieprasījumu veikt uz konkrēto failu, kura nosaukums atrodas sesijas mainīgajā. 4. Neatkarīgi no tā vai pieprasījums tiek veikts, izdzēst šo failu pēc, piemēram, 5 sekundēm. Edited August 25, 2009 by werd Quote Link to comment Share on other sites More sharing options...
briedis Posted August 25, 2009 Author Report Share Posted August 25, 2009 Nezinu kā ar to failu kopēšanu. Jādomā tad par permīcijām. Un ja nu kaut kas nav kā vajag, tad var netikt izdzēsti pāris faili un palit mētājoties uz servera :) Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.