Pergunta

Eles são menos vulneráveis ??a injeção de SQL do que fazendo coisas como mysql_query("SELECT important_data FROM users WHERE password = $password")?

Foi útil?

Solução

Eles são mais seguros do que o que você está fazendo. Sua consulta é postar SQL cru para o db o que significa que os parâmetros não são tratados como parâmetros SQL, mas como simples sql idade.

Aqui está o que quero dizer.

Com um prococedure armazenada a variável de senha não pode ser sql, ele tem que ser um pedaço de informação do sistema está procurando. No seu exemplo que está realmente enviados para o DB é

SELECT * FROM usuário onde password = ( 'a sua senha aqui' - $ senha variável) ..... assim que alguém pode fazer algo como

SELECT * FROM user onde password = ( 'a sua senha aqui'; * SELECT FROM usuário - variável de senha $).

ou pior ainda:

SELECT * FROM user onde password = ( 'a sua senha aqui'; DROP DATABASE Database_Name - variável $ password).

Um procedimento SQL não dinâmica armazenado não vai permitir isso, porque o parâmetro de entrada não será executado como sql extra.

parametrizada SQL faz cuidar disso, mas procedimentos tecnicamente armazenados são ainda um pouco mais seguro, porque o acesso à informação do usuário na tabela não precisa de acesso de leitura. Ele só precisa ser capaz de executar o procedimento armazenado. Dependendo de sua necessidade pode ou não pode entrar em jogo.

Outras dicas

Não necessariamente, você poderia estar fazendo dentro de concatenação do mesmo e a exposição seria a mesma. Se você usar o SQL dinâmica com variáveis ??de parâmetro (nenhuma seqüência de concatenação de produtos SQL) você estaria muito bem protegido.

Enquanto você usa parâmetros e não use concatenação de valores introduzidos pelo utilizador, não haverá risco de injeção de SQL. Os procedimentos armazenados são um pouco "mais seguro" neste aspecto, porque eles incentivá-lo a usar parâmetros. Mas se no procedimento que você faz algo como

EXECUTE 'SELECT important_data FROM users WHERE password = ' + @password

Em seguida, você estará de volta à estaca 1 e muito vulnerável a injeções SQL.

Além disso, não existe tal coisa como "declarações preparadas" que não são armazenados procedimentos, mas também pode usar parâmetros. Eles podem, portanto, ser usado para injeção de evitar SQL também.

Não existem tecnologias seguras. Tecnologias só podem ser usados ??de maneiras seguras ou inseguras.

Dito isto, procedimentos armazenados requerem um pouco mais criativo de codificação para permitir SQL injeção - que, no entanto, acontece. Nada impede que você concatenar cadeias neles, em qualquer motor de banco de dados SQL da qual eu estou ciente.

Se eles estão parametrizados corretamente e você não está fazendo sql dinâmico, então eles são mais seguros e você também vai beneficiar de reutilização plano de execução

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top