Autor Zpráva
Kellner
Profil *
Dobrý den,
zkoumám jak zabezpečit web proti SQL injection.. návodů na netu je spoustu, i tady v diskuzi.. některé jsou bohužel už dost staré a podle všeho v dnešní době už nepoužitelné.
Pak jsem objevil tohle.. web s tím funguje, spíš si úplně nejsem jistý, zda li to jako zabezpečení proti SQL injection funguje. Díky za každou radu, Kellner

SOUBOR DB.PHP
<?php
$username = "XXX"; 
$password = "XXX"; 
$hostname = "XXX"; 
$databasename = 'XXX';
$mysqli = new mysqli($hostname, $username, $password, $databasename);
mysqli_set_charset($mysqli,"utf8");     
?>

Dotaz SELECT 
<?php
if($user->is_logged_in()){   
$login = $_SESSION['username'];
}
$cislo_polozky=1;

$uzivatel = filter_var($login,FILTER_SANITIZE_EMAIL); 
$cislo_polozky_filtr = filter_var($cislo_polozky,FILTER_SANITIZE_NUMBER_INT);

$results    =    $mysqli->query("SELECT * FROM `seznam_polozek` WHERE `id_polozky` = '".$cislo_polozky_filtr."' AND `uzivatel` = '" . $uzivatel . "' ");
while($row = $results->fetch_assoc())     {
echo $row["nazev_polozky"]; 
} 
?>


Dotaz INSERT
<?php
if($user->is_logged_in()){   
$login = $_SESSION['username'];
}

$uzivatel = filter_var($login,FILTER_SANITIZE_EMAIL);  
$id_polozky = filter_var($_POST["id_polozka"],FILTER_SANITIZE_NUMBER_INT);  
$nazev_polozky = filter_var($_POST["nazev_polozka"],FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
  
$insert_row = $mysqli->query("INSERT INTO `seznam_polozek`(`id_polozky`, `nazev_polozky`, `uzivatel`) VALUES('".$id_polozky."','".$nazev_polozky."','".$uzivatel."')"); 

?>
pcmanik
Profil
Kellner:
Sanizovať string tak jednoducho nepôjde.
Zabezpečenie proti SQL-injection sú prepared statements a práca s nimi je v mysqli podľa mňa zbytočne ukecaná, tak odporúčam prejsť na PDO.
Keeehi
Profil
Kellner:
spíš si úplně nejsem jistý, zda li to jako zabezpečení proti SQL injection funguje
Nefunguje.

některé jsou bohužel už dost staré a podle všeho v dnešní době už nepoužitelné.
Ono escapování je naprosto jednoduché.
//pokud se jedná o řetězec
$mysqli->query("SELECT * FROM `tabulka` WHERE `jmeno` = '".$mysqli->real_escape_string($name)."' OR ...");
//pokud se jedná o číslo
$mysqli->query("SELECT * FROM `tabulka` WHERE `id` = ".(int)$id." OR ...");
To jsou dva nejčastější případy které budeš potřebovat.
Kellner
Profil *
Díky za odpovědi, to real_escape_string nevypadá složitě.

A jen tak ze zvědavosti se zeptám kdy, nebo jak se používá ta funkce FILTER_SANITIZE_STRING ?
..objevil jsem ji v jednom návodu, kde se pomocí AJAXu ukládá text od uživatele do databáze.

if(isset($_POST["content_txt"]) && strlen($_POST["content_txt"])>0) 
{    
$contentToSave = filter_var($_POST["content_txt"],FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);  

$insert_row = $mysqli->query("INSERT INTO `tabulka`(`tvuj_text`) VALUES('".$contentToSave."')"); 

Takže ani pro INSERT tato funkce nefnguje proti SQL-injection?
M4n
Profil *
Kellner:
Takže ani pro INSERT tato funkce nefnguje proti SQL-injection?
Ne. FILTER_SANITIZE_STRING je téměř ekvivalentem funkce htmlspecialchars(). Escapuje tedy řídicí znaky HTML kódu, s SQL nemá nic společného.

Současně jediný správný způsob komunikace s databází nastínil pcmanik – tedy PDO a od něj odvozené třídy.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: