Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

O $ _SESSION é seguro contra injeções de sql?


Você realmente não precisa testar se a entrada é numérica, porque no MySQL, qualquer string, por exemplo, '123abc' em um contexto numérico (como ser comparado a uma coluna inteira id ) implicitamente pega apenas os dígitos e ignora o resto. Uma string não numérica como 'abc' simplesmente tem o valor inteiro 0 porque não há dígitos iniciais.

A questão é que os valores estão protegidos contra injeção de SQL se você usar parâmetros de consulta. Se as entradas vêm de $_SESSION ou de outra fonte é irrelevante. $_SESSION não é seguro ou inseguro em relação à injeção de SQL, é como você passa os dados para sua consulta que importa.

Eu também simplificaria o código para formatar a lista de espaços reservados para parâmetros:
$placeholders = implode(',', array_fill(1, count((array)$_SESSION['story']), '?'));

E esqueça o bindParam(), apenas passe o array para execute() .
//Collect all data needed
$storyQuery = openConnection() -> prepare("SELECT * FROM `stories` 
    WHERE `id` IN ({$placeholders})");
$storyQuery -> execute((array)$_SESSION['story']);
$story = $storyQuery -> fetchAll();

Re seu comentário:

No PDO, você pode usar parâmetros nomeados como :id , ou você pode usar parâmetros posicionais, que são sempre ? (mas não misture esses dois tipos em uma determinada consulta, use um ou outro).

Passando um array para execute() liga automaticamente os elementos da matriz aos parâmetros. Uma matriz simples (ou seja, indexada por inteiros) é fácil de vincular a parâmetros posicionais.

Se você usa parâmetros nomeados, deve passar um array associativo onde as chaves do array correspondem aos nomes dos parâmetros. As chaves de matriz podem opcionalmente ser prefixadas com : mas não é obrigatório.

Se você é novo no PDO, vale a pena ler a documentação . Há exemplos de código e tudo!