Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Czy $_SESSION jest bezpieczny przed wstrzyknięciami sql?

Tak naprawdę nie musisz sprawdzać, czy dane wejściowe są numeryczne, ponieważ w MySQL dowolny ciąg, np. '123abc' w kontekście numerycznym (jak porównywanie z kolumną liczb całkowitych id ) niejawnie przyjmuje tylko cyfry i ignoruje resztę. Ciąg nienumeryczny, taki jak 'abc' po prostu ma wartość całkowitą 0, ponieważ nie ma wiodących cyfr.

Chodzi o to, że wartości są bezpieczne przed wstrzyknięciem SQL, jeśli używasz parametrów zapytania. Nie ma znaczenia, czy dane wejściowe pochodzą z $_SESSION, czy z innego źródła. $_SESSION nie jest ani bezpieczna, ani niebezpieczna w odniesieniu do wstrzykiwania SQL, ważne jest, jak przekazujesz dane do zapytania.

Uprościłbym również kod, aby sformatować listę symboli zastępczych parametrów:

$placeholders = implode(',', array_fill(1, count((array)$_SESSION['story']), '?'));

I zapomnij o bindParam(), po prostu przekaż tablicę do execute() .

//Collect all data needed
$storyQuery = openConnection() -> prepare("SELECT * FROM `stories` 
    WHERE `id` IN ({$placeholders})");
$storyQuery -> execute((array)$_SESSION['story']);
$story = $storyQuery -> fetchAll();

Odpowiedz na swój komentarz:

W PDO możesz użyć nazwanych parametrów, takich jak :id , lub możesz użyć parametrów pozycyjnych, które zawsze są ? (ale nie mieszaj tych dwóch typów w danym zapytaniu, użyj jednego lub drugiego).

Przekazywanie tablicy do execute() automatycznie wiąże elementy tablicy z parametrami. Prosta tablica (tj. indeksowana liczbami całkowitymi) jest łatwa do powiązania z parametrami pozycyjnymi.

Jeśli używasz nazwanych parametrów, musisz przekazać tablicę asocjacyjną, w której klucze tablicy są zgodne z nazwami parametrów. Klucze tablicy mogą opcjonalnie być poprzedzone : ale nie jest to wymagane.

Jeśli jesteś nowy w PDO, naprawdę opłaca się przeczytać dokumentację . Są przykłady kodu i wszystko!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Złożone zapytanie SQL o inwentarzu wielu tabel

  2. Sprawdź, które identyfikatory z zestawu nie występują w tabeli

  3. Laravel (5.3) Elokwentny - Problem w związku

  4. Mysql::Błąd:Zduplikowany wpis

  5. Dziwne zachowanie duplikatów z GROUP_CONCAT dwóch LEFT JOIN z GROUP_BYs