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 / 5553
Accepted
jason_ruz
jason_ruz
Asked: 2011-09-09 18:44:57 +0800 CST2011-09-09 18:44:57 +0800 CST 2011-09-09 18:44:57 +0800 CST

Colocar aspas simples em torno de constantes numéricas realmente protege contra injeção de SQL no MySQL?

  • 772

O manual parece sugerir que usar aspas em torno de números é suficiente para proteger da injeção de SQL.

De acordo com a seção 5.3.1. Diretrizes Gerais de Segurança do Manual de Referência do MySQL 5.1 :

Se um aplicativo gera uma consulta, como SELECT * FROM table WHERE ID=234quando um usuário insere o valor 234, o usuário pode inserir o valor 234 OR 1=1para fazer com que o aplicativo gere a consulta SELECT * FROM table WHERE ID=234 OR 1=1. Como resultado, o servidor recupera todas as linhas da tabela. Isso expõe cada linha e causa carga excessiva do servidor. A maneira mais simples de se proteger desse tipo de ataque é usar aspas simples em volta das constantes numéricas: SELECT * FROM table WHERE ID='234'. Se o usuário inserir informações extras, tudo se tornará parte da string. Em um contexto numérico, o MySQL converte automaticamente essa string em um número e retira dela quaisquer caracteres não numéricos à direita.

Isso significa que o usuário está protegido se inserir o valor 234' OR 1=1 #? (ou seja, para gerar a consulta SELECT * FROM table WHERE ID='234' OR 1=1 #')

mysql sql-injection
  • 4 4 respostas
  • 7662 Views

4 respostas

  • Voted
  1. Best Answer
    Noah Yetter
    2011-09-09T20:37:03+08:002011-09-09T20:37:03+08:00

    Resposta curta, não. O truque das citações é facilmente derrotado incluindo sua própria citação de fechamento e, em seguida, um símbolo de comentário para eliminar a citação concatenada final, exatamente como no seu exemplo.

    Para se proteger da injeção de SQL, você deve usar variáveis ​​de ligação . Alterar seu exemplo para SELECT * FROM table WHERE ID = :Xe vincular a entrada do usuário a X resolve o problema instantânea e completamente. É impossível enfatizar demais a importância dessa prática!

    • 15
  2. gbn
    2011-09-09T20:56:28+08:002011-09-09T20:56:28+08:00

    O usuário só precisa entrar 234' OR 1=1 --(com o espaço à direita) para quebrar isso.

    • 3
  3. StanleyJohns
    2011-09-10T06:30:59+08:002011-09-10T06:30:59+08:00

    O trecho fornecido acima não impedirá injeções de SQL. Mesmo com aspas simples, a entrada pode ser modificada para manipular as aspas. Com aspas a consulta será:

    SELECT * FROM tabela WHERE ID='234', onde a entrada é234

    Agora considere a entrada injetada: 234'; select * from passwords;select * from table where id='234. Isso criará um bloco de consulta de:

    SELECT * FROM tabela WHERE ID='234'; selecione * das senhas;selecione * da tabela onde id='234'

    Dependendo da linguagem de front-end usada, no meu caso PHP, existem funções incorporadas como mysql_real_escape_stringessa que podem ser usadas para reduzir as injeções de SQL. O único comentário que posso dizer sobre a documentação (além do humorístico de @mrdenny) é que sem as aspas, há mais injeção possível.

    • 2
  4. stamparm
    2011-09-10T06:22:33+08:002011-09-10T06:22:33+08:00

    Geralmente, não é uma "diretriz" tão ruim se você estiver usando algum tipo de magic_quotesmecanismo (que pode ser contornado apenas se você estiver usando GBK / Big5um ou conjuntos de caracteres familiares no DBMS de back-end). Ele deve filtrar/pré-formatar adequadamente todas as ocorrências de caracteres 'que podem inserir facilmente a injeção SQL nessa instrução (por exemplo, com carga útil que você declarou 234' OR 1=1 #).

    Mas, para estar 100% seguro, você definitivamente deve usar APENAS instruções SQL "parametrizadas"!

    • 1

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

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

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

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

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

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 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
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +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