Pergunta

Eu gostaria de ter uma função se comportando como mysql_real_escape_string sem me conectar ao banco de dados, pois às vezes eu preciso fazer testes a seco sem conexão com db. mysql_escape_string está preguiçoso e, portanto, é indesejável. Algumas das minhas descobertas:

http://www.gamedev.net/community/forums/topic.asp?topic_id=448909

http://w3schools.invisionzone.com/index.php?showtopic=20064

Foi útil?

Solução

É impossível escapar com segurança de uma corda sem uma conexão de banco de dados. mysql_real_escape_string() e declaraçõ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 de vários bytes.

Se você for apenas teste, 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.

Outras dicas

Bem, de acordo com o mysql_real_escape_string Página de referência da função: "mysql_real_escape_string () chama a função da biblioteca do MySQL mysql_real_escape_string, que escapa dos seguintes caracteres: x00, n, r, , '," e x1a ".

Com isso em mente, a função dada no segundo link que você postou deve fazer exatamente o que você precisa:

function mres($value)
{
    $search = array("\\",  "\x00", "\n",  "\r",  "'",  '"', "\x1a");
    $replace = array("\\\\","\\0","\\n", "\\r", "\'", '\"', "\\Z");

    return str_replace($search, $replace, $value);
}

Em oposição direta à minha outra resposta, esta função seguinte é provavelmente segura, mesmo com caracteres multi-bytes.

// replace any non-ascii character with its hex code.
function escape($value) {
    $return = '';
    for($i = 0; $i < strlen($value); ++$i) {
        $char = $value[$i];
        $ord = ord($char);
        if($char !== "'" && $char !== "\"" && $char !== '\\' && $ord >= 32 && $ord <= 126)
            $return .= $char;
        else
            $return .= '\\x' . dechex($ord);
    }
    return $return;
}

Espero que alguém mais conhecedor do que eu possa me dizer por que o código acima não funcionará ...

De outras pesquisas, eu encontrei:

http://dev.mysql.com/doc/refman/5.1/en/news-5-1-11.html

Correção de segurança:

Um orifício de segurança de injeção de SQL foi encontrado no processamento de codificação de vários bytes. O bug estava no servidor, analisando incorretamente a sequência escapada com a função API mysql_real_escape_string () c.

Essa 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 a injeção de SQL, consulte o texto a seguir.

Discussão. Um orifício de segurança de injeção SQL foi encontrado no processamento de codificação de vários bytes. Um orifício de segurança de injeção do SQL pode incluir uma situação em que, quando um usuário forneceu dados para serem inseridos em um banco de dados, o usuário pode injetar instruções SQL nos dados que o servidor será executado. No que diz respeito a essa vulnerabilidade, quando a fuga de conjunto de personagens é usada (por exemplo, addSlashes () no PHP), é possível ignorar a fuga em alguns conjuntos de caracteres de vários bytes (por exemplo, SJIS, BIG5 e GBK). Como resultado, uma função como addSlashes () não é capaz de impedir ataques de injeção de SQL. É impossível corrigir isso no lado do servidor. A melhor solução é que os aplicativos usem a fuga consciente do 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 de consciência 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 puder 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 NO_BACKSHLASH_ESCAPES SQL como uma pasta de trabalho. (Este modo foi introduzido no MySQL 5.0.1.) No_backshlash_escapes permite um modo de compatibilidade padrão SQL, onde a barragem não é considerada um caractere especial. O resultado será que as consultas falharão.

Para definir este modo para a conexão atual, digite a seguinte instrução SQL:

SET sql_mode='NO_BACKSLASH_ESCAPES';

Você também pode definir o modo globalmente para todos os clientes:

SET GLOBAL sql_mode='NO_BACKSLASH_ESCAPES';

Este modo SQL também pode ser ativado automaticamente quando o servidor é iniciado usando a opção de linha de comando--sql-mode = no_backshsh_escapes ou definindo SQL-Mode = no_backshsh_escapes no arquivo de opção do servidor (por exemplo, my.cnf ou my.ini , dependendo do seu sistema). (Bug#8378, CVE-2006-2753)

Veja também Bug#8303.

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