Pergunta

Eu estou escrevendo uma consulta seleção em um método C # que permite que o código do cliente fornecer um ID de linha e voltar um objeto construído a partir de dados da linha. Se o ID da linha é um inteiro e eu confirmaram que de positivo, há nenhum mal em apenas passá-lo através da utilização string.Format? Eu não vejo como qualquer dano poderia ser feito se eles só foram autorizados a passar em um int e não uma string.

Foi útil?

Solução

Você tem razão, seria seguro passar um inteiro dessa maneira. No entanto, há também um outro lado da história.

Embora possa ser considerado seguro para apenas formatar um int um criar a expressão SQL, há também uma consideração de desempenho. Quando o servidor SQL vê uma consulta pela primeira vez, ele irá criar e armazenar em cache o plano de execução para essa consulta. A próxima vez que a mesma consulta é emitida, o plano de execução será reutilizado.

Se você passar em diferentes cordas, ele será visto como consultas separadas, exigindo planos de execução separados. Se você passar na mesma consulta com parâmetros de cada vez (com parâmetros diferentes), o primeiro plano de execução será por SQL Server reutilizado.

Mesmo se você não se preocupam com o benefício de desempenho, eu ainda usar uma consulta parametrizada para todas as consultas no banco de dados, mesmo para aqueles que podem ser considerados "seguros", como você apontar - simplesmente para ser consistente na forma como o aplicativo acessa os dados. Se você sempre usar a consulta parametrizada, ele também poupa o trabalho de determinar se a consulta é seguro de cada vez, a fim de decidir de que forma para consultar o banco de dados.

Outras dicas

Você está respondendo à sua própria pergunta aqui. System.Int32 não pode conter

';DROP DATABASE xxx;--

Se é isso que você está preocupado. Mesmo passando um inteiro negativo não iria impactar negativamente o seu banco de dados!

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