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
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
Andurit napsal(a):
greeny napsal(a):
- je v pohodě
- bys neměl používat
- 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.