• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

ruitalia

Segurança em AJAX

8 mensagens neste tópico

Olá pessoal,

Estou com uma dúvida que me intriga há já alguns meses. Depois de várias pesquisas na net, resolvi pedir os vossos comentários.

Utilizo a tecnologia AJAX para abrir ficheiros em php (ex: httpRequest.open("GET", 'ajax.php?a=comentarios', true)), através de um script rudimentar que fui construindo à medida que fui aprendendo a utilizar este método.

Utilizo-o para abrir e actualizar determinados elementos da página web, sem actualizar o restante conteúdo. Mas, o facto é que me deparei que consigo abrir o ficheiro através da sua localização (ex: "ajax.php?a=comentarios").

Acho que isto é uma afronta à segurança do site, uma vez que é possível que alguém consiga abrir numa página inteira aquilo que eu desejaria que fosse aberto apenas num determinado elemento da página.

Alguma sugestão para evitar esta vulnerabilidade?

Obrigado :D

Existe alguma forma de proteger estes ficheiros e permitir que só através de ajax podermos acedê-los?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, podes fazer uma verificação simples que é o ver se o ficheiro esta a ser aberto directamente, ou se vêm de alguma outra página.

por exemplo com o

$_SERVER["HTTP_REFERER"];

eu nos ficheiros que são chamados via ajax, tenho-os sempre dividos em funções, e faço no inicio tambem uma verificação de que se a função/tarefa que esta a ser pedida existe no ficheiro e é uma função criada por mim.

exemplo:

<?
if (isset ( $_GET ['tarefa'] )) {
$tarefa = $_GET ['tarefa'];
/* verifica se a função existe*/
if (function_exists ( $tarefa )) {
                        /* verifica se a função existente é uma função criada pelo programador*/
	$arr = get_defined_functions ();
	$user_f = array_search ( $tarefa, $arr ["user"] );
	if ($user_f >= 0) {
		/* chama a função relativa a esta função*/
		$tarefa ();
	} 
} 
} 
exit ();

function xpto () {
....
}
function xpto1 () {
....
}
?>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

hbarquero, não é preciso tanto.

http://snipplr.com/view/1060/check-for-ajax-request/

Nota : isto pode não funcionar com scripts normais, é melhor testar primeiro. Pelo menos em praticamente todas as bibliotecas javascript (jQuery, moontools, prototype, etc) funciona perfeitamente, e impede que essas páginas sejam acedidas sem ser por ajax.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado aos dois pelas dicas. Afinal é mais simples do que eu pensava...

Acabei por resolver executando o script apenas se a variável $_SERVER["HTTP_REFERER"]; estiver preenchida, e funciona.

Em relação às funções do hbarquero, não percebi, pois, se estiverem no script a executar, são executadas quer se chamar a partir de ajax quer se chamar por carregamento do script directamento no browser, acabando por não ser restrição nenhuma... acho eu.

Em relação à dica do yoda.pt, não consegui utilizar porque a variavel $_SERVER['HTTP_X_REQUESTED_WITH'] vem sempre vazia.

De qualquer forma, ambos se referiam à utilização da variável $_SERVER['HTTP_REFERER'], que está a funcionar.

Obrigadão

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em relação à dica do yoda.pt, não consegui utilizar porque a variavel $_SERVER['HTTP_X_REQUESTED_WITH'] vem sempre vazia.

Nesse caso deve ser só aplicada nas bibliotecas javascript.

Mas uma coisa: Não é questão de vir vazia, é de existir, ou seja, verificar se existe usando a função isset()

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, mas no exemplo que deste é em php...

É testado se a variável $_SERVER['HTTP_X_REQUESTED_WITH'] está criada e se tem o valor de "XMLHttpRequest":

      function isAjax() {

      return (isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&

      ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'));

      }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, tens razão, esqueci-me dessa parte. Só deve funcionar com bibliotecas então :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

hbarquero, não é preciso tanto.

http://snipplr.com/view/1060/check-for-ajax-request/

Nota : isto pode não funcionar com scripts normais, é melhor testar primeiro. Pelo menos em praticamente todas as bibliotecas javascript (jQuery, moontools, prototype, etc) funciona perfeitamente, e impede que essas páginas sejam acedidas sem ser por ajax.

Apenas uma questão, se a ligação for de uma pagina diferente mesmo que em ajax ele aceita?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora