Validierung von Websites Karsten Stein, Bernd Voit Projektziele Überprüfung nach verbotenen und erforderlichen Inhalten Download von passwortgeschützten Seiten FTP up- und download Formulare mit get und post-Methode Durchsuchen nach Links, E-Mails, etc. Ausgabe eines Resume auf Bildschirm Erstellung einer Logdatei Vorgehensweise I Steuerung durch eine Skriptdatei HTTP und FTP Download mit Hilfe der Curl-Library Durchsuchen einer Website durch reguläre Ausdrücke mit Hilfe eines REGEX der pcre-Library Weitere Durchsuchung der Suchergebnisse Ausgabe von Suchergebnissen und Kommentaren Vorgehensweise II Verwendung von Programmargumenten, IntegerVariablen und Suchergebnissen als Platzhalter Unbedingte und bedingte Sprünge (anhand der Suchergebnisse) Ausführung von Programmen und Programmmodulen im Skript Reguläre Ausdrücke meta-characters – – – – – – – – – – – – \ general escape character with several uses ^ assert start of subject (or line, in multiline mode) $ assert end of subject (or line, in multiline mode) . match any character except newline (by default) [ start character class definition | start of alternative branch ( start subpattern ) end subpattern ? extends the meaning of ( also 0 or 1 quantifier also quantifier minimizer * 0 or more quantifier + 1 or more quantifier { start min/max quantifier •Beispiel: Integer-Zahlen [+|-]?([1-9][0-9]*)|0 Vereinfachter Ablauf Skriptbefehle Nummer 0 1 3 8 9 11 Name und Parameter Neg option regex Pos option regex Limit option regex Vneg option regex Vpos option regex Vlimit option regex Beschreibung Verbotener Inhalt Erforderlicher Inhalt Text/Teiltexte einschränken Negativ mit Infozeile Positiv mit Infozeile Wie Limit jedoch mit Infozeile -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -18 -19 -20 -21 Print Text Cleft Anzahl Cright Anzahl File Dateiname url URLname Write Dateiname Init // String Show Post url parameter Showlist Label labelname: Jump labelname Jumpif labelname nummer Jumpifr labelname optionen regex Var I Variablename Operator Zahl Login url user:passw. Sort Upload url user:passw. Quelldatei Run Programmname Parameter Textzeile ausgeben (printf) X Zeichen links abschneiden (für jeden Teiltext) X Zeichen rechts abschneiden (für jeden Teiltext) Datei laden URL laden Teiltexte in eine Datei schreiben Alle Einschränkungen aufheben und ursprünglichen Zielstring verwenden Kommentar Alle Teiltexte ausgeben URL laden inklusive Post-Parameter Alle Anfangs und Endpositionen der Teilstrings anzeigen (debug) Sprungmarke setzen Zur Sprungmarke springen Zur Sprungm. springen, wenn Treffer x nicht vorhanden Zur Sprungmarke springen, wenn Regex nicht vorhanden Integer-Variable (Operatoren: =,+,-,*,/) Anmeldung an einer passwortgeschützen Seite (ftp oder http) Teiltexte alphabetisch sortieren Upload einer Datei an einem Server Ausführung eines Programms / Skriptdatei Platzhalter Platzhalter können eigentlich überall in der Skriptdatei verwendet werden. Auch Schachtelung ist möglich, z.B.: {!/{!1!}!}. Es gibt drei Formen von Platzhaltern: 1. als Programmargument beim Programmaufruf oder bei Modul laden Format: {![0-9]+!}, Bsp.: 2. Argument: {!2!} 2. als Suchergebnis (Befehl „limit“) Format: {!/[0-9]+!}, Bsp.: 3. Treffer der letzten Suche: {!/3!} 3. als Integer-Variable (Befehl „var“) Format: {![A-Z][0-9|A-Z]*!}, Bsp.: Variable i: {!i!} Pcre.lib für die REGEX-Ausdrücke struct returnPCRE { int counter; char regexR[MAXLINE]; int ovector[OVECCOUNT]; }; returnPCRE pcreDatei(char *htmldatei, const char *regex, int optionen); Optionen der PCRE: 1 PCRE_CASELESS 2 PCRE_MULTILINE 4 PCRE_DOTALL 8 PCRE_EXTENDED 16 PCRE_ANCHORED 32 PCRE_DOLLAR_ENDONLY 64 PCRE_EXTRA 512 PCRE_UNGREEDY 2048 PCRE_UTF8 Kombination durch oder-Verknüpfung / Addition möglich. libcurl.lib zum Transfer über’s Web char *getURL(char *url, char *keyval, char *userpwd); void pushURL(char *url, char *source); Inerna: Befehle >=0 Diese haben (intern) folgende Bitstruktur 1:Positiv 2:Einschränkung 4:Ergebnis der Suche ausgeben 8:Erweiterte Ausgabe (OK/NOTOK Regex) Types.txt Hier sind die Befehlsnamen den Befehlsnummern zugeordnet. 33 3 limit 3 filter die Zahl 3 ist also die interne Nummerierung, und das Wort rechts daneben die Bezeichnung, die in der Skriptdatei angegeben werden muss. 3, limit und filter haben hier also die gleiche Bedeutung. Beispiel 1:Zugriff auf Passwortgeschützte Seite mit Fehlerauswertung // Passwortgeschützte Seite laden login www-1.informatik.fh-wiesbaden.de/~kstei001/ user:passw jumpifr ok1 0 404 Not Found print Seite nicht vorhanden jump ende label ok1: jumpifr ok2 0 Authorization Required print falscher Username oder Passwort jump ende label ok2: print Username und Passwort OK label ende: Beispiel2: FTP-Upload // ausgehend von einer Linkliste, pro Zeile eine Datei (durchnummeriert) auf einem Server uploaden // Linkliste laden load linkliste.txt // ein Teiltext entspricht einer Zeile limit 34 ^..*$ // Varialbe erstellen var i test = -1 label anfang: var i test + 1 jumpif ende {!test!} startModul Web2Txt.txt {!/{!test!}!} {!test!}.txt upload ftp.informatik.fh-wiesbaden.de/{!test!}.html usr:pwd {!test!}.txt Jump anfang label ende: print Skript beendet. // Hilfs-Skriptdatei Web2Txt.txt: url {!1!} write {!2!} print Beispiel 3: Formularergebnis nach erforderlichen Inhalt prüfen (1) print 1. Suche von Informatik.FH-Wiesbaden laden url http://fh-web1.informatik.fh-wiesbaden.de/go.cfm?fb=6&action=search&sprachid=1&lpid=0&sid=0 print print Body von der Framesite herausfiltern vlimit 515 <frame name="body".*> show vlimit 515 src=".*" show cleft 5 cright 1 show print print Suchseite laden url http://fh-web1.informatik.fh-wiesbaden.de{!/0!} print print Fachhochschule durchsuchen muss vorhanden sein vlimit 512 Fachhochschule durchsuchen jumpif errDurchsuche 0 print init print suche starten vlimit 515 <form.*> vlimit 515 action=".*" vlimit 515 ".*" cleft 1 cright 1 Beispiel 3: Formularergebnis nach erforderlichen Inhalt prüfen (2) post http://fh-web1.informatik.fh-wiesbaden.de{!/0!} query={!1!} print print Titel der Suchergebnisse von {!1!} label treffer: // nach erforderlichem Inhalt überprüfen limit 0 Texis &amp; Webinator Copyright \(C\) 2\d{3,3} THUNDERSTONE - EPI, Inc."></A></H6>.\n</BODY></HTML>.$ jumpif errCopyright 0 init // Titel der Suchergebnisse ausgeben limit 515 <STRONG>.*</STRONG> cleft 8 cright 9 show init // Nach dem Link "weiter" suchen limit 515 <A HREF=".*"> <FONT FACE="Helvetica">weiter</FONT>&gt;&gt;</A> // Sprung wenn keine Treffer jumpif ok 0 limit 515 <A HREF=".*"> limit 515 ".*" cleft 1 cright 1 url http://fh-web1.informatik.fh-wiesbaden.de{!/0!} jump treffer Beispiel 3: Formularergebnis nach erforderlichen Inhalt prüfen (3) label errDurchsuche: print print Fachhochschule durchsuchen nicht gefunden jump ende label errCopyright: print print Copyright nicht gefunden jump ende label ok: print print keine Fehler aufgetreten label ende: print