Ouvi dizer que "todos" estão usando consultas SQL parametrizadas para se proteger contra ataques de injeção de SQL, sem ter que validar cada entrada do usuário.
Como você faz isso? Você obtém isso automaticamente ao usar procedimentos armazenados?
Então, meu entendimento é não parametrizado:
cmdText = String.Format("SELECT foo FROM bar WHERE baz = '{0}'", fuz)
Isso seria parametrizado?
cmdText = String.Format("EXEC foo_from_baz '{0}'", fuz)
Ou preciso fazer algo mais extenso como esse para me proteger da injeção de SQL?
With command
.Parameters.Count = 1
.Parameters.Item(0).ParameterName = "@baz"
.Parameters.Item(0).Value = fuz
End With
Existem outras vantagens em usar consultas parametrizadas além das considerações de segurança?
Atualização: Este ótimo artigo foi linkado em uma das referências de questões por Grotok. http://www.sommarskog.se/dynamic_sql.html
sql
vb.net
sql-parametrized-query
Jim Counts
fonte
fonte
Respostas:
Seu exemplo EXEC NÃO seria parametrizado. Você precisa de consultas parametrizadas (declarações preparadas em alguns círculos) para evitar que uma entrada como esta cause danos:
Tente colocar isso em sua variável fuz (ou não, se você valoriza sua mesa de bar). Perguntas mais sutis e prejudiciais também são possíveis.
Aqui está um exemplo de como você faz parâmetros com o Sql Server:
Os procedimentos armazenados às vezes são creditados com a prevenção da injeção de SQL. No entanto, na maioria das vezes, você ainda precisa chamá-los usando parâmetros de consulta ou eles não ajudam. Se você usa procedimentos armazenados exclusivamente , pode desativar as permissões para SELECT, UPDATE, ALTER, CREATE, DELETE, etc (quase tudo, exceto EXEC) para a conta de usuário do aplicativo e obter alguma proteção dessa forma.
fonte
cmd.Parameters.Add("@Baz", SqlDbType.VarChar, 50).Value = Baz
por favor?@Baz
que é do tipovarchar(50)
que é atribuído ao valor daBaz
string.AddWithValue("@Baz", Baz)
, você poderia fazer isso, mas não deveria , especialmente porque converter valores de string que mapeiam por padrãonvarchar
para ovarchar
tipo real é um dos lugares mais comuns que podem desencadear os efeitos mencionados naquele link.Definitivamente o último, ou seja
As consultas parametrizadas têm duas vantagens principais:
fonte
Você quer seguir com seu último exemplo, pois este é o único que está verdadeiramente parametrizado. Além das questões de segurança (que são muito mais prevalentes do que você imagina), é melhor deixar o ADO.NET lidar com a parametrização, pois você não pode ter certeza se o valor que está passando requer aspas simples ou não sem inspecionar o
Type
de cada parâmetro .[Editar] Aqui está um exemplo:
fonte
A maioria das pessoas faria isso por meio de uma biblioteca de linguagem de programação do lado do servidor, como PDO de PHP ou Perl DBI.
Por exemplo, no PDO:
Isso evita o escape de seus dados para inserção no banco de dados.
Uma vantagem é que você pode repetir uma inserção muitas vezes com uma instrução preparada, obtendo uma vantagem de velocidade.
Por exemplo, na consulta acima, eu poderia preparar a instrução uma vez e, em seguida, fazer um loop na criação do array de dados a partir de um monte de dados e repetir o -> execute quantas vezes forem necessárias.
fonte
Seu texto de comando deve ser como:
Em seguida, adicione valores de parâmetro. Desta forma, garante que o valor con acabe sendo usado apenas como um valor, enquanto com o outro método se a variável fuz for definida como
você pode ver o que pode acontecer?
fonte
Aqui está uma curta aula para começar com SQL e você pode construir a partir daí e adicionar à classe.
MySQL
MS SQL / Express
fonte