AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 115073
Accepted
J Hays
J Hays
Asked: 2015-09-16 05:06:45 +0800 CST2015-09-16 05:06:45 +0800 CST 2015-09-16 05:06:45 +0800 CST

Prática recomendada para passar e trabalhar com parâmetros de segurança/desempenho

  • 772

Nosso programador sênior me pediu para escrever procedimentos armazenados no seguinte formato para proteção contra ataques de injeção. Ele diz que a melhor prática é pegar o parâmetro, então declarar uma nova variável no corpo e atribuir essa variável ao parâmetro, que esta etapa é uma proteção extra contra ataques de injeção, pois força qualquer tentativa de injeção a ser considerada como dados e não tomada literalmente. Isso é verdade? Eu pensaria que isso retardaria a consulta e usaria memória extra e não adicionaria nenhuma proteção extra, mas posso estar errado. Exemplo abaixo.

    CREATE PROCEDURE [dbo].[sp_foo_GET] 
        @parAcct            NVARCHAR(20)
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE 
        @varAcct            NVARCHAR(20) = @parAcct;

    SELECT [userid] 
    FROM [tblAccounts] 
    WHERE [accountID] = @varAcct;   
END

EDIT Depois de conversar com o programador, ele parece pensar que passar parâmetros para uma variável e atribuí-los a uma variável declarada ajuda na segurança E fará com que as consultas sejam executadas mais rapidamente.

best-practices parameter
  • 1 1 respostas
  • 736 Views

1 respostas

  • Voted
  1. Best Answer
    David Spillett
    2015-09-16T06:06:36+08:002015-09-16T06:06:36+08:00

    Ele parece confuso. Usar o mesmo valor de uma variável local não deve ser diferente de usá-lo de um parâmetro de entrada. Seu colega está entendendo errado no que diz respeito ao uso de consultas parametrizadas (às vezes chamadas de instruções preparadas) em vez de SQL ad-hoc completo?

    Por exemplo:

    resultSet = dbconnector.getRS('EXEC sp_foo_GET \''+inputVariable+'\');
    

    pode ser uma rota de injeção e mover o valor entre as variáveis ​​dentro do procedimento não o afetará em nada, pois o código injetado não será visto pelo procedimento. Se inputVariablefosse para ter o valor xxx'; WAITFOR DELAY '00:10:00'--o SQL enviado para o servidor seria

    EXEC sp_foo_GET 'xxx'; WAITFOR DELAY '00:10:00'--'
    

    Seu procedimento seria executado com o parâmetro de entrada definido como xxxe não conheceria o código extra, ele será executado após a conclusão da chamada do procedimento.

    Com uma instrução preparada, supondo que sua biblioteca de acesso ao banco de dados os suporte adequadamente e não esteja fazendo bobagens ad hoc sob o capô, isso não aconteceria:

    resultSet = dbconnector.getRSWithParams('EXEC sp_foo_GET ?', [inputVariable]);
    

    Seu procedimento seria chamado com o valor, xxx'; WAITFOR DELAY '00:10:00'--em vez de esse código extra ser visto como algo a ser executado.

    É claro que a técnica pode ser parte de um padrão maior que ele deseja que você siga, cujo objetivo ficará claro à medida que você fizer coisas mais avançadas, mas que na verdade não faz nada de útil (além de criar o hábito de seguir o padrão) neste momento estágio, mas suspeito que ele está simplesmente entendendo mal e, portanto, adicionando trabalho desnecessário. Você poderia pedir a ele para explicar com mais detalhes? Talvez ele possa fornecer a você uma chamada de exemplo contra a qual ele acha que o padrão protegerá?

    Depois do comentário Ref. atuação

    De acordo com seu comentário, embora eu duvide que haja algum motivo de segurança para esse padrão, a nova explicação de que isso pode fazer uma diferença de desempenho é mais válida, embora você possa achar que na maioria dos casos não faz diferença e, em alguns, reduz em vez de aumentar o desempenho. benchmarking em vez de usar cegamente o padrão é recomendado.

    O problema vem do cache do plano de consulta e de como os parâmetros de entrada e os literais são tratados de maneira diferente das variáveis ​​locais. Não entrarei em muitos detalhes aqui, pois estamos nos afastando da pergunta original (pesquise na documentação do MS e na Web geralmente em torno das frases "sniffing de parâmetro", "cache do plano de consulta" e " OPTIMIZE FOR, em seguida, pergunte a um nova pergunta se você precisar de mais clareza depois de ler algumas coisas), mas como um iniciante para dez: no exemplo que você deu acima, o que você está fazendo com a variável local é efetivamente o mesmo que declarar o procedimento com OPTION (OPTIMIZE FOR (@parAcct UNKNOWN)). , como acontece com qualquer dica de otimização, pode variar muito dependendo das consultas executadas no procedimento e do equilíbrio dos dados tocados por elas.

    A diferença entre o uso de parâmetros de entrada, literais e variáveis ​​locais em relação aos planos em cache pode ser significativa ao depurar problemas de desempenho (pode significar que o perfil de desempenho que você vê ao depurar/testar é bem diferente daquele visto na produção, se você não estiver ciente disso o problema). http://www.brentozar.com/archive/2014/06/tuning-stored-procedures-local-variables-problems/ cobre a questão deste contexto particular.

    • 4

relate perguntas

  • Modelo de banco de dados com usuários, funções e direitos

  • Melhor maneira de identificar dados órfãos?

  • Como gerenciar meus próprios scripts

  • Qual é a configuração RAID recomendada para um banco de dados Oracle?

  • Melhores práticas para conectar bancos de dados que estão em diferentes regiões geográficas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve