Autor | Zpráva | ||
---|---|---|---|
Kellner Profil * |
#1 · Zasláno: 7. 8. 2017, 17:32:29
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 |
#3 · Zasláno: 7. 8. 2017, 17:59:32
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 ..."); |
||
Kellner Profil * |
#4 · Zasláno: 7. 8. 2017, 18:50:45
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 * |
#5 · Zasláno: 8. 8. 2017, 13:25:28
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. |
||
Časová prodleva: 7 let
|
0