Jump to content

Segurança em AJAX


ruitalia
 Share

Recommended Posts

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 😄

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

Azores

Link to comment
Share on other 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 () {
....
}
?>

Tudo o que não provoca a minha morte, torna-me mais forte.http://formacao-cursos.com

Link to comment
Share on other 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.

Link to comment
Share on other 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

Azores

Link to comment
Share on other 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()

Link to comment
Share on other 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'));

      }

Azores

Link to comment
Share on other 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?

dreams.each do |dream|

   dream.make_it_happen

end

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.