sql >> Databáze >  >> RDS >> Oracle

Zabraňuje oci_bind_by_name bezpečně vkládání SQL?

Použití vázaných parametrů je v běžných případech dostačující a je to dobrá praxe, jak se vyhnout vkládání SQL.

Ale parametr v připraveném příkazu lze použít pouze pro hodnotu ve výrazu SQL. Jinými slovy, kde byste normálně napsali řetězcový literál v uvozovkách, literál data v uvozovkách nebo číselný literál. A jeden parametr ==jedna hodnota (žádné seznamy).

Pro tyto případy byste měli použít vázané parametry. Pokud se ptáte na tuto otázku, protože si myslíte, že byste mohli chtít přeskočit použití vázaných parametrů, pokud někdo odpoví, že nejsou dostatečné, pak se omlouvám, nebudete mít omluvu z praktik bezpečného programování.

Existují však další (možná méně obvyklé) případy, kdy vázané parametry nefungují. Pokud potřebujete napsat dotaz s názvem dynamické tabulky, názvem sloupce nebo jiným identifikátorem nebo celým výrazem nebo klíčovým slovem SQL, potřebujete jinou metodu. Tyto případy musí být opraveny v syntaxi SQL v připravit čas, takže je nelze parametrizovat.

Zde je například dotaz s dynamickými částmi označenými pomocí proměnných, které nemohou být parametry:

$sql = "SELECT * FROM mytable ORDER BY $column_of_users_choice $asc_or_desc";

Pro tyto případy byste měli použít bílou listinu . Jinými slovy, ujistěte se, že řetězec, který interpolujete do dotazu jako název dynamické tabulky, je ve skutečnosti jednou z tabulek, které existují ve vaší databázi. Ujistěte se, že klíčová slova SQL jsou legitimní klíčová slova.

Nikdy převezměte vstup uživatele doslovně a interpolujte jej do SQL (nebo jakéhokoli jiného kódu, který je analyzován za běhu, jako je argument, který zadáte do eval() nebo shellexec() ). A není to jen uživatelský vstup, který může být nebezpečným obsahem.

Podívejte se také na mou prezentaci Mýty a omyly vkládání SQL pro další vysvětlení.




  1. Jak aktualizovat všechny sloupce pomocí INSERT ... ON CONFLICT ...?

  2. Rodičovský strom v mysql tabulce (with-loop)

  3. Aktualizujte spojenou tabulku prostřednictvím SQLAlchemy ORM pomocí session.query

  4. Zobrazit a vymazat mezipaměti/vyrovnávací paměti Postgres?