Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Czy oci_bind_by_name zapobiega bezpiecznie wstrzykiwaniu SQL?

Użycie parametrów powiązanych jest wystarczające w typowych przypadkach i jest dobrą praktyką, aby uniknąć wstrzykiwania SQL.

Ale parametr w przygotowanej instrukcji może być użyty tylko jako wartość w wyrażeniu SQL. Innymi słowy, gdzie normalnie napisałbyś cytowany literał ciągu, cytowany literał daty lub literał numeryczny. I jeden parametr ==jedna wartość (bez list).

W takich przypadkach należy używać parametrów powiązanych. Jeśli zadajesz to pytanie, ponieważ uważasz, że możesz chcieć pominąć używanie powiązanych parametrów, jeśli ktoś odpowie, że nie są one wystarczające, przepraszam, nie będziesz zwolniony z bezpiecznych praktyk programistycznych.

Istnieją jednak inne (być może mniej powszechne) przypadki, w których parametry powiązane nie działają. Jeśli chcesz napisać zapytanie z dynamiczną nazwą tabeli, nazwą kolumny lub innym identyfikatorem, całym wyrażeniem lub słowem kluczowym SQL, potrzebujesz innej metody. Te przypadki należy naprawić w składni SQL w przygotuj czas, więc nie można ich sparametryzować.

Na przykład, oto zapytanie z dynamicznymi częściami oznaczonymi za pomocą zmiennych, które nie mogą być parametrami:

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

W takich przypadkach należy używać białej listy . Innymi słowy, upewnij się, że łańcuch, który interpolujesz w zapytaniu jako dynamiczna nazwa tabeli, jest w rzeczywistości jedną z tabel istniejących w Twojej bazie danych. Upewnij się, że słowa kluczowe SQL są prawidłowymi słowami kluczowymi.

Nigdy weź dane wejściowe użytkownika dosłownie i interpoluj je do SQL (lub dowolnego innego kodu, który jest analizowany w czasie wykonywania, na przykład argument, który podajesz do eval() lub shellexec() ). Nie tylko dane wprowadzane przez użytkownika mogą stanowić niebezpieczną treść.

Zobacz także moją prezentację Mity i błędy dotyczące wstrzykiwania SQL więcej wyjaśnień.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle :konkatenacja ciągów jest za długa

  2. Standard ANSI SQL dla słowa kluczowego ORACLE MINUS

  3. ORA-02070:baza danych nie obsługuje w tym kontekście

  4. OracleCommandBuilder.DeriveParameters() zgłasza OracleException:ORA-06564:obiekt nie istnieje ORA-06512:w SYS.DBMS_UTILITY

  5. W jaki sposób Oracle przetwarza wywołania funkcji składowanych w SQL?