sql >> Databáze >  >> RDS >> Mysql

PHP / MySQLi:Jak zabránit vkládání SQL při INSERT (kód částečně funguje)

V části Nový kód PHP úryvku, stále jste zranitelní vůči injekcím.
Používáte připravené prohlášení ve vložené části, ale ve skutečnosti nepoužíváte síly přípravků správně.

Při vytváření připraveného příkazu vytvoříte dotaz, do kterého místo nezpracovaných hodnot přidáte zástupné symboly:

$stmt = $conn->prepare("INSERT INTO Users (email, pw) VALUES (?, ?)");

Otazníky jsou zástupné symboly a později jsou nahrazeny pomocí bind_param metoda:

$stmt->bind_param('ss', $email, $pw);

ss část volání bind říká mysql db, že její dva řetězce, které jsou předány do databáze (s pro string , i pro int atd).
Vázáte parametr ($name ), ale v dotazu nemá žádný zástupný symbol ani žádný typ odkazu..?

Na druhou stranu váš příkaz select je stále nebezpečný a otevřený zranitelnostem.
Pravděpodobně bych tam použil připravený příkaz, stejně jako u vložené části.

Vždy se chcete ujistit, že vstup od uživatele je pro databázi „bezpečný“, pokud spojíte řetězec dotazu a přidáte do něj uživatelský vstup, databáze řetězce neunikne, pouze ji spustí.

Používejte pouze standardní query volání metody, když píšete celý dotaz sami, bez jakýchkoliv vstupních parametrů, a zejména bez vstupních parametrů, které uživatel předal!



  1. Jak funguje DB_NAME() na serveru SQL Server

  2. MySQL python konektor:ne všechny argumenty jsou převedeny během formátování bajtů

  3. jak minimalizovat svůj dotaz?

  4. Při importu souboru mysqldump ERROR 1064 (42000) poblíž ' ■/ ' na řádku 1