Pergunta

Eu tenho uma aplicação que toma decisões com base em parte da URL:

    if ( isset($this->params['url']['url']) ) {
    $url = $this->params['url']['url'];
    $url = explode('/',$url);
    $id = $this->Provider->getProviderID($url[0]);

    $this->providerName = $url[0]; //set the provider name

    return $id;

    }

Isto acontece por ser em um aplicativo de bolo assim $ this-> params [ 'url'] contém um elemento de URL. Eu, então, usar o elemento da URL para decidir quais dados para usar no resto do meu aplicativo. A minha pergunta é ...

o que é a melhor maneira de garantir essa entrada para que as pessoas não podem passar em qualquer coisa desagradável?

graças,

Foi útil?

Solução

Outros comentários aqui são corretas, em beforeFilter do AppController validar o provedor contra os provedores em sua db.

No entanto, se todos os URLs devem ser prefixados com uma seqüência do provedor, você está indo sobre extraindo-o do URL da maneira errada, olhando em $ this-> params [ 'url'].

Este tipo de problema é exatamente o que a classe router, e sua capacidade de passar parâmetros para uma ação é para. Confira a página de manual no livro de receitas http://book.cakephp.org/view/ 46 / Rotas configuração . Você pode tentar algo como:

Router::connect('/:provider/:controller/:action');

Você também vai ver no manual a capacidade de validar o param provedor na própria rota por um regex - se você tem uma pequena lista definitiva dos provedores conhecidos, você pode codificar estes no regex rota

Através da criação de uma rota que captura essa parte do URL torna-se instantaneamente disponível em $ this-> params [ 'provedor'], mas ainda melhor do que isso é o fato de que o link html helper () método cria automaticamente corretamente URLs formatados, por exemplo,

$html->link('label', array(
  'controller' => 'xxx',
  'action' => 'yyy',
  'provider' => 'zzz'
));

Isso retorna um link como / zzz / xxx / yyy

Outras dicas

O que são nomes de provedores válidos? Teste se o parâmetro de URL é um, caso contrário, rejeitá-la.

Esperamos que você está ciente de que não há absolutamente nenhuma maneira de impedir que o usuário enviar absolutamente qualquer coisa, inclusive nomes de provedores que não é suposto uso.

Eu reiterar o comentário de Karsten: definir "qualquer coisa desagradável"

O que você está esperando o parâmetro a ser? Se você está esperando que seja uma URL, use um regex para URLs em Validar. Se você está esperando um inteiro, lançá-lo para um número inteiro. O mesmo vale para um flutuador, boolean, etc.

Estas funções PHP pode ser útil no entanto: www.php.net/strip_tags www.php.net/ctype_alpha

o parâmetro será um providername - seqüência alfanumérica. Acho que a resposta é, basicamente, para a utilização ctype_alpha () em combinação com um cheque que o ProviderName é válida, com base em outra lógica da aplicação.

Obrigado pelas respostas

Além disso, se você tem um conjunto conhecido de URLs permitidas, uma boa ideia é whitelist essas URLs permitidos. Você pode até mesmo fazer isso de forma dinâmica por ter uma tabela de banco de dados que contém as URLs permitidos - tração que a partir do banco de dados, fazer uma comparação com o parâmetro URL passado. Alternativamente, você poderia whitelist padrões (dizem que você tem permitido domínios que podem ser passados, mas o resto das mudanças url ... Você pode whitelist os regexps de domínio e / ou de uso para determinar a validade).

No mínimo, certifique-se de usar strip_tags, ou o built-in seqüências mysql de escape (se estiver usando PHP5, parametrizar as consultas SQL resolve esses problemas).

Seria mais bolo-como usar o href="http://api.cakephp.org/class/sanitize" rel="nofollow noreferrer"> Sanitize classe . Neste caso Sanitize :: escape () ou Sanitize :: paranóico () parece adequado

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