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

nokogiri-xml-node.pdf

harmony.pdf

labintel/main.rb

1: require 'personnel'
2:
3: labintel_personnel = Labintel::Personnel.new(
4:   :source => File.open( 'personnel.infos_admin.html', 'rb').read
5: )
6:
7: puts labintel_personnel.email

labintel/personnel.rb

 1: %w(rubygems getoptlong nokogiri harmony pp iconv).each do |lib| require lib end
 2: %w(
 3:   get_scripts_and_fix_their_path
 4:   insert_jquery_library_into_source
 5:   extract_decoded_email
 6: ) do |lib| require "personnel/#{lib}" end
 7:
 8: module Labintel; class Personnel
 9:   attr_reader :email
10:   def initialize(parameters)
11:     @source = parameters[:source]
12:                                       #
13:     get_scripts_and_fix_their_path    # FICHIER A COMPLETER
14:                                       #
15:     insert_jquery_library_into_source # FICHIER A COMPLETER
16:                                       #
17:     @page = Harmony::Page.new(
18:       Iconv.conv('utf-8', 'iso-8859-15', @doc.to_html)
19:     )
20:                                       #
21:     extract_decoded_email             # FICHIER A COMPLETER
22:                                       #
23:   end

labintel/personnel/get_scripts_and_fix_their_path.rb

 1: module Labintel; class Personnel; def get_scripts_and_fix_their_path()
 2:   @doc = Nokogiri::HTML(@source)
 3: ############################################################
 4: #
 5: # DEBUT A COMPLETER
 6: #
 7: ############################################################
 8:
 9:
10:
11:
12: ############################################################
13: #
14: # FIN A COMPLETER
15: #
16: ############################################################
17: end; end; end

labintel/personnel/insert_jquery_library_into_source.rb

 1: module Labintel; class Personnel; def insert_jquery_library_into_source()
 2: ############################################################
 3: #
 4: # DEBUT A COMPLETER
 5: #
 6: # dans le DOM de la page, insérer l'élément suivant
 7: # <script src='/tmp/jquery-1.7.min.js' type='text/javascript'>
 8: #
 9: ############################################################
10:
11:
12:
13:
14:
15: ############################################################
16: #
17: # FIN A COMPLETER
18: #
19: ############################################################
20: end; end; end

labintel/personnel/extract_decoded_email.rb

 1: module Labintel; class Personnel; def extract_decoded_email()
 2: ############################################################
 3: #
 4: # DEBUT A COMPLETER
 5: #
 6: # dans la variable d'instance email, extraire le texte
 7: # de l'élément ayant pour attribut class la valeur 'mail'
 8: #
 9: ############################################################
10:
11: ############################################################
12: #
13: # FIN A COMPLETER
14: #
15: ############################################################
16: end; end; end

Corrigé

labintel/personnel/get_scripts_and_fix_their_path.rb

 1: module Labintel; class Personnel; def get_scripts_and_fix_their_path()
 2:   @doc = Nokogiri::HTML(@source)
 3: ############################################################
 4: #
 5: # DEBUT A COMPLETER
 6: #
 7: ############################################################
 8:   scripts = @doc.css('script')
 9:   scripts.each{|script|
10:     script['src'] = "/tmp#{script['src']}" unless script['src'].nil?
11:   }
12: ############################################################
13: #
14: # FIN A COMPLETER
15: #
16: ############################################################
17: end; end; end

labintel/personnel/insert_jquery_library_into_source.rb

 1: module Labintel; class Personnel; def insert_jquery_library_into_source()
 2: ############################################################
 3: #
 4: # DEBUT A COMPLETER
 5: #
 6: # dans le DOM de la page, insérer l'élément suivant
 7: # <script src='/tmp/jquery-1.7.min.js' type='text/javascript'>
 8: #
 9: ############################################################
10:     scripts = @doc.css('script')
11:     jquery = Nokogiri::XML::Node.new('script',@doc)
12:     jquery['src'] = '/tmp/jquery-1.7.min.js'
13:     jquery['type']= 'text/javascript'
14:     scripts.last.add_next_sibling(jquery)
15: ############################################################
16: #
17: # FIN A COMPLETER
18: #
19: ############################################################
20: end; end; end

labintel/personnel/extract_decoded_email.rb

 1: module Labintel; class Personnel; def extract_decoded_email()
 2: ############################################################
 3: #
 4: # DEBUT A COMPLETER
 5: #
 6: # dans la variable d'instance email, extraire le texte
 7: # de l'élément ayant pour attribut class la valeur 'mail'
 8: #
 9: ############################################################
10:      @email = @page.x("$('.mail').html()")
11: ############################################################
12: #
13: # FIN A COMPLETER
14: #
15: ############################################################
16: end; end; end

Version

$Id: jeudi_corrige_ruby_2.txt 567 2012-05-21 07:29:58Z aicardi $