Desenvolvimento - HTMLFeed de artigos deste autor

Desmistificando alguns mistérios do Ajax
por Gregory Monteiro



SEGURANÇA CONTRA HACKER NO AJAX

De que se trata o artigo:

O artigo fala como criar uma URL para exibir um conteúdo pelo Ajax e como executar scripts dessa página exibida

Para que serve:

Deixar o conteúdo do seu site acessível de forma mais rápida

Em que situação o tema é útil:

Tornar a vida do usuário mais fácil ao acessar um conteúdo específico do seu site

Nesse artigo irei abordar como criar URLs únicas e como retornar dados por JavaScript através de páginas que são chamadas pelo Ajax.

Alguns recursos usados nesse aqui foram descritos no artigo Segurança contra hacker no Ajax, então para melhor entendimento seria ideal lê-lo.

O conceito de URLs únicas são nomes fictícios criados dentro da mesma página para mostrar conteúdos diferentes.

Para fazer isso não existe maneira melhor do que criar um evento, através do JavaScript, que “leia” a URL e a interprete de acordo com a sua necessidade para exibição do conteúdo, que será visto mais a frente na listagem 3.

Nota: para criar URLs únicas os programadores usam de um artifício que o browser oferece escrever no final da URL um caractere “#” e após o identificador para o conteúdo que deverá ser exibido. Isso é feito porque o browser não interpreta mudanças feitas após esse caractere e por isso não acontece o refresh na página tornando o conteúdo estático.

Iniciando o exemplo

O exemplo que vamos criar é composto de quatro páginas sendo elas “index.html” (que fica na raiz do site) e as seguintes ficam dentro de uma pasta que denominei “include”. As páginas são “default.asp”, “ajax.asp” e “get.asp”.

/index.html

/include/default.asp

/include/ajax.asp

/include/get.asp

No código da listagem 1 criei na linha 7 uma variável chamada “urlteste” que tem como valor inicial tudo que aparece escrito na URL da página após o caractere “#”.

Na linha 8 eu converti todo o conteúdo da variável criada para letras minúsculas.

Nas linhas 10 a 13 chamei o conteúdo da página “default.asp” e nas linhas 17 a 21 crei links para alterar a URL do nosso exemplo e tags onde serão retornados os dados do exemplo.

Listagem 1. Página inicial “index.html”

01. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

02. <html>

03. <head>

04. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

05. <title>DESMISTIFICANDO ALGUNS MISTÉRIOS DO AJAX</title>

06. <script>

07.   var urlteste = window.location.hash.substring(window.location.hash.indexOf('#')+1,window.location.hash.length);

08.   urlteste = urlteste.toLowerCase();

09.  

10.   var novo = document.createElement('script');

11.   novo.setAttribute('type', 'text/javascript');

12.   novo.setAttribute('src', "include");

13.   document.getElementsByTagName('head')[0].appendChild(novo);

14. </script>

15. </head>

16. <body>

17.   <a href=''>home</a><br>

18.   <a href='#exemplo1'>exemplo 1</a> |

19.   <a href='#exemplo2'>exemplo 2</a><br>

20.   <span id="resposta"></span><br>

21.   <span id="conteudo"></span>

22. </body>

23. </html>

Na listagem 2 criei duas variáveis xmlHttp, linha 26, para não gerar conflito quando o código executar, isso pode acontecer nas versões 6 e 7 do Internet Explorer.

A função “extraiScript” é a responsável por executar todo o elemento entre a tag “script”, como veremos a seguir, para tornar nossa vida de programador mais fácil quando quisermos retornar mensagens aos usuários com conteúdos presentes somente na página que é chamada pelo Ajax.

A função “show”, linhas 28 a 39, executa o código que de fato irá fazer o conteúdo da página índex.html mudar.

Listagem 2. Código da página “default.asp”

01. <%

02. VerificaReferencia = request.ServerVariables("HTTP_REFERER")

03. if VerificaReferencia = "" then

04.   response.write "Você não tem permissão para visualizar esse conteúdo! :p"

05.   response.end

06. end if

07. response.expires=-1

08. Response.Charset="ISO-8859-1"

09. %>

10. document.onkeydown = function(event){

11.   if(navigator.appName == 'Microsoft Internet Explorer'){

12.         if(window.event.keyCode == 123){

13.               return false;

14.         }

15.   }else{

16.         if(event.ctrlKey && event.shiftKey && event.keyCode == 74 || event.ctrlKey && event.keyCode == 85){

17.               return false;

18.         }

19.   }

20. }

21.

22. document.oncontextmenu = function(){

23.   return false;

24. }

25.

26. var xmlHttpINIT,xmlHttp;

27.

28. function show() {

29.   xmlHttpINIT = GetXmlHttpObject();

30.   if (xmlHttpINIT == null) {

31.         alert ("Seu browser não suporta AJAX!");

32.         return;

33.   }else{

34.         var url = "include/ajax.asp";

35.         xmlHttpINIT.onreadystatechange = stateChangedShow;

36.         xmlHttpINIT.open("GET",url,true);

37.         xmlHttpINIT.send(null);

38.   }

39. }

40.

41. function stateChangedShow() {

42.   if (xmlHttpINIT.readyState==1 || xmlHttpINIT.readyState==2 || xmlHttpINIT.readyState==3) {

43.   }

44.   if (xmlHttpINIT.readyState==4) {

45.         extraiScript(xmlHttpINIT.responseText);

46.   }

47. }

48.

49. function GetXmlHttpObject() {

50.   var xmlHttp = null;

51.   try {

52.         // Firefox, Opera 8.0+, Safari

53.         xmlHttp = new XMLHttpRequest();

54.   } catch (e) {

55.         // Internet Explorer

56.         try {

57.         xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");

58.         } catch (e) {

59.         xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

60.         }

61.   }

62.   return xmlHttp;

63. }

64.

65. function extraiScript(texto){

66.   var ini = 0;

67.   // loop enquanto achar um script

68.   while (ini!=-1){

69.         // procura uma tag de script

70.         ini = texto.indexOf('<script', ini);

71.         // se encontrar

72.         if (ini >=0){

73.               // define o inicio para depois do fechamento dessa tag

74.               ini = texto.indexOf('>', ini) + 1;

75.               // procura o final do script

76.               var fim = texto.indexOf('</script>', ini);

77.               // extrai apenas o script

78.               codigo = texto.substring(ini,fim);

79.               // executa o script

80.               novo = document.createElement("script")

81.               novo.text = codigo;

82.               document.body.appendChild(novo);

83.         }

84.   }

85. }

86.

87. show();

Criando URLs únicas

Como falei anteriormente é necessário que algo fique executando no browser do cliente para poder interpretar que ouve alteração na URL, já que não irá acontecer o refresh da página.

Na listagem 3 o a função “redirURL”, linhas 11 a 22 é que interpreta a URL do browser e redireciona para o link certo. O método é muito simples é passada a ultima string registrada na variável “urlteste” para essa função e comparado com a nova string capturada por essa mesma variável, se os valores forem diferentes então é executada uma a função “showResultado” passando o valor desejado para ela.

Lembrando que o valor da variável “urlteste” foi definido que seria tudo que estaria escrito depois do caractere “#” na URL.

A função “redirURL” possui também um timeout que executa ela mesma em períodos de 200 milissegundos, linha 21.

Nota: para que essa função funcione corretamente é necessário que o timeout dela esteja entre 200 a 300 milissegundos, pois abaixo desse valor pode não executar corretamente o código no Internet Explorer e acima já demora muito para uma resposta.

Observe também que o valor esta entre 200 a 300 milissegundos, pois pode ocorrer em certas situações que 200 milissegundos também gerar erros de execução do script pelo Internet Explorer.

A função “showResultado”, linhas 24 a 38, é a encarregada de executar a página “get.asp” passando uma variável que nomeei “tipo”, através do método POST.

Observe que na linha 46 a função “extraiScript” é chamada e é passado o conteúdo retornado pela página “get.asp”

Listagem 3. Código da página “ajax.asp”

01. <%

02. VerificaReferencia = request.ServerVariables("HTTP_REFERER")

03. if VerificaReferencia = "" then

04.   response.write "Você não tem permissão para visualizar esse conteúdo! :p"

05.   response.end

06. end if

07. response.expires=-1

08. Response.Charset="ISO-8859-1"

09. %>

10. <script>

11. function redirURL(url_teste){

12.   urlteste = window.location.hash.substring(window.location.hash.indexOf('#')+1,window.location.hash.length);

13.  

14.   if(url_teste != urlteste){

15.         if(urlteste == "exemplo1"){

16.               showResultado(1);

17.         }else if(urlteste == "exemplo2"){

18.               showResultado(2);

19.         }

20.   }

21.   setTimeout("redirURL(urlteste);",200);

22. }

23.

24. function showResultado(tipo) {

25.   xmlHttp = GetXmlHttpObject();

26.   if (xmlHttp == null) {

27.         alert ("Seu browser não suporta AJAX!");

28.         return;

29.   }else{

30.         var url = "include/get.asp";

31.         var varStr;

32.         varStr = "tipo="+tipo;

33.         xmlHttp.onreadystatechange = stateChanged2;

34.         xmlHttp.open("POST",url,true);

35.         xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

36.         xmlHttp.send(varStr);

37.   }

38. }

39.

40. function stateChanged2() {

41.   if (xmlHttp.readyState == 1 || xmlHttp.readyState == 2 || xmlHttp.readyState == 3) {

42.         document.getElementById("conteudo").innerHTML = "carregando...";

43.   }

44.   if (xmlHttp.readyState == 4) {

45.         document.getElementById("conteudo").innerHTML = xmlHttp.responseText;

46.         extraiScript(xmlHttp.responseText);

47.   }

48. }

49.

50. function loadPag(urlteste){

51.   if(urlteste != "" && isNaN(urlteste)){

52.         if(urlteste == "exemplo1"){

53.               showResultado(1);

54.         }else if(urlteste == "exemplo2"){

55.               showResultado(2);

56.         }

57.   }

58. }

59.

60. document.onload = loadPag(urlteste);

61. setTimeout("redirURL(urlteste);",200);

62. </script>

Ate então o código executa perfeitamente porem o que acontece quando o usuário der refresh na página ou acessar ela pela primeira vez com uma URL que tenha já alguma string após o caractere “#”, como na figura 1?


Figura 1. Página “index.html” sem a execução da função “loadPag” no evento onload

Certamente não irá acontecer nada, pois sem um evento que especifique o que fazer no load da página não será apresentado nenhum conteúdo. Por isso criamos na página “ajax.asp” (Listagem 3) a função “loadPag”, linhas 50 a 58 que interpreta o valor da variável “urlteste” e executa o conteúdo desejado. Lembrando que o valor inicial da variável “urlteste” foi setado na página “índex.html” (Listagem 1) nas linhas 7 e 8.

Na listagem 4 a linha 10 retorna uma string com o valor do campo “tipo” passado pelo método POST através da função “showResultado”. A linha 13 retorna também uma string porem pelo JavaScript.

Listagem 4. Código da página “get.asp”

01. <%

02. VerificaReferencia = request.ServerVariables("HTTP_REFERER")

03. if VerificaReferencia = "" then

04.   response.write "Você não tem permissão para visualizar esse conteúdo! :p"

05.   response.end

06. end if

07. response.expires=-1

08. Response.Charset="ISO-8859-1"

09. %>

10. <h3>teste exemplo <%=request.form("tipo")%> concluído</h3>

11.

12. <script>

13. document.getElementById("resposta").innerHTML = "teste de exemplo <%=request.form("tipo")%> de retorno JavaScript concluído";

14. </script>

Note que se você retirar a linha 46 da página “ajax.asp” o código em JavaScript não será executado retornado algo semelhante a figura 2.


Figura 2. Página “index.html” sem a execução da função “extraiScript”

As figuras 3, 4 e 5 mostram as execuções da nossa página com os links que criamos.

Após navegar pelo nosso exemplo use também as opções de voltar e avançar do browser que o resultado também será o mesmo!


Figura 3. Página “index.html” no modo inicial


Figura 4. Página “index.html” ao clicar ou acessar diretamente a URL “http://localhost:83/#exemplo1”


Figuras 5. Página “index.html” ao clicar ou acessar diretamente a URL “http://localhost:83/#exemplo2”

Conclusão

Nesse artigo foi criado um exemplo prático de como implementar URLs únicas no seu site e como passar informações de páginas requisitadas pelo Ajax pelo JavaScript.

Referência

Função “extraiScript”

http://forum.imasters.com.br/index.php?showtopic=165277

Gregory Monteiro

gregorymonteiro@gmail.com

Universitário e programador web da DevMedia Group

Gregory Monteiro

Gregory Monteiro - Programador/administrador dos sites da DevMedia. Formado em sistemas de informação. Certificados SEO pela mestreseo e ietv. Certificado CMMI pela FIOCRUZ. Curso de web developer pela microcamp. Administrador de redes. Conhecimentos em C#, VB.NET, ASP, PHP, JSP, HTML, XHTML, HTML5, Ajax, CSS3, jQuery, JavaScript, SQL Server, MySQL, Firebird, IIS 6/7, NGINX, Linux, WPF


Comentários

blog comments powered by Disqus