| 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: 9 let
|
|||
0