Διάχυση πληροφοριών και ασφάλεια στον παγκόσμιο ιστό
Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr
Αρχιτεκτονική του παγκόσμιου ιστού
- Ο παγκόσμιος ιστός (world wide web)
είναι υλοποιημένες σύμφωνα με το μοντέλο
πελάτη-υπηρέτη (client-server).
- Υπηρέτες ακούν για εντολές του πρωτοκόλλου HTTP
στη θύρα TCP 80 και απαντούν ανάλογα με το περιεχόμενο της εντολής.
- Οι απαντήσεις είναι συνήθως υπερκείμενο (hypertext)
δομημένο σύμφωνα με το πρότυπο HTML.
- Παραπομπές σε άλλες σελίδες ή περιεχόμενο γίνονται με την
τυποποιημένη χρήση των Uniform Resource Locators (URL).
- Τόσο ο πελάτης, όσο και ο υπηρέτης μπορούν να προσαρμόσουν
δυναμικά το περιεχόμενο μιας σελίδας.
Προσδιορισμός στοιχείων με URI
Ο προσδιορισμός στοιχείων στο πρωτόκολλο HTTP
γίνεται με τη χρήση των Uniform Resource Identifiers.
Αυτά ορίζονται από την παρακάτω γραμματική (RFC 2068):
URI = ( absoluteURI | relativeURI ) [ "#" fragment ]
absoluteURI = scheme ":" *( uchar | reserved )
relativeURI = net_path | abs_path | rel_path
net_path = "//" net_loc [ abs_path ]
abs_path = "/" rel_path
rel_path = [ path ] [ ";" params ] [ "?" query ]
path = fsegment *( "/" segment )
fsegment = 1*pchar
segment = *pchar
params = param *( ";" param )
param = *( pchar | "/" )
scheme = 1*( ALPHA | DIGIT | "+" | "-" | "." )
net_loc = *( pchar | ";" | "?" )
query = *( uchar | reserved )
fragment = *( uchar | reserved )
pchar = uchar | ":" | "@" | "&" | "=" | "+"
uchar = unreserved | escape
unreserved = ALPHA | DIGIT | safe | extra | national
escape = "%" HEX HEX
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+"
extra = "!" | "*" | "'" | "(" | ")" | ","
safe = "$" | "-" | "_" | "."
unsafe = CTL | SP | <"> | "#" | "%" | "<" | ">"
national = <any OCTET excluding ALPHA, DIGIT,
reserved, extra, safe, and unsafe>
Η χρήση τους επιτρέπει τον προσδιορισμό άλλων σελίδων τοπικά, σε άλλα
μηχανήματα, καθώς και ερωτήσεων:
http://kerkis.math.aegean.gr/~dspin/
http://www.altavista.com/cgi-bin/query?pg=q&text=yes&q=link%3akerkis%2emath%2eaegean%2egr%2f%7edspin+%2dhost%3akerkis%2emath%2eaegean%2egr&stq=10&c9k
Σημαντικά προβλήματα ασφάλειας που μπορούν να προκύψουν είναι τα παρακάτω:
- Το σύστημα DNS που μετατρέπει τα ονόματα σε διευθύνσεις δεν είναι ασφαλές
- Οποιοσδήποτε μπορεί να δημιουργήσει ένα URI.
Δεν πρέπει η ασφάλειά μας να βασίζεται σε "κρυμμένα" αρχεία ή στη χρήση
συγκεκριμένων URI.
- Με τον προσδιορισμό άλλων θυρών μπορεί ένα "αθώο" URI να "μιλήσει" σε άλλο
πρωτόκολλο (όχι HTTP) με καταστροφικά αποτελέσματα.
- Όταν ένα URI περιέχει συνθηματικό αυτό δεν μπορεί να είναι εμπιστευτικό.
Το πρωτόκολλο HTTP
Το πρωτόκολλο HTTP υποστηρίζει τις παρακάτω μεθόδους επικοινωνίας:
- GET
- HEAD
- POST
- PUT
- DELETE
- TRACE
Παράδειγμα:
GET /pub/WWW/TheProject.html HTTP/1.1
Host: www.w3.org
Βασικά προβλήματα ασφάλειας που έχουν σχέση με το HTTP είναι τα παρακάτω:
Διασφάλιση συναλλαγών HTTP
Συναλλαγές που χρησιμοποιούν HTTP μπορούν να ασφαλιστούν ως προς
την εμπιστευτικότητα και την ακεραιότητα σε τρία διαφορετικά επίπεδα:
- Κάτω από το πρωτόκολλο HTTP μέσω SSL ή IPSEC
- Επεκτείνοντας το πρωτόκολλο HTTP (π.χ. secure HTTP)
- Πάνω από το πρωτόκολλο HTTP με λ.χ. με εξειδικευμένες εφαρμογές σε
Java που κρυπτογραφούν τα μηνύματα.
Περιγραφή σελίδων με HTML
H HTML είναι μια εφαρμογή της SGML για την περιγραφή σελίδων στο Web.
Περιοχές του κειμένου σημειώνονται με ετικέτες (tags).
Κάθε ετικέτα περιλαμβάνει το όνομά της και παραμέτρους.
Οι ετικέτες γράφονται ως εξής:
<όνομα ετικέτας παράμετροι>
Μια περιοχή του κειμένου μπορεί να σημειωθεί ως εξής:
<ετικέτα>
περιοχή που σημειώνεται
</ετικέτα>
Βασικές ετικέτες που υποστηρίζει η HTML είναι οι παρακάτω:
- HTML
- περιγραφή ολόκληρης σελίδας
- HEAD
- επικεφαλίδα της σελίδας
- BODY
- κείμενο της σελίδας
- H1-H6
- επικεφαλίδες του κειμένου
- P
- αλλαγή παραγράφου
- UL
- λίστα με τελείες
- OL
- αριθμημένη λίστας
- LI
- στοιχείο λίστας
- BR
- αλλαγή γραμμής
- HR
- οριζόντια γραμμή
- IMG
- εικόνα
- A
- (anchor) σημείο πρόσβασης από ή σε υπερκείμενο
- PRE
- προστοιχειοθετημένο κείμενο
- DL, DT, DD
- λίστα περιγραφών, περιγραφές
- I
- πλάγιοι χαρακτήρες
- B
- έντονοι χαρακτήρες
Παράδειγμα σελίδας:
<!doctype html public "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<TITLE>Τίτλος της σελίδας</title>
<META NAME="GENERATOR" CONTENT="thread.pl">
<META NAME="AUTHOR" CONTENT="Diomidis Spinellis">
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=ISO-8859-7">
<LINK REV="made" HREF="mailto:dspin@aegean.gr">
<LINK REL="ToC" HREF=".././web/index.htm">
<LINK REV="Subdocument" HREF=".././web/index.htm">
<LINK REL="previous" HREF=".././web/http.htm">
<LINK REL="next" HREF=".././web/cgi.htm">
</HEAD>
<BODY> <H1>Επικεφαλίδα πρώτου επιπέδου</H1><HR>
Κείμενο που περιέχει ένα σημείο κατάληξης υπερκειμένου
<a name="G42"> (<em>με έντονο κείμενο</em>)</a>
και μια λίστα:
<ul>
<li> στοιχείο 1
<li> στοιχείο 2
</ul>
<p>
Νέα παράγραφος με ένωση υπερκειμένου στο
<A HREF="http://www.aegean.gr">Πανεπιστήμιο Αιγαίου</A>
<HR>
</BODY>
</HTML>
Προβλήματα ασφάλειας που σχετίζονται με την HTML είναι τα εξής:
- Χρήση προβληματικών URI μέσω εικόνων ή anchors.
- Οι μέθοδοι αποστολής στοιχείων μέσω HTTP και SMTP δε διασφαλίζουν
την εμπιστευτικότητά τους.
Ενεργό περιεχόμενο με CGI
Προγράμματα CGI (Common Gateway Interface)
επικοινωνούν με τον εξυπηρετητή Web για να εκτελέσουν
κάποιες λειτουργίες που ζητά ο πελάτης, ή/και να δημιουργήσουν
ενεργό περιεχόμενο.
Το πρόγραμμα CGI δέχεται από τον εξυπηρετητή τις παραμέτρους που καθόρισε
ο χρήστης μέσω
μεταβλητών του περιβάλλοντος (environment variables).
Τυπικό δείγμα των μεταβλητών που μεταφέρονται στο πρόγραμμα CGI είναι
το παρακάτω:
SERVER_SOFTWARE=Apache/1.2.5
GATEWAY_INTERFACE=CGI/1.1
DOCUMENT_ROOT=/home/www/htdocs
REMOTE_ADDR=192.168.135.5
SERVER_PROTOCOL=HTTP/1.0
REQUEST_METHOD=GET
REMOTE_HOST=staffpc15.aegean.gr
QUERY_STRING=
HTTP_USER_AGENT=Mozilla/3.01 (Win95; I)
PATH=/bin:/usr/bin:
HTTP_CONNECTION=Keep-Alive
HTTP_ACCEPT=image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
REMOTE_PORT=1124
SCRIPT_NAME=/cgi-bin/pe
SCRIPT_FILENAME=/home/www//cgi-bin/pe
SERVER_NAME=www.aegean.gr
REQUEST_URI=/cgi-bin/pe
SERVER_PORT=80
HTTP_HOST=www.aegean.gr
SERVER_ADMIN=webmaster@aegean.gr
Αφού το πρόγραμμα επεξεργαστεί τις παραμέτρους που όρισε ο χρήστης στη φόρμα
(που περιέχονται κωδικοποιημένες στη μεταβλητή QUERY_STRING)
δημιουργεί μια πλήρη απάντηση σύμφωνα με το πρωτόκολλο HTTP (επικεφαλίδα
και δεδομένα).
Για παράδειγμα, η εκτύπωση των πιο πάνω μεταβλητών έγινε από το εξής
πρόγραμμα σε Perl:
#!/usr/bin/perl
print "Content-Type: text/plain\n\n";
for $key (keys %ENV) {
print "$key=$ENV{$key}\n";
}
Σχετιζόμενα προβλήματα ασφάλειας είναι τα παρακάτω:
- Δυνατότητες εκτέλεσης άλλων εντολών στη γλώσσα υλοποίησης του
προγράμματος (sh, Perl, Tcl, Java, Python)
- Προσθήκη νέων αδυνάτων σημείων στον εξυπηρετητή
Παρόμοια προβλήματα μπορούν να εμφανίσουν και τα
server side includes που εκτελούν κώδικα.
Παράδειγμα
Το παρακάτω λανθασμένο και ανασφαλές πρόγραμμα σε Perl τρέχει την
εντολή finger σε σύστημα Unix για το χρήστη που έχει ζητήσει κάποιος
στο πεδίο USER μιας φόρμας HTML.
#!/usr/bin/perl
$query = $ENV{'QUERY_STRING'};
@pairs = split(/\&/, $query);
for (@pairs) {
($field, $val) = split(/=/);
$field =~ s/\+/ /g;
$field =~ s/\%(\w\w)/sprintf("%c", hex($1))/eg;
$val =~ s/\+/ /g;
$val =~ s/\%(\w\w)/sprintf("%c", hex($1))/eg;
$field{$field} = $val;
}
$|=1;
print "Content-Type: text/plain\n\n";
system "finger $field{USER}\n";
Αν το εκτελέσουμε με την παράμετρο USER να έχει την τιμή dds
http://www.senanet.com/cgi-bin/pe?USER=dds
θα εμφανιστεί το παρακάτω αποτέλεσμα:
Login: dds Name: Diomidis Spinellis
Directory: /home/dds Shell: /bin/bash
On since Wed Jun 30 12:18 (EET) on ttyp0
5 minutes 49 seconds idle
Αν όμως προσθέσουμε στο τέλος του URI ένα ερωτηματικό
(που διαχωρίζει τις εντολές στο φλοιό του Unix) και την εντολή cat /etc/passwd
http://www.senanet.com/cgi-bin/pe?USER=dds;cat%20/etc/passwd
θα λάβουμε και το περιεχόμενο του αρχείου passwd (περιέχει τους
κωδικοποιημένους κωδικούς χρηστών σε ορισμένες εκδόσεις του Unix)
στο τέλος της απάντησης:
Login: dds Name: Diomidis Spinellis
Directory: /home/dds Shell: /bin/bash
On since Wed Jun 30 12:18 (EET) on ttyp0
5 minutes 49 seconds idle
root:XXXXXXXXXXXXX:0:0:Charlie Root:/root:/bin/bash
bin:*:1:1:bin:/bin:
daemon:*:2:2:The Devil Himself:/sbin:
adm:*:3:4:adm:/var/adm:
lp:*:4:7:lp:/var/spool/lpd:
...
Για να αποφεύγουμε τέτοια προβλήματα πρέπει:
- Να μη γράφουμε εφαρμογές CGI αν δεν έχουμε μεγάλη πείρα στη γλώσσα
υλοποίησης και τους αντίστοιχους κινδύνους.
- Να μην εμπιστευόμαστε με κανέναν τρόπο στοιχεία που προέρχονται
από φόρμες.
- Να ελέγχουμε σχολαστικά όλες τις παραμέτρους του προγράμματος.
- Να εκτελούμε τα προγράμματα CGI σε προστατευμένο, όσο γίνεται,
περιβάλλον.
Αυθεντικοποίηση του χρήστη
Η αυθεντικοποίηση του χρήστη
γίνεται συχνά με τη χρήση της μεθόδου POST ή
με την χρήση του κατάλληλου URI.
Με τον τρόπο αυτό είναι πολύ εύκολη η επαναχρησιμοποίηση ενός
συνθηματικού ή η ανακάλυψή του παρακολουθώντας πακέτα στο δίκτυο.
Παράδειγμα εντολής POST με συνθηματικό:
POST /cgi-bin/smswww HTTP/1.0
Referer: http://www.netcs.com/pages/foo/send.html
Proxy-Connection: Keep-Alive
User-Agent: Mozilla/3.01 (Win95; I)
Host: www.netcs.com
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Content-type: application/x-www-form-urlencoded
Content-length: 143
Authorization: Basic aWV0ZopqZXRm
Προστασία προσωπικών στοιχείων
Ένας χρήστης μπορεί άθελά του να αποκαλύψει τα παρακάτω στοιχεία μέσω
της πρόσβασής του στο Web:
- Την ταυτότητά του (όνομα, email, κ.λπ.)
- Τη θέση του (διεύθυνση IP, όνομα, φυσική θέση)
- Ονόματα σελίδων που έχει επισκεφτεί
- Στοιχεία τα οποία έψαξε μέσω μηχανών έρευνας
- Καταναλωτικές συνήθειες
- Στοιχεία που γράφει σε φόρμες
Πολλά από τα στοιχεία μπορούν να αποκαλυφθούν και από ανάλυση της κίνησης
κοντά στο μηχάνημα του χρήστη.
Με τεχνικές όπως Chaum mixes και Onion routing μπορούμε να αποφύγουμε
ορισμένα από τα προβλήματα αυτά.
Cookies
Τα cookies χρησιμοποιούνται στο Web για να επιτρέψουν την εκτέλεση
προγραμμάτων που απαιτούν τη διατήρηση κατάστασης (state)
ανάμεσα στις εξ' ορισμού χωρίς κατάσταση (stateless)
αυτόνομες συναλλαγές HTTP.
Η διατήρηση κατάστασης είναι απαραίτητη για την υλοποίηση εφαρμογών ηλεκτρονικού
εμπορίου όπου ο υπηρέτης χρειάζεται π.χ. να γνωρίζει τα είδη που
έχει επιλέξει ο χρήστης να αγοράσει.
Τα cookies έχουν τη μορφή:
Name=VALUE; expires=DATE; domain=DOMAIN; path=PATH; secure
Παράδειγμα (από το αρχείο cookies.txt):
home.netscape.com FALSE / FALSE 942189160 NGUserID cfc84d23-4929-905788546-1
Προβλήματα ασφάλειας:
- Προσωπικά στοιχεία προτιμήσεων,
όπως οι σελίδες που έχει επισκεφτεί ένας χρήστης
για μεγάλο χρονικό διάστημα σε μια συγκεκριμένη περιοχή
μπορούν εύκολα να καταγραφούν.
- Επειδή βασίζονται στο DNS μπορούν να γίνουν στόχος επιθέσεων
με τη χρήση πλαστογραφίας του DNS.
- Με τον παραπάνω τρόπο μπορούν να διαγραφούν, να υποκλαπεί η
ταυτότητα ενός χρήστη, ή να αποκαλυφθούν προσωπικές προτιμήσεις του χρήστη.
- Επειδή τα cookies φυλάσσονται στο μηχάνημα του χρήστη μπορεί
εύκολα να χρησιμοποιηθούν ή να διαβαστούν
επίτηδες ή κατά λάθος από άλλους χρήστες.
Ασφάλεια στη Java
Η Java επιτρέπει τη μεταφορά εκτελέσιμου περιεχομένου και την εκτέλεσή
του σε οποιαδήποτε αρχιτεκτονική και λειτουργικό σύστημα έχει υλοποιηθεί
η ιδεατή μηχανή Java (Java virtual machine).
Οι περισσότεροι εξυπηρετητές υποστηρίζουν την μεταφορά και εκτέλεση προγραμμάτων
Java μέσα από τον ιστό με τη χρήση της ετικέτας της HTML applet.
Τέτοια προγράμματα περιέχουν ανέμπιστο (untrusted)
κώδικα.
Για την προστασία του χρήστη και του μηχανήματος ο ανέμπιστος κώδικας
ελέγχεται ως προς την ορθότητά του και
εκτελείται σε ένα περιβάλλον περιορισμένων δυνατοτήτων,
το σκάμμα (sandbox).
Οι περιορισμοί προγραμμάτων που εκτελούνται στο σκάμμα εξαρτώνται από
την πολιτική ασφάλειας που έχει οριστεί.
Μια τυπική πολιτική ασφάλειας περιέχει τους παρακάτω περιορισμούς:
- Ανάγνωση τοπικών αρχείων
- Εγγραφή τοπικών αρχείων
- Διαγραφή τοπικών αρχείων
- Αλλαγή ονόματος τοπικών αρχείων
- Δημιουργία τοπικού καταλόγου του τοπικού συστήματος
- Ανάγνωση στοιχείων καταλόγου του τοπικού συστήματος
- Έλεγχος για την ύπαρξη αρχείου
- Ανάγνωση στοιχείων ενός αρχείου
- Σύνδεση μέσω δικτύου με μηχάνημα άλλο από αυτό από το οποίο φορτώθηκε το πρόγραμμα
- Αναμονή για σύνδεση από το δίκτυο
- Δημιουργία παραθύρου με άσχετο όνομα
- Απόκτηση του ονόματος και του καταλόγου του χρήστη
- Αλλαγή των ιδιοτήτων του συστήματος
- Έξοδος από το διερμηνευτή της Java
- Φόρτωμα δυναμικών βιβλιοθηκών
- Δημιουργία νημάτων έξω από το ThreadGroup
- Δημιουργία ClassLoader
- Δημιουργία SecurityManager
- Δημιουργία κλάσεων που υπάρχουν στο σύστημα
Ο έλεγχος του κώδικα διασφαλίζει τις παρακάτω ιδιότητες:
- Το εκτελέσιμο αρχείο της κλάσης έχει την ορθή μορφή.
- Αποκλείεται η υπερχείλιση ή υπερχείλιση της στοίβας των παραμέτρων.
- Οι εντολές bytecode καλούνται με το σωστό τύπο.
- Δεν υπάρχουν απαγορευμένες μετατροπές μεταξύ τύπων (π.χ. Internet και Pointer)
- Δεν υπάρχει μη εξουσιοδοτημένη πρόσβαση (μέσω private, public, protected).
- Η κάθε πρόσβαση στους καταχωρητές είναι νόμιμη.
Στο JDK 1.1 υπάρχει η δυνατότητα φορτώματος μιας έμπιστης εφαρμογής
από το δίκτυο αν αυτή έχει την κατάλληλη ψηφιακή υπογραφή.
Τα προβλήματα ασφάλειας στην περίπτωση αυτή είναι παρόμοια με αυτά
της τεχνολογίας ActiveX.
Στην Java 2 υπάρχει δυνατότητα ορισμού διαφορετικής πολιτικής ασφάλειας
ανάλογα με την υπογραφή μιας εφαρμογής.
Ορισμένα προβλήματα ασφάλειας που δημιουργούνται από τη χρήση της Java είναι τα
εξής:
- Προβλήματα από λανθασμένη υλοποίηση της Java
(π.χ. των ελέγχων στο σύστημα των τύπων)
- Χρήση λανθασμένης πολιτικής ασφάλειας
Ασφάλεια στη Javascript
Η γλώσσα Javascript δεν έχει καμιά σχέση με τη Java.
Αποτελείται από απλές εντολές που περιέχονται μέσα στη σελίδα
HTML και διερμηνεύονται από το φυλλομετρητή.
Το κύριο πρόβλημα ασφάλειας που δημιουργεί η Javascript είναι η
δημιουργία επιθέσεων άρνησης υπηρεσίας ή διαρροής προσωπικών δεδομένων,
συχνά με την άθελη βοήθεια του μη έμπειρου χρήστη.
Οι παρακάτω είναι ορισμένες επιτυχημένες επιθέσεις που έχουν
γίνει με βάση της Javascript:
- Πρόσβαση στην ιστορία πρόσβασης σελίδων
- Ανάγνωση καταλόγων
- Ανάγνωση αρχείων (μέσω email που στέλνει ο χρήστης κατά λάθος)
- Δημιουργία αρχείων Java που απαγορεύει το firewall
(επαναδημιουργία του applet tag)
Ασφάλεια και ActiveX
- Η τεχνολογία ActiveX της Microsoft καλύπτει ένα πολύ ευρύ πλαίσιο
τεχνικών για τη δημιουργία ενεργών σελίδων.
- Η τεχνολογία βασίζεται στο Component Object Model (COM) και
μεταξύ άλλων υποστηρίζει τη μεταφορά
και εκτέλεση περιεχομένου σε υπολογιστές Windows/Intel (σήμερα)
και σε υπολογιστές Macintosh και Unix (στο μέλλον, κατά τη Microsoft).
- Προγράμματα ActiveX γραμμένα σε Java έχουν παρόμοια πλεονεκτήματα
και προβλήματα με τα Java Applets.
- Προγράμματα ActiveX γραμμένα σε Visual C ή Visual Basic έχουν
πλήρη πρόσβαση σε όλους τους πόρους και τα στοιχεία του υπολογιστή.
- Για το λόγο αυτό τέτοια προγράμματα σφραγίζονται με τη χρήση
ψηφιακών υπογραφών και κρυπτογραφικής σύνοψης του μηνύματος.
- Ο χρήστης εμπιστεύεται το πρόγραμμα που έγραψε αυτός που υπέγραψε
το ActiveX control όπως εμπιστεύεται ένα πρόγραμμα που αγόρασε από το
εμπόριο.
- Προγράμματα ActiveX σε Visual C έχοντας πλήρη πρόσβαση σε όλους
τους πόρους του επεξεργαστή μπορούν να δημιουργήσουν πρόβλημα με πολλούς
τρόπους:
- Με δόλο: πώς ξέρουμε ποιους κατασκευαστές ActiveX να εμπιστευτούμε;
- Χωρίς δόλο: πολλά προγράμματα έχουν λάθη τα οποία δημιουργούν νέα
προβλήματα ασφάλειας στον υπολογιστή.
- Ως φορείς για δόλια προγράμματα: ένα πρόγραμμα ActiveX μπορεί να περιέχει
μέσα του βιβλιοθήκες που δεν έχουν ελεγχθεί, ή να δημιουργήσει μια νέα δίοδο
στον υπολογιστή για εισροή δόλιου κώδικα.
Τρόπος προστασίας
Η τεχνολογία ActiveX είναι εγγενώς ανασφαλής.
Ο καλύτερος τρόπος προστασίας είναι
η απενεργοποίηση της δυνατότητας εκτέλεσης ActiveX στο φυλλομετρητή.
Βιβλιογραφία
- T. Berners-Lee and D. Connolly.
RFC 1866: Hypertext Markup
Language — 2.0, November 1995.
- T. Berners-Lee,
L. Masinter, and M. McCahill.
RFC 1738: Uniform Resource
Locators (URL), December 1994.
- R. Fielding,
J. Gettys, J. Mogul, H. Frystyk, T. Berners-Lee, et al.
RFC 2068: Hypertext transfer
protocol — HTTP/1.1, January 1997.
- Stefanos
Gritzalis and Diomidis Spinellis.
Addressing threats and security issues in World Wide Web
technology.
In Proceedings CMS '97 3rd IFIP TC6/TC11 International joint working
Conference on Communications and Multimedia Security, pages 33–46,
Athens, Greece, September 1997. IFIP, Chapman & Hall.
- Gary McGraw and
Edward W. Felten.
Securing Java.
Wiley, 1999.
- Aviel D. Rubin, Daniel
Geer, and Marcus J. Ranum.
Web
Security Sourcebook.
John Wiley & Sons, 1997.