Pergunta

Eu estou dando uma olhada em como escapar adequadamente os dados que vem do mundo exterior antes que seja usado tanto para controle de aplicativos, armazenamento, lógica .. esse tipo de coisa.

Obviamente, com os magic quotes directiva em obsoleto em breve em php 5.3.0+, e removido em PHP6, isso se torna mais premente, para quem quer atualizar e entrar em novos recursos de linguagem, mantendo o código legado (don' t nós amamos isso ..).

No entanto, uma coisa que eu não tenha visto muita discussão sobre a teoria / melhores práticas com o que fazer depois de ter protegido seus dados - por exemplo, para armazenar com ou sem barras? Eu pessoalmente acho que manter os dados escaparam no DB é uma jogada ruim, mas quero ouvir a discussão e ler alguns estudos de caso de preferência ..

Alguns links do manual do PHP apenas para referência:

PHP Manual - mysql_real_escape_string

PHP Manual - htmlspecialchars

etc etc.

Todas as dicas?

Foi útil?

Solução

Dê uma olhada em declarações preparadas. Eu sei que no mysql isso funciona muito bem e é uma forma segura de obter dados em sua databse. Ele tem alguns benefícios de desempenho também.

http://dev.mysql.com/tech -Recursos / artigos / 4.1 / preparado-statements.html

Eu tenho mais alguns recursos se você estiver interessado.

Espero que isso é o que você está procurando, tc.

Editar:

Uma coisa que posso acrescentar é o uso de filtros em combinação com instruções preparadas. Por exemplo, para verificar se o valor é um picar você usar FILTER_SANITIZE_STRING, ou para o e-mail que você usa FILTER_SANITIZE_EMAIL.

Isso economiza uma certa quantidade de código e funciona muito bem. Você sempre pode verificar os dados usando seus próprios métodos mais tarde, mas há uma série de filtros que você pode usar.

Outras dicas

  • Use método correto de escapar de dados ao executar consultas: mysql_real_escape_string, consultas preparadas, etc ...

  • Armazenar dados em banco de dados inalterado

  • Uso método correcto de escapar dados na saída: htmlspecialchars, etc ..

Para o trabalho de banco de dados, verificação parametrizado consultas e declarações preparadas. DOP e mysqli são bons para isso.

htmlspecialchars é a ferramenta certa para exibir algum texto em html documentos.

E, como você mencionada PHP 5.3, você tem acesso aos funções de filtro que são um must-uso ao manusear os dados do usuário.

Para inserções de banco de dados a solução é usar ligam variáveis ??.

Em geral, a qualquer momento você se encontra escapar nada (argumento para um comando shell, peça comando db, html fornecido pelo usuário, etc.), isso indica que você não está usando a chamada de função direita (por exemplo, usando system quando você poderia usar uma forma multi-arg de exec), ou que a sua estrutura é deficiente. A abordagem padrão para trabalhar em uma estrutura deficiente é para melhorá-lo para que você possa voltar a não pensar sobre citando.

Pensando em níveis de escapar e níveis de escape pode ser divertido, mas se você realmente gosta que vá jogar com Tcl no seu tempo livre. Para o trabalho real, você não deveria estar pensando citando a menos que você está projetando uma biblioteca para que outras pessoas usem, caso em que você deve citar corretamente e deixar seus usuários a evitar pensar sobre citando. (E você deve documentar com muito cuidado exatamente que tipo de citar que fazer e não fazer)

É simples. TODOS os dados de entrada deve ser percorreu mysql_real_escape_string () antes de inseri-lo no banco de dados. Se você sabe que algo precisa ser um inteiro, por exemplo, configurá-lo para um número inteiro antes de inseri-lo, etc. Recordar que este é apenas para injecção de parada SQL. XSS e validação de dados são diferentes.

Se você quer algo para ser um e-mail, você obviamente precisa validar que, antes de inseri-lo no banco de dados.

htmlentities () dados sanitizes, o que significa que Modificar os dados. Eu acho que você deve sempre armazenar dados brutos no banco de dados e quando você pegar esses dados, escolha como você deseja higienizar-lo em seguida.

Eu gosto de usar a seguinte função como um "wrapper" para o mysql_real_escape_string () função .

function someFunction( $value )
{
    if ( is_int( $value ) || is_float( $value ) ) {
        return $value;
    }
    return "'" . mysql_real_escape_string( (string) $value ) . "'";
}

Se o valor é um flutuador ou um número inteiro, então não existe qualquer ponto no funcionamento mysql_escape_string () . A razão que eu converter o valor para a cadeia antes de passá-la para mysql_real_escape_string () , é porque às vezes o valor pode não ser uma string.

Um exemplo do valor não ser uma string:

http:? //Localhost/test.php Olá [] = test

Dentro test.php, você corre mysql_real_escape_string () em $ _GET [ 'Olá'] esperando Olá para ser uma string. Bem, desde que a pessoa definir o valor para uma matriz, ele vai realmente causar um aviso desde Olá não é uma string.

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