/
Welcome Guest!
featured-image

Cum sa evitam XSS (Cross Side Scripting)

1.Cum sa evitam XSS (Cross Side Scripting)
Atacurile de genul XSS se realizeaza in special la casutele de cautare interna, sau la formulare de inregistrare (cu stocare in baza de date). Daca ceea ce utilizatorul introduce utilizatorul nu este filtrat, atunci poate introduce coduri HTML care vor functiona perfect in pagina.

Exemplul prost:

1.Cum sa evitam XSS (Cross Side Scripting)
Atacurile de genul XSS se realizeaza in special la casutele de cautare interna, sau la formulare de inregistrare (cu stocare in baza de date). Daca ceea ce utilizatorul introduce utilizatorul nu este filtrat, atunci poate introduce coduri HTML care vor functiona perfect in pagina.

Exemplul prost:

PHP Code: (Select All)
//sa zicem ca spre fisierul acesta este redirectionat userul dupa ce apasa submit.
’. $CuvantCautat .'
’;
$query = mysql_query(„SELECT camp1,camp2 FROM tabel WHERE camp1 = ‘”. $CuvantCautat .”‘”);

Astfel, cand o sa apara in pagina „Rezultatele cautarii pentru: X”. Acel X poate fi un cod html, javascript, orice, care va functiona.
Acelasi lucru se poate intampla si la formulare de inregistrare. User-ul baga la numele de utilizator de exemplu un cod JS, care va putea functiona in pagina. Despre cum trebuie sa arate un formular de inregistrare securizat vom vorbi alta data insa.

Exemplu corect

PHP Code: (Select All)
//sa zicem ca spre fisierul acesta este redirectionat userul dupa ce apasa submit.
’. $CuvantCautat .'
’;
$query = mysql_query(„SELECT camp1,camp2 FROM tabel WHERE camp1 = ‘”. $CuvantCautat .”‘”);

Aceasta este metoda mea. Bineinteles ca exista mult mai multe, de exemplu cu strip_tags(), etc.
Dupa cum am zis, in urmatorul numar vom vorbi despre un formular de inregistrare.

2.Formular de inregistrare securizat

Dupa cum am zis, o sa vorbim despre cum ar trebui sa arate un formular de inregistrare securizat.

In primul rand, o sa cream o baza de date, si in ea un tabel ‘useri’. Codul SQL pentru tabel:
Code: (Select All)
CREATE TABLE useri (
id int(11) NOT NULL auto_increment,
user char(30) NOT NULL default ”,
parola char(30) NOT NULL default ”,
email char(60) NOT NULL default ”,
PRIMARY KEY (id));

Acum, scriptul de inregistrare. Prima data formularul:

PHP Code: (Select All)

” method=”POST”>
Nume:

Parola:

Parola din nou:

Email (valid!):


Iar acum scriptul PHP pentru validare:

PHP Code: (Select All)
if($_SERVER[‘REQUEST_METHOD’]==’POST’){
//acum trebuie sa validam ceea ce a introdus utilizatorul
//o sa folosim o metoda gandita de mine.
// cream o variabila, careia ii adaugam erorile din formular
// daca exista. daca nu exista si variabila e inca goala, putem trece mai departe.

$err; //creem acea variabila
if( empty($_POST[‘user’]) ) $err = ‘Nu ai introdus niciun nume de utilizator
’;
if(strlen($_POST[‘user’])>30) $err .= ‘Numele de utilizator poate avea doar 30 caractere.
’;
if(empty($_POST[‘pass1’]) || empty ($_POST[‘pass2’]) || $_POST[‘pass1’] != $_POST[‘pass2’]) {
$err .= ‘Parolele nu se potrivesc.
’;
}
if(strlen($_POST[‘pass1’])>30) $err .= ‘Parola poate avea doar 30 caractere.
’;
if(empty($_POST[‘email’]) || !strstr($_POST[‘email’], ‘@’) || !strstr($_POST[‘email’], ‘.’)) $err .= ‘Email invalid
’;
//La email, am verificat daca in componenta lui exista un @ si un punct ( . ) .
//Daca nu exista, atunci adresa de mail nu este valida
//la toate am folosit functia empty(), pentru a vedea
//daca campurile au fost sau nu completate

if(!empty($err)){ //variabila $err nu este goala, deci exista erori
echo $err; //afisam erorile
}else{ //totul e ok
$hostbazadate = ‘localhost’;
$userbazadate = ‘user’;
$parolabazadate = ‘parola’;

$conn = mysql_connect($hostbazadate, $userbazadate, $parolabazadate) or die (‘Nu ma pot conecta la mysql’);

$numebazadate = ‘nume’;
mysql_select_db($numebazadate);
//inlocuiti mai sus cu datele Dvs.
$user=mysql_real_escape_string($_POST[‘user’]);
$parola=mysql_real_escape_string($_POST[‘parola’]);
$email=mysql_real_escape_string($_POST[‘email’]);

if(mysql_query(„INSERT INTO useri (user, parola, email)
VALUES
(‘”. $user .”‘, ‘”. $parola .”‘, ‘”. $email .”‘)”)) {
echo ‘Utilizator adaugat cu succes !’;
}else{
echo mysql_error();
}
}
}else{
?>
//codul de mai sus (formularul)

Cam asta e tot. Pentru a adauga mai multe campuri este simplu. Doar utilizati modelele de mai sus.
Pentru logare, se folosesc sesiunile, lucru de care vom vorbi data viitoare.
Codul de mai sus l-am adaptat pentru a incapea pe forum. Codul sursa difera putin, dar face exact acelasi lucru.
PHP Code: (Select All)
//sa zicem ca spre fisierul acesta este redirectionat userul dupa ce apasa submit.
<?php
//conectare la bd

$CuvantCautat = $_POST[‘cuvant’];
echo ‘Rezultatele cautarii pentru: <i>’. $CuvantCautat .'</i><br />’;
$query = mysql_query(„SELECT camp1,camp2 FROM tabel WHERE camp1 = ‘”. $CuvantCautat .”‘”);

Astfel, cand o sa apara in pagina „Rezultatele cautarii pentru: X”. Acel X poate fi un cod html, javascript, orice, care va functiona.
Acelasi lucru se poate intampla si la formulare de inregistrare. User-ul baga la numele de utilizator de exemplu un cod JS, care va putea functiona in pagina. Despre cum trebuie sa arate un formular de inregistrare securizat vom vorbi alta data insa.

Exemplu corect

PHP Code: (Select All)
//sa zicem ca spre fisierul acesta este redirectionat userul dupa ce apasa submit.
<?php
//conectare la bd

$CuvantCautat = mysql_real_escape_string(htmlentities($_POST[‘cuvant’])); //folosim my…string() pt a filtra caracterele care pot interfera cu comanda SQL,
// htmlentities pentru a filtra caracterele HTML
echo ‘Rezultatele cautarii pentru: <i>’. $CuvantCautat .'</i><br />’;
$query = mysql_query(„SELECT camp1,camp2 FROM tabel WHERE camp1 = ‘”. $CuvantCautat .”‘”);

Aceasta este metoda mea. Bineinteles ca exista mult mai multe, de exemplu cu strip_tags(), etc.
Dupa cum am zis, in urmatorul numar vom vorbi despre un formular de inregistrare.

2.Formular de inregistrare securizat

Dupa cum am zis, o sa vorbim despre cum ar trebui sa arate un formular de inregistrare securizat.

In primul rand, o sa cream o baza de date, si in ea un tabel ‘useri’. Codul SQL pentru tabel:
Code: (Select All)
CREATE TABLE useri (
id int(11) NOT NULL auto_increment,
user char(30) NOT NULL default ”,
parola char(30) NOT NULL default ”,
email char(60) NOT NULL default ”,
PRIMARY KEY (id));

Acum, scriptul de inregistrare. Prima data formularul:

PHP Code: (Select All)
<form action=”<?php echo $_SERVER[‘REQUEST_URI’]; ?>” method=”POST”> <!–validarea se va face in acelasi fisier–>
Nume: <br /><input type=”text” name=”user” /><br /><br />
Parola: <br /><input type=”password” name=”pass1″ /><br /><br />
Parola din nou: <br /><input type=”password” name=”pass2″ /><br /><br />
Email (valid!): <br /><input type=”text” name=”email” /><br /><br />
<input type=”submit” value=”Inregistreaza-te !” />
</form>

Iar acum scriptul PHP pentru validare:

PHP Code: (Select All)
if($_SERVER[‘REQUEST_METHOD’]==’POST’){
//acum trebuie sa validam ceea ce a introdus utilizatorul
//o sa folosim o metoda gandita de mine.
// cream o variabila, careia ii adaugam erorile din formular
// daca exista. daca nu exista si variabila e inca goala, putem trece mai departe.

$err; //creem acea variabila
if( empty($_POST[‘user’]) ) $err = ‘Nu ai introdus niciun nume de utilizator <br />’;
if(strlen($_POST[‘user’])>30) $err .= ‘Numele de utilizator poate avea doar 30 caractere. <br />’;
if(empty($_POST[‘pass1’]) || empty ($_POST[‘pass2’]) || $_POST[‘pass1’] != $_POST[‘pass2’]) {
$err .= ‘Parolele nu se potrivesc. <br />’;
}
if(strlen($_POST[‘pass1’])>30) $err .= ‘Parola poate avea doar 30 caractere. <br />’;
if(empty($_POST[‘email’]) || !strstr($_POST[‘email’], ‘@’) || !strstr($_POST[‘email’], ‘.’)) $err .= ‘Email invalid<br />’;
//La email, am verificat daca in componenta lui exista un @ si un punct ( . ) .
//Daca nu exista, atunci adresa de mail nu este valida
//la toate am folosit functia empty(), pentru a vedea
//daca campurile au fost sau nu completate

if(!empty($err)){ //variabila $err nu este goala, deci exista erori
echo $err; //afisam erorile
}else{ //totul e ok
$hostbazadate = ‘localhost’;
$userbazadate = ‘user’;
$parolabazadate = ‘parola’;

$conn = mysql_connect($hostbazadate, $userbazadate, $parolabazadate) or die (‘Nu ma pot conecta la mysql’);

$numebazadate = ‘nume’;
mysql_select_db($numebazadate);
//inlocuiti mai sus cu datele Dvs.
$user=mysql_real_escape_string($_POST[‘user’]);
$parola=mysql_real_escape_string($_POST[‘parola’]);
$email=mysql_real_escape_string($_POST[‘email’]);

if(mysql_query(„INSERT INTO useri (user, parola, email)
VALUES
(‘”. $user .”‘, ‘”. $parola .”‘, ‘”. $email .”‘)”)) {
echo ‘Utilizator adaugat cu succes !’;
}else{
echo mysql_error();
}
}
}else{
?>
//codul de mai sus (formularul)
<?php
}
?>

Cam asta e tot. Pentru a adauga mai multe campuri este simplu. Doar utilizati modelele de mai sus.
Pentru logare, se folosesc sesiunile, lucru de care vom vorbi data viitoare.
Codul de mai sus l-am adaptat pentru a incapea pe forum. Codul sursa difera putin, dar face exact acelasi lucru.

Gabriel Webmaster