Jump to content
php.lv forumi

PHP un AJAX drošība (pret DoS uzbrukumiem)


briedis

Recommended Posts

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 by briedis
Link to comment
Share on other sites

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
?>

Link to comment
Share on other sites

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 by werd
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...