Table of Contents

14h45 - Fil rouge « Javascript et DOM »

Navigation rapide : Lundi / Mardi / Mercredi / Jeudi / Vendredi Mémos : Perl / Python / Ruby

Finalité

Afin de se protéger des robots de collecte d'adresses email, certains service WEB utilisent une obfuscation Javascript.
Cela complique les interactions entre services WEB légitimes, l'adresse email étant souvant utilisée comme clef pour identifier un utilisateur.
Vous allez voir comment :

  1. embarquer un interpréteur javascript dans votre script Perl | Python | Ruby
  2. dés-obfusquer un email comme le ferait votre navigateur

Enoncé

Compléter le code fourni dans chaque langage afin de

  1. modifier l'attribut « src » des éléments « script » du DOM pour avoir un chemin absolu sur le système de fichier
    ie “unscript.js” → ”/tmp/unscript.js”
  2. insérer un élément « script » pointant sur le fichier ”/tmp/jquery-1.7.min.js”
  3. extraire la valeur en clair du mail codé via Javascript en utilisant JQuery

html_render.py

 1: from PyQt4.QtGui import *
 2: from PyQt4.QtCore import *
 3: from PyQt4.QtWebKit import *
 4: import sys
 5:
 6: class Render(QWebPage):
 7:   def __init__(self, html):
 8:     self.app=QApplication([])
 9:     self.view=QWebView()
10:     self.page=self.view.page()
11:     self.frame=self.page.mainFrame()
12:     self.frame.setHtml(html)
13:     self.app.processEvents()
14:     self.html=self.frame.toHtml()
15:
16:   def processJS(self,jscode):
17:     return self.frame.evaluateJavaScript(jscode).toString()
18:
19: def render(url,jscode=None):
20:   r=Render(url)
21:   #print r
22:   if jscode:
23:     return unicode(r.processJS(jscode))
24:   html=r.html
25:   return unicode(html)
26:
27: if __name__=="__main__":
28:   html="""
29: <html>
30: <head>
31: <title>Un test en HTML</title>
32: </head>
33: <body>
34: Rien
35: </body>
36: </html>"""
37:   javascript="""var toto='Test de Javascript';toto;"""
38:   print  render(html,javascript)

javascript.py

 1: from html_render import render
 2: # deux syntaxes possibles pour render
 3: # render(str) charge la page html contenue dans str, évalue le javascript et renvoie le code html modifié
 4: # rendre(str1,str2) charge la page html contenue dans str1, évalue la commande javascript contenue dans str2 et renvoie le résultat
 5:
 6: import lxml.html
 7: import lxml.etree
 8:
 9: # ouverture et parsage du fichier html
10: file=open("personnel.infos_admin.html")
11: tree=lxml.html.document_fromstring(file.read())
12:
13: # à compléter

Corrigé

javascript.py

 1: from html_render import render
 2: import lxml.html
 3: import lxml.etree
 4:
 5: # ouverture et parsage du fichier html
 6: file=open("personnel.infos_admin.html")
 7: tree=lxml.html.document_fromstring(file.read())
 8:
 9: # on remplace le sources des scripts par des /tmp
10: for element in tree.xpath('//script'):
11:     source=element.get('src')
12:     if source:
13:         element.set("src","file:///tmp/"+source.rsplit('/',1)[1])
14:
15: # on insère jquery
16: head=tree.xpath('//head')[0]
17: eltjquery=lxml.etree.Element("script",type="text/javascript",src="file:///tmp/jquery-1.7.min.js")
18: head.append(eltjquery)
19:
20: print render(lxml.html.tostring(tree),r"""$(".mail").html();""")