Gostaria de ter uma função comportando-se como mysql_real_escape_string sem conectar ao banco de dados, pois às vezes preciso fazer um teste seco sem conexão de banco de dados. mysql_escape_string está obsoleto e, portanto, não é desejável. Algumas das minhas descobertas:
http://www.gamedev.net/community/forums/topic.asp?topic_id=448909
Respostas:
É impossível escapar com segurança de uma string sem uma conexão DB.
mysql_real_escape_string()
e as instruções preparadas precisam de uma conexão com o banco de dados para que possam escapar da string usando o conjunto de caracteres apropriado - caso contrário, os ataques de injeção SQL ainda são possíveis usando caracteres multibyte.Se você está apenas testando , então você também pode usar
mysql_escape_string()
, não é 100% garantido contra ataques de injeção de SQL, mas é impossível construir algo mais seguro sem uma conexão de banco de dados.fonte
mysql_escape_string
sem uma conexão (ainda tentando descobrir o porquê). Como essa função está obsoleta, estou pensando em como posso substituí-la. Certamente parece razoável que se possa especificar o "conjunto de caracteres apropriado" em qualquer função que o substitua sem abrir uma conexão.Bem, de acordo com a página de referência da função mysql_real_escape_string : "mysql_real_escape_string () chama a função de biblioteca do MySQL mysql_real_escape_string, que escapa dos seguintes caracteres: \ x00, \ n, \ r, \, '," e \ x1a. "
Com isso em mente, a função fornecida no segundo link que você postou deve fazer exatamente o que você precisa:
fonte
mb_strpos()
(emb_substr()
criar um comportamento semelhante asubstr_replace()
) para fazer isso?Em oposição direta à minha outra resposta, esta função a seguir é provavelmente segura, mesmo com caracteres multibyte.
Espero que alguém com mais conhecimento do que eu possa me dizer por que o código acima não funciona ...
fonte
De pesquisas adicionais, descobri:
http://dev.mysql.com/doc/refman/5.1/en/news-5-1-11.html
Correção de segurança:
Uma brecha de segurança de injeção de SQL foi encontrada no processamento de codificação multibyte. O bug estava no servidor, interpretando incorretamente a string de escape com a função da API C mysql_real_escape_string ().
Esta vulnerabilidade foi descoberta e relatada por Josh Berkus e Tom Lane como parte da colaboração de segurança entre projetos do consórcio OSDB. Para obter mais informações sobre injeção de SQL, consulte o texto a seguir.
Discussão. Uma falha de segurança de injeção SQL foi encontrada no processamento de codificação multibyte. Uma brecha de segurança de injeção de SQL pode incluir uma situação em que, quando um usuário forneceu dados a serem inseridos em um banco de dados, o usuário pode injetar instruções SQL nos dados que o servidor executará. Com relação a esta vulnerabilidade, quando o escape sem conhecimento do conjunto de caracteres é usado (por exemplo, addslashes () em PHP), é possível contornar o escape em alguns conjuntos de caracteres multibyte (por exemplo, SJIS, BIG5 e GBK). Como resultado, uma função como addslashes () não é capaz de prevenir ataques de injeção de SQL. É impossível consertar isso no lado do servidor. A melhor solução é para os aplicativos usarem o escape ciente de conjunto de caracteres oferecido por uma função como mysql_real_escape_string ().
No entanto, um bug foi detectado em como o servidor MySQL analisa a saída de mysql_real_escape_string (). Como resultado, mesmo quando a função com reconhecimento de conjunto de caracteres mysql_real_escape_string () foi usada, a injeção de SQL foi possível. Este bug foi corrigido.
Soluções alternativas. Se você não conseguir atualizar o MySQL para uma versão que inclua a correção do bug na análise mysql_real_escape_string (), mas execute o MySQL 5.0.1 ou superior, você pode usar o modo SQL NO_BACKSLASH_ESCAPES como uma solução alternativa. (Este modo foi introduzido no MySQL 5.0.1.) NO_BACKSLASH_ESCAPES habilita um modo de compatibilidade padrão SQL, onde a barra invertida não é considerada um caractere especial. O resultado será que as consultas falharão.
Para definir este modo para a conexão atual, insira a seguinte instrução SQL:
Você também pode definir o modo globalmente para todos os clientes:
Este modo SQL também pode ser ativado automaticamente quando o servidor é iniciado usando a opção de linha de comando --sql-mode = NO_BACKSLASH_ESCAPES ou definindo sql-mode = NO_BACKSLASH_ESCAPES no arquivo de opções do servidor (por exemplo, my.cnf ou my.ini , dependendo do seu sistema). (Bug # 8378, CVE-2006-2753)
Veja também Bug # 8303.
fonte
NO_BACKSLASH_ESCAPES
introduz outras vulnerabilidades .