Mysql
 sql >> Database >  >> RDS >> Mysql

$ _SESSION è al sicuro da sql injection?

Non è necessario verificare che l'input sia numerico, perché in MySQL qualsiasi stringa, ad es. '123abc' in un contesto numerico (come essere confrontato con una colonna intera id ) prende implicitamente solo le cifre e ignora il resto. Una stringa non numerica come 'abc' ha semplicemente il valore intero 0 perché non ci sono cifre iniziali.

Il punto è che i valori sono al sicuro da SQL injection se si utilizzano parametri di query. Se gli input provengono da $_SESSION o da un'altra fonte è irrilevante. $_SESSION non è né sicuro né pericoloso rispetto all'SQL injection, è il modo in cui passi i dati alla tua query che conta.

Semplificherei anche il codice per formattare l'elenco dei segnaposto dei parametri:

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

E dimentica bindParam(), passa semplicemente l'array a execute() .

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

Re il tuo commento:

In PDO, puoi utilizzare entrambi i parametri denominati come :id oppure puoi utilizzare i parametri posizionali, che sono sempre ? (ma non mescolare questi due tipi in una determinata query, usa l'uno o l'altro).

Passaggio di un array a execute() associa automaticamente gli elementi dell'array ai parametri. Un semplice array (cioè indicizzato da numeri interi) è facile da associare a parametri posizionali.

Se si utilizzano parametri denominati, è necessario passare un array associativo in cui le chiavi dell'array corrispondono ai nomi dei parametri. Le chiavi dell'array possono essere opzionalmente precedute da : ma non è obbligatorio.

Se non conosci il PDO, vale davvero la pena leggere la documentazione . Ci sono esempi di codice e tutto il resto!