PHP - parâmetros de fixação passado na URL
-
05-07-2019 - |
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,
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 ??p. >
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