Ochrana pred SQL INJECTION v $this->db->query()

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Andurit
Člen | 131
+
0
-

Ahojte,
niekedy pri zložitejších QUERY napíšem celý dotaz
týmto spôsobom takže nevužívam explicitne nejaké Nette vychytávky:

return $this->db->query("SELECT * FROM candidates WHERE firstname = ? AND surname = ?" ,$searchParams->firstname, $searchParams->surname);

alebo takto

return $this->db->query("SELECT * FROM candidates WHERE firstname = '".$searchParams->firstname."' AND surname = '".$searchParams->surname."'");

Moja otázka nie, nakolko sú vyššie napísané dotazy bezpečné oproti:

try{
    $con = new PDO( DB_HOST, DB_USER, DB_PASS );
    $con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    $sql = "SELECT * FROM candidates WHERRE firstnaame = :firstnaem AND surname = :surname";
    $stmt = $con->prepare( $sql );
    $stmt->bindValue( "firstnaame", $this->firstnamee, PDO::PARAM_STR );
    $stmt->bindValue( "surname", $this->surname, PDO::PARAM_STR );
    $stmt->execute();
    $result = $stmt -> fetchAll();
    echo $this->convertToJson($result);
}catch (PDOException $e) {
    echo $e->getMessage();
    return false;
}

Vykonavaju sa rovnako s akýmsi „PREPARE“ statement?
Diky

greeny
Člen | 405
+
0
-
  1. je v pohodě
  2. bys neměl používat
  3. je v pohodě
Andurit
Člen | 131
+
0
-

greeny napsal(a):

  1. je v pohodě
  2. bys neměl používat
  3. je v pohodě

Vďaka za názor, môžem ta poprosiť to trocha rozviesť, neviem čo sa deje na pozadí a tak :)

CZechBoY
Člen | 3608
+
0
-

Téměř to stejne jako ve třetím kroku.

greeny
Člen | 405
+
0
-

Andurit napsal(a):

greeny napsal(a):

  1. je v pohodě
  2. bys neměl používat
  3. je v pohodě

Vďaka za názor, môžem ta poprosiť to trocha rozviesť, neviem čo sa deje na pozadí a tak :)

První a třetí možnost jsou v podstatě stejné, jen ta první je příjemnější na psaní a čtení. V druhé možnosti ti musí být jasné, že ten parametr není žádným způsobem bezpečný, protože v daném stringu může být cokoliv.