Prepararea și sanitizarea interogărilor SQL

Am inteles ca pentru inlaturarea riscului de SQL injection ar fi recomandata folosirea functiei prepare. Stie cineva sa explice mai exact functia si cand ar trebui s-o folosim? Ar trebui folosita de fiecare data cand trimitem interogari catre BD?

Multumesc.

Uite aici un răspuns scurt care explică concetul de bază.

http://stackoverflow.com/a/60496

@noah cuvantul sanitizarea nu exista in limba romana i.e. use English next time for common programming expressions :sunny:

on topic: use a framework then apply over it basic guidelines

1 Like

Ar fi ceva de genul

<?php
        $conn =  new mysqli('', '', '', '');
            // "?" in functie de cate variabile avem de inserat.
            $stmt = $conn->prepare('INSERT INTO tabel (coloana)VALUES (?)'); 
            if ($stmt === FALSE ){
            trigger_error('Text' . mysqli_error());
            } else {
        // s fiind tipul variabilei, care poate fi s, i, d.
            $stmt->bind_param('s', $variabila);
            $stmt->execute();
            $stmt->close();

            }

?>



<?php
        $stmt= $conn->prepare('SELECT id, nume FROM bd WHERE id = ? AND nume = ?');    
          if ($stmt === FALSE ){
            trigger_error('Text' . mysqli_error());
            } else {
        $stmt->bind_param('is', $id, $nume);
        $stmt->execute();
        $rezultate = $stmt->get_result();
        while($row = $rezultate->fetch_assoc()){
        echo $row['id'] . $row['nume'];
}
        $stmt->close();
        $conn->close();
     ?>

Nu am incercat ce am scris mai sus pentru ca nu am posibilitatea momentan.

@dakull
O fi verbul de la sanitatie si sinonim pentru asanare, chiar nu stiu. In orice caz, nu este scris de mine titlul.

Multumesc pentru raspunsuri.

@noah:eu am editat titlul. Consider că-i mult mai clar comparativ cu Întrebare PHP cum era inițial.
@dakull: prespun că ai și o sugestie pentru un alt cuvânt?

@iamntz pei am raspuns:

Din cate stiu eu, nu se prea recomanda folosirea prepare-ului deoarece ar consuma multe resurse. Voi ce parere aveti?

Sună a micro optimizare, se poate rezolva relativ simplu unde e cazul, când e cazul, dacă e cazul.

It’s not a problem until it’s a problem™

2 Likes

Am niste probleme in continuare cu “prepare”, daca m-ati putea ajuta si pe mine.

<?php 
session_start();
	if($_SERVER['REQUEST_METHOD'] == 'POST') {
	
		$username = $_POST['username'];
		$password = $_POST['password'];
		
		require_once('../includes/db_connect.php');
		if(empty($username) || empty($password)) {
			echo 'Missing information';
		} else {
			$username = strip_tags($username);
			$password = strip_tags($password);
			$password = md5($password);
			$stmt = $conn->prepare("SELECT user_id, username FROM user WHERE username = ? AND password = ? LIMIT 1");
			$stmt->bind_param('ss', $username, $password );
			$stmt->execute();
			$stmt->get_result();
			$stmt->bind_result($user_id, $user);
				echo $user_id;
				
			
		}
	}


?>

Md5 se foloseste doar de forma, nu voi lasa asa.
Unde este ultimul echo as fi vrut sa setez sesiunea dar nu am reusit, pana la urma dupa zeci de variante si dezorientare totala creata prin urmarirea numeroaselor subiecte de pe stackoverflow si alte forumuri am ramas la asta. Am citit atatea pareri, majoritatea in contradictoriu, ca nici nu mai stiu ce fac.

Un var dump pus inainte de echo $user_id; imi returneaza:

object(mysqli_stmt)#2 (10) { ["affected_rows"]=> int(1) ["insert_id"]=> int(0) ["num_rows"]=> int(0) ["param_count"]=> int(2) ["field_count"]=> int(2) ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["sqlstate"]=> string(5) "00000" ["id"]=> int(1) }

Nu prea inteleg nimic din asta…

le: Am uitat sa zic. Ultimul echo nu afiseaza nimic.

Resursele consumate in plus sunt foarte putine, majoritatea framework-urilor folosesc prepare. Deci poti sa folosesti prepare linistit.

@noah O folosesti de fiecare data cand folosesti variabile. Apropo, mai baga-ti ceva de securitate inainte de asta, o alerta pe e-mail, un safe mode. Ceva, orice. Intotdeauna exista riscul de a uita sa folosesti prepare.