PDF-Datei

Transcription

PDF-Datei
Webbausteine.de
HTML - CSS - JavaScript - PHP - MySQL - Webdesign - Bausteine - Tipps - Tools
PHP mit Sicherheit
Sicheres Programmieren– Traue niemals den Eingaben des
Benutzers!
Speichern Sie fremde Benutzereingaben nie ohne eine Überprüfung
in einer Datenbank oder in einer Datei ab.
Vertrauen Sie keinen Werten, die über Benutzereingaben, den URL
oder Cookies in das PHP-Skript gelangen. Alle externen Parameter, selbst wenn
sie aus versteckten Feldern oder Auswahlmenüs (Auswahllisten) kommen, müssen
einer Plausibilitätsprüfung unterworfen werden, bevor sie im Programm verwendet
werden.
Manche Browser wie etwa Safari und Firefox erlauben überdies bereits von Haus
aus oder durch Erweiterungen das direkte verändern des Quellcodes. Formularmanipulationen sind dadurch sogar noch einfacher.
Inhalt dieser Seite:
• Validieren – die Datenanalyse
• Filtern – das Trennen von Gut und Schlecht
• Maskieren – das Entschärfen von Metazeichen
•
•
•
•
Verzeichnisse und Dateien mit .htaccess sperren
Chmod - Lese- und Schreibrechte vergeben
Sicherheitsoptionen in der php.ini
Passwörter – der Schlüssel zu Ihren Daten
•
•
•
•
Dateiupload – Fremde Daten auf dem Server
CAPTCHAs – den Schlüssel im Bild
Datei robots.txt – Infos für Webcrawler
Fingerabdruck – Was der Browser verrät
•
•
•
•
•
•
•
•
Sicherheitslücke:
Sicherheitslücke:
Sicherheitslücke:
Sicherheitslücke:
Sicherheitslücke:
Sicherheitslücke:
Sicherheitslücke:
Sicherheitslücke:
Fehlermeldungen
Cross-Site Scripting
Kontaktformular
PHP Referrer
Fremde Inhalte
Ajax und XMLHttpRequest
MySQL-Datenbank
Datei-. und Verzeichnisnamen
• Halten Sie Ihren Code unter Verschluß
• Formular-Spam – Kostenlose Werbung
• Formulare – die Fehlerquelle schlechthin
http://webbausteine.de/blog/php/sicherheit.php
Validieren – die Datenanalyse
Die Validierung ist Teil der Qualitätssicherung und bezeichnet die Prüfung von
Werten auf bestimmte Eigenschaften wie etwa, ob der Wert eines bestimmten
Datentyps, einer Datendomäne oder eines Datenformats entspricht. Es ist also ein
analysierender Vorgang, der als Ergebnis eine Aussage bestätigt oder widerlegt.
Solche Eigenschaftsprüfungen könnten mit Fragen wie „entspricht der Wert einer
positiven Ganzzahl?“ oder „enthält der Wert keiner Zeichen der Zeichenmenge X?“
ausgedrückt werden.
• Überprüfen Sie ob bestimmte Zeichenfolgen in der Benutzereingabe vorhanden
if (strstr($_POST["url"], "http://")) { …
oder
sind
if (preg_match('_(<a\s+href\s*=.*){3,}|(http://[a-z0-9-./\_]{6,}.*)
{2,}_is',
$_POST["textarea"])) { …
• Überprüfen Sie auch Zahlen ob diese sich im erlaubten Bereich befinden
und ob tatsächlich eine Zahl eingegeben wurde
is_numeric($_POST["zahl"])
.
Weitere Prüfungen: ctype_digit(), is_bool(), is_null(), is_float(),
is_int(),
is_string(), is_object(), is_array().
• Kürzen Sie Benutzereingaben
<input type="text" name="text" size="25" maxlength="30">
…
$text = substr($_POST["text"], 0, 30);
• Achten Sie auf Mindestlängen und Maximallängen
if (strlen( $_POST["eingabe"]) < 5) { …
• Überprüfen Sie das Datum auf Gültigkeit
if (checkdate($monat, $tag, $jahr)) { …
Überprüfen mit Regulären Ausdrücken
• Postleitzahl mit 5 Ziffern
{…
if (!preg_match("/^\d{5}$/", $_POST["plz"]))
• Überprüfen der E-Mail-Adresse auf Gültigkeit
$_pat = "^[_a-zA-Z0-9-]+(.[_a-za-z0-9-]+)*@([a-z0-9-]{3,})+.([a-za-z]{2,4})$";
if (preg_match("|$_pat|i", $_POST["email"])) { …
• Überprüfen der URL-Adresse auf Gültigkeit
$_pat = "#^(http|https)+(://www.)+([a-z0-9-_.]{2,}\.[a-z]{2,4})$#i"
if (preg_match($_pat , $_POST["url"])) { …
• Überprüfen auf nur Zahlen
if (preg_match("#^[0-9]+$#", $_POST["zahlen"])) { …
• Überprüfen auf nur Buchstaben
http://webbausteine.de/blog/php/sicherheit.php
if (preg_match("/^[ a-zA-ZäöüÄÖÜß]+$/i", $_POST["buchstaben"])) { …
• Überprüfen auf Spam
Enthält ein einzeiliges Formularfeld Zeilenubrüche handelt es sich meistens
um Spam.
if (preg_match('_[\r\n]_', $_POST["name"])) { …
Filtern – das Trennen von Gut und Schlecht
Das Filtern dient der Trennung von erlaubten und unerlaubten
Werten, wobei nur die erlaubten Werte durchgelassen werden. Man
sollte sich nicht nur auf gefilterte Nutzereingaben verlassen,
sondern auch nochmals beim Schreiben in die Datenbank (oder Datei) die
Eingaben überprüfen.
• Filtern Sie mit
strip_tags($_POST["name"]) HTML-Tags heraus
oder lassen Sie mit
preg_match("/[a-zA-Z0-9.äöüÄÖÜß]/",
["name"])
nur bestimmte Zeichen durch.
$_POST
• Filtern Sie Leerzeichen und Zeilenumbrüche (Metazeichen) am Zeilenanfang und
$text = trim($_POST["text"]);
Zeilenende
• Filtern Sie Zeilenumbrüche des Textarea-Tags
$textarea = str_replace(array("\n", "\r"), "", $_POST["textarea"]);
• Filtern einer „E-Mail Header Injection”
preg_replace( '((?:\n|\r|\t|%0A|%0D|%08|%09)+)i'
["email"]);
,
"",
$_POST
• Filtern einer Variablen durch einen spezifischen Filter filter_var() (PHP 5)
Die eingebauten PHP-Filter repräsentieren, zumindest gegenüber gar keinen
Filtern, einen großen Fortschritt, den bisher viele Web-Programmierer noch gar
nicht entdeckt haben.
if (! filter_var("[email protected]", FILTER_VALIDATE_EMAIL)) { …
filter_var("www.test.xy", FILTER_VALIDATE_URL)
filter_var($_POST["zahl"], FILTER_VALIDATE_INT)
filter_var($_POST["name"], FILTER_SANITIZE_STRING)
$MyInt = filter_var($unsafeint, FILTER_SANITIZE_NUMBER_INT);
// Damit wird alles entfernt, was keine Zahl ist.
• Filtern Sie Spam und "schlechte Wörter" durch eigene Funktionen
Siehe » Badwordfilter
• Verwenden Sie switch/case wenn Sie eine Navigation oder DatenbankAnweisungen über $_GET oder per $_POST steuern wollen.
Siehe » Anweisungen über einen Link senden
http://webbausteine.de/blog/php/sicherheit.php
switch ($_POST["do"]) {
case "delete":
$do = "delete";
break;
case "reset":
$do = "reset";
break;
case "edit":
$do = "edit";
break;
default:
$do = "none";
}
• Beim Erstellen von Filterfunktionen ist das „Whitelisting” bestimmter Zeichen,
also das explizite Zulassen, stets sicherer als das „Blacklisting”, also das explizite
Verbieten, weil es nur selten gelingt, wirklich alle potenziell problematischen
Werte zu erfassen.
$whitelist = array("delete", "reset", "edit");
if (in_array($_GET["do"], $whitelist)) {
...
}
• Lassen Sie sich lediglich den reinen Dateinamen mit $_GET übermitteln und
setzen den Verzeichnispfad fest in der PHP-Datei ein.
<?php
$verzeichnis = "/ein/anderes/verzeichnis" . basename($_GET["datei"]) . ".php";
if (file_exists($verzeichnis)) {
include $verzeichnis;
}
?>
• Dateipfad prüfen
if (strpos($_GET['dateiname', '..') { …
Überprüfen auf einen
Verzeichniswechsel.
if (preg_match("=daten/=", $_GET["dateiname"])) { …
Ist das
Verzeichnis
„daten/” vorhanden.
• Dateipfad, Dateiname und Dateiendung (extension) ermitteln.
$pfad = pathinfo("/www/htdocs/index.php");
echo $pfad["dirname"] .
$pfad["basename"] .
$pfad["extension"];
Maskieren – das Entschärfen von Metazeichen
Das Maskieren bezeichnet das Entwerten von Metazeichen, so dass diese ihre
besondere Funktion verlieren. Dies geschieht entweder durch setzen eines
zusätzlichen Maskierungszeichens oder durch Ersetzten dieser Zeichen. Das
Maskieren ist immer dann notwendig, wenn Werte unbekannten Typs oder
Formats (es fand also keine angemessene Validierung oder Filterung statt oder es
http://webbausteine.de/blog/php/sicherheit.php
können immer noch Metazeichen enthalten sein) an ein Subsystem (z.B.: MySQL)
übergeben oder an den Client (Browser) ausgegeben werden.
• Bauen Sie dazu Maskierungen wie zum Beispiel:
mysql_real_escape_string($_POST["name"])
in Ihr Script mit ein.
Oder
quotemeta($tring)
, der Inhalt von $tring wird mit einem Rückstrich
("Backslash", \) vor jedem Vorkommen von . \ + * ? [ ^ ] ( $ ) versehen
("quoten") und zurückgegeben.
• Verwenden Sie für HTML-Ausgaben htmlspecialchars() oder die urlencode()Funktionen (bei URL-Komponenten).
• Inhalte ersetzen
In diesen Beispiel werden deutsche Umlaute ersetzt.
$trans = array("Ö" => "&Ouml;",
"ö" => "&ouml;",
"Ä" => "&Auml;",
"ä" => "&auml;",
"Ü" => "&Uuml;",
"ü" => "&uuml;",
"ß" => "&szlig;");
$_POST["text"] = strtr($_POST["text"], $trans);
Oder mit
str_replace(array("1", "2", "3"), array("eins", "zwei",
"drei"), $_POST["text"]);
• Bei MySQL mit Hochkommata arbeiten
… WHERE id='". $_POST["text"] . "'
…
• Zahlenwert in einen Integer (Datentyp) umwandeln
$limit = (int) $_POST["limit"];
Verzeichnisse und Dateien mit .htaccess sperren
Zugriff auf Dateien sperren (nur include, require, etc. zulassen).
Verschieben Sie alle Dateien, die nur über das PHP-Script
aufgerufen werden sollen, in ein Verzeichnis. Innerhalb dieses
Verzeichnis stellen Sie eine Textdatei mit folgendem Inhalt ein (beim Apache heißt
diese Datei „.htaccess”) mit folgender Syntax aus:
Order Deny,Allow
Deny from all
Das „Order Deny,Allow” heißt, dass die „deny” (Verbots) Regel vor der „allow”
(Erlaubnis) Regel abgearbeitet wird.
Eigene Fehlerseiten definieren *
ErrorDocument 401 http://www.domain.xy/401.html
ErrorDocument 403 http://www.domain.xy/403.html
ErrorDocument 404 http://www.domain.xy/404.html
(401 = Unauthorized, 403 = Forbidden, 404 = File Not Found, » Server
Fehlermeldungen)
Oder alle Fehlermeldungen vom Apache einfach zur Startseite weiterleiten. Die
Datei „.htaccess” sollte im obersten Verzeichnis ihrer Webpräsenz liegen.
http://webbausteine.de/blog/php/sicherheit.php
* Es kann passieren, dass die Sache nicht funktioniert. Dann hat vielleicht Ihr Provider die
Möglichkeit des Anlegens von .htacess-Dateien auf dem Server unterbunden.
• Bilder schützen
Bilder / Grafiken und andere Dateien durch das direkte verlinken von anderen
Webseiten schützen.
So sind Sie sicher, das Ihre Bilder nicht direkt verlinkt werden und unerwünschter
Traffic (Datentransfer) erzeugt wird.
<Files ~ "\.(gif|jpe?g|png|zip)$">
ErrorDocument 403 http://www.domain.xy/bilder/bilderdieb.png
SetEnvIfNoCase Referer "^http://www.domain.xy" local_ref=1
SetEnvIfNoCase Referer "^http://domain.xy" local_ref=1
SetEnvIfNoCase Referer ^$ local_ref=1
Order Allow,Deny
Allow from env=local_ref
</Files>
Das Verzeichnis Ihrer Domain eintragen!
Siehe: » Bilder vor direktem Aufruf schützen
• PHP in HTML-Dateien verstecken!
Eine Möglichkeit ist mittels der .htaccess-Direktive so zu konfigurieren, dass
dieser verschiedene Dateitypen (z.B.: .htm) durch PHP parst.
# HTML-Dateien parsen
AddType application/x-httpd-php .htm .html
Sie müssen dann Ihre PHP-Dateien nach den obigen Dateierweiterung
umbenennen.
• Verzeichnislisting (Directory Indexing, Verzeichnis-Browsing)
Verzeichnislisting ist eine Funktion des Webservers, die, wenn die übliche
Standarddatei (index.html, home.html, default.htm) fehlt, automatisch alle
Dateien im Verzeichnis zeigt, dann kann das Listing Informationen enthalten, die
nicht für die Öffentlichkeit bestimmt sind.
Verzeichnislisting verhindern
DirectoryIndex index.php index.html
A) Fügen Sie in allen Verzeichnissen eine index.php oder index.html
Inhalt der index-Seite: Entweder ganz normaler Inhalt oder eine Weiterleitung
(mit Link, Meta-Tag oder über PHP-header()) zur gewünschten Seite. Somit sind
auch Verweise auf Verzeichnisse möglich (www.websei.de/info/bilder)
B) Sie können in der .htaccess-Datei festlegen, ob der Apache einen Fehler
zurückgeben soll, wenn sich keine Startseite in einem Verzeichnis befindet, oder
ob er den Inhalt des Verzeichnisses ausgeben soll.
# Inhalt ausgeben:
Options +Indexes
# oder Fehler ausgeben:
Options -Indexes
C) Möglicherweise bietet Ihr Webspace-Provider eine Option an, die es erlaubt
Verzeichnislisting abzuschalten.
http://webbausteine.de/blog/php/sicherheit.php
Chmod - Lese- und Schreibrechte vergeben
Mit dem Befehl Chmod (englisch: change mode) werden im UNIX Umfeld Lese-,
Schreib- und Ausführungsrechte von Dateien und Verzeichnisse gesetzt. Viele
Webserver, auf denen Ihre Daten liegen, laufen mit UNIX.
chmod ("/verzeichnis/datei", 0644);
• Durch das falsche setzen von Chmod können unberechtigte Benutzer (vom
selben Server) Zugriff auf Ihre Dateien erhalten, beachten Sie diesen Umstand
und seien Sie entsprechend vorsichtig. Die Berechtigungen Ihres obersten
Verzeichnisses sollten Sie deshalb niemals ändern, bzw. niemals mit vollen
Rechten (Chmod 777) versehen. Mit dem „obersten Verzeichnis” ist Ihr AccountStart-Verzeichnis gemeint.
Mehr dazu unter » Schreib- und Zugriffsrechte » CHMOD-Kalkulator(Chmod richtig
einstellen)
Sicherheitsoptionen in der php.ini
Ein Feature von PHP zur Erhöhung der Sicherheit ist die Konfiguration von PHP mit register_globals = off. Mit Deaktivierung der
Möglichkeit, irgendeine vom Benutzer übertragenen Variable in den
PHP Code zu injizieren, können Sie die Anzahl „vergifteter” Variablen reduzieren,
welche ein potentieller Angreifer zufügen könnte.
• allow_url_fopen = off legt fest, ob man Dateien öffnen kann (z.B. mit fopen
()) die nicht auf dem Server liegen.
• allow_url_include = off sorgt dafür, dass PHP-Skripte nur lokale Dateien des
Servers einbinden können (ab PHP 5.2).
• safe-mode = on bewirkt unter anderem, dass der PHP-Prozess nur noch auf
Dateien und Verzeichnisse zugreifen darf, die dem Nutzer gehören.
• magic_quotes_gpc = on escaped alle Single-quotes ('), Double quotes (") ,
Backslashes (\) und NULL-Zeichen automatisch mit einem Backslash.
• phpinfo() Zeigt eine grosse Anzahl von Informationen über die aktuelle
Konfiguration von PHP an. Unter anderem die Optionen während des Kompilierens
und die Erweiterungen, die PHP Version, Informationen über den Server, die PHP
Umgebung, Version und Informationen zum Betriebssystem, Pfade, Haupt- und
lokale Werte der Konfigurationsoptionen.
<?php phpinfo(); ?>
Passwörter – der Schlüssel zu Ihren Daten
Schützen Sie Ihre Formulareingaben, erlauben Sie Einträge nur über eine
Authentifizierung für Berechtigte (Passwort-Abfrage).
• Verschlüsseln Sie alle Passwörter die Sie speichern wollen.
$passwort = md5("Passwort");
oder
$passwort = sha1("Passwort");
• Verwenden Sie kryptische Passwörter
Eigentlich sollte man das nicht mehr erwähnen müssen: Passwörter für Web- oder
Datenbankserver, die Sie in einem Lexikon finden können, sind so gut wie
http://webbausteine.de/blog/php/sicherheit.php
geknackt.
Die „billigsten” Passörter sind: passwort, password, user, admin, Vorname,
Nachname, Name der Homepage, Thema der Homepage, …
• Automatische Texteingabe in Formularfeldern verhindern.
Moderne Browser haben eine autom. Eingabefunktion die schon einmal
eingegebene Daten in ein Formularfeld wieder einfügen. Es gibt Situationen, in
denen es sinnvoll ist, das autom. ausfüllen zu verhindern, wenn zum Beispiel
jemand anders vor dem PC sitzt.
<form autocomplete="off">
oder direkt im HTML-Tag
<input
type="text" autocomplete="off">
(Leider noch nicht W3C gemäß, dies soll
sich aber mit „HTML5” ändern).
Dateiupload – Fremde Daten auf dem Server
Lässt man dem Besucher die Möglichkeit Dateien hochzuladen, so muss
gewährleistet werden, dass diese Dateien nicht auf das restliche System
anwendbar sind. Das funktioniert beispielsweise in dem man nur bestimmte
Dateitypen erlaubt. Das Problem ist, dass jemand beispielsweise eine PHP-Datei
hochladen könnte um diese dann extern aufzurufen, das würde dazu führen, dass
jene Datei auf das restliche System eingreifen könnte.
• Überprüfen des » MIME-Types und der Dateigröße
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 20000)) { …
• Es ist sinnvoll zu prüfen, ob die hochgeladene Datei auch wirklich ein Bild ist.
Dafür kann man die Funktion
getimagesize() verwenden. Handelt es sich um
ein gültiges Bild, gibt die Funktion ein Array mit Informationen über das Bild
zurück. Ansonsten wird der boolsche Wert "FALSE" zurückgegeben.
if (getimagesize($_FILES["file"]["tmp_name"] ) {
echo "Die Datei ist ein Bild!";
}
• Verschieben Sie die hoch geladene Datei in ein anderes Verzeichnis mit
begrenzten Schreibrechten (Chmod) und geben Sie der Datei einen neuen Namen.
• Bieten Sie eine Upload-Möglichkeit möglichst nicht öffentlich für Jedermann an,
sondern erlauben Sie das nur über eine Authentifizierung für Berechtigte.
CAPTCHAs – den Schlüssel im Bild!
(CAPTCHA = Completely Automated Public TuringTest to Tell
Computers and Humans Apart) Vor einiger Zeit hat es sich
weiträumig durchgesetzt, sog. CAPTCHAs zu verwenden. Hierfür
werden fast immer Zahlen oder Wörter möglichst unleserlich in einem Bild
dargestellt, das vermeintlich nur von Menschen entziffert werden kann.
Durch die Eingabe der Zahl bzw. des Wortes im Klartext wurden Menschen von
Maschinen unterschieden und Eingaben von letzteren abgewiesen. Es gibt bereits
spezialisierte Programme, die grafische CAPTCHAs verschiedenster Ausprägungen
knacken oder sich auch bei verbreiteten Webforen automatisch registrieren, die
http://webbausteine.de/blog/php/sicherheit.php
Antwort-E-Mail auswerten und danach mit einem regulären Benutzerkonto
Beiträge schreiben. Zur Zeit wird auch an die Verwendung von Video-CAPTCHAs
gearbeitet.
• Andere Möglichkeiten: Speicherung der IP-Adresse; Speicherung von
Cookies;
Ändern des Namens im Input-Tag; Zeitabhängige eingaben; Rechenaufgabe vom
Benutzer ausfüllen lassen; Versteckte Eingabefelder (mit CSS); Einen
Bestätigungs-Link per E-Mail senden (Zeitabhängige Aktivierung); Formulare mit
AJAX; Formular absenden mit JavaScript (onClick="form.submit()"); … Der
Fantasie sind keine Grenzen gesetzt, solange der Besucher mit macht ;)
Datei robots.txt – Infos für Webcrawler
Beim Auffinden einer Webseite von einem Webcrawler wird zuerst die Datei
„robots.txt” (kleingeschrieben) gelesen. In dieser Datei kann festgelegt werden,
ob und wie die Webseite von einem Webcrawler besucht werden darf.
Die Datei robots.txt ist eine Textdatei in einem einfach lesbaren Format.
# Diese Verzeichnisse/Dateien sollen nicht durchsucht werden
User-agent: *
Disallow: /geheim.php
Ein Ausgrenzen bestimmter Teile einer Webpräsenz durch robots.txt garantiert
<meta
keine Geheimhaltung. Genauso wenig schützt der Meta-Tag
name="robots" content="noindex" />
davor.
Fingerabdruck – Was der Browser verrät
Wenn man mit einem Browser im Internet surft, wird meist mehr verraten, als
$_SERVER["HTTP_USER_AGENT"];
Beispielsweise:
dem Besucher lieb ist.
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) Auch diese Infos
können via Browser manipuliert werden.
• Richtige Browser sollten immer einen User-Agenten mitschicken, also selbst
bekanntgeben, wer sie sind. Ist dies nicht der Fall, ist der Besucher meist ein Bot
(Webcrawler).
• Den USER_AGENT Mozilla auszusperren sollte man tunlichst vermeiden, da die
meisten Browser sich als Mozilla identifizieren.
Sicherheitslücke: Fehlermeldungen
Lassen Sie PHP oder MySQL-Fehlermeldungen nie im produktiven
Einsatz anzeigen. Angreifer gewinnen durch diese Fehlermeldungen
hilfreiche Tipps! Anzeige von: Pfad und Name der Datei, ScriptFehler und Zeilennummer. Solange man seinen Quelltext debuggen muss, ist
dieser Ansatz zu begrüßen, doch sobald die Webseite in der finalen Fassung
vorliegt, ist der Einsatz von error_reporting(), mysql_error() etc. eher als
eine Sicherheitslücke zu bezeichnen.
• Die folgende Anweisung verhindert, dass Angreifer gezielt Fehlermeldungen
provozieren können. error_reporting(0); Siehe: » PHP-Fehlermeldungen.
http://webbausteine.de/blog/php/sicherheit.php
• Kommentare im HTML-Quelltext
Eine Schwachstellle liegt vor, wenn eine Website sensible Daten zum Beispiel
Kommentare der Entwickler, die einem Angreifer helfen das System zu
missbrauchen, ausgibt.
Sicherheitslücke: Cross-Site Scripting (XSS)
Wie Formulare manipuliert werden können
Manipulationen von Formularen ist einfacher als manch einer sich das denkt. Die
einfachste Möglichkeit, ein Formular zu manipulieren, ist, den HTML-Quellcode des
Formulars zu kopieren und in einer lokalen Datei zu speichern. Diese kann dann
beliebig verändert werden. Dadurch ist es auch möglich, dass Schadcode dort
injiziert wird, wo es im Originalformular gar nicht möglich war (beispielsweise bei
versteckten Formularelementen, Auswahllisten, Checkboxen etc.).
PHP_SELF und Cross-Site-Scripting
Das superglobale Array $_SERVER beinhaltet verschiedene Informationen über die
Ausführungsumgebung und den Server. Sie umfasst unter anderem das Element
$_SERVER['PHP_SELF']. Diese global verfügbare, vordefinierte Variable liefert den
Dateinamen des jeweiligen Skriptes, welches gerade ausgeführt wird, wie zum
Beispiel echo $_SERVER['PHP_SELF']
• Die einfachste Gegenmaßnahme beim Einsatz von PHP_SELF besteht darin, die
Variable immer zu bereinigen.
echo
filter_var($_SERVER['PHP_SELF'],
FILTER_SANITIZE_STRING);
(PHP 5)
• Verwenden Sie anstelle von $_SERVER["PHP_SELF"]
["SCRIPT_NAME"] oder gleich den Dateinamen.
besser
$_SERVER
Sicherheitslücke: Kontaktformular (E-Mail-Header-Injection)
Die "E-Mail-Header-Injection" ist eine Methode, E-Mail-Kopfzeilen über ein
Kontaktformular-Skript in eine E-Mail zu "injizieren". Spammer können auf diese
Art Kontaktformular-Sendeskripte zum massenhaften Verteilen von Spam
missbrauchen. Besonders ärgerlich für den Besitzer des Kontaktformulars ist, dass
Spammer seine E-Mail-Adresse als Absender des Spams angeben können.
• Gegenmaßnahmen siehe » Filtern – das Trennen von Gut und Schlecht
• Mehrere E-Mails per BCC verschicken
In einer BCC-E-Mail (Blind-Carbon-Copy) finden Viren höchstens zwei E-MailAdressen. In einer CC-E-Mail (Carpon-Copy) können es buchstäblich Hunderte von
Adressen sein. CC-E-Mails mit vielen E-Mail-Adressen sind ein gefundenes Fressen
für Spammer. Mit BCC-E-Mails tragen Sie also einen Beitrag zur Bekämpfung von
Spam bei.
Sicherheitslücke: PHP Referrer
Der Referrer ist beliebig manipulierbar aber an sich ungefährlich. Schaden
anrichten kann er wenn das Auswertungsscript anfällig z.B. gegen HTML-Injection
ist. Manche Webseiten führen irgendwo auf der Seite eine Liste: „verlinkt von”
http://webbausteine.de/blog/php/sicherheit.php
Wenn dort ungeprüft der Referrer verwendet wird kann man einen Referrer in der
Art:
<script type="text/javascript">location.href="http://SeiteMitVirus.xy"</script>
einschmuggeln. Und künftig wird jeder Besucher der Seite (sofern Javascript aktiv
ist) auf http://SeiteMitVirus.xy umgeleitet.
• Wenn Sie mit dem Referrer arbeiten, dann setzen Sie strip_tags() dazu ein
um HTML-Spam im Referrer zu löschen.
• Referrer nicht zu sicherheitsrelevanten Zwecken auf einer Website verwenden.
Sicherheitslücke: Fremde Inhalte
Viele Webseiten haben auf Ihrer Seite Inhalte von anderen Seiten die z.B.: das
Wetter, aktuelle News, Werbebanner etc. anzeigen, diese werden oft als
JavaScript, Frame, Flash oder XML-Datei bereit gestellt. Der Betreiber hat hier
wenig Möglichkeiten um schadhaften Code zu filtern.
• Wenn Sie eine Log-in-Seite haben, sollten Sie auf die Anzeige fremder
Inhalte verzichten.
• CSS und JavaScript binden verlinkte Grafiken auch mit einer anderen
Dateiendung ein.
background-image: url(datei.php);
Was auf der einen
Seite nützlich ist kann auch eine Gefahrenquelle sein.
Sicherheitslücke: Ajax und XMLHttpRequest
Der Begriff Ajax steht für „Asynchronous Javascript and XML” und bezeichnet ein
Konzept der asynchronen Datenübertragung zwischen einem Server und dem
Browser. Die Besonderheit dabei ist, dass es damit möglich ist, innerhalb einer
HTML-Seite eine HTTP-Anfrage durchzuführen, ohne die Seite komplett neu laden
zu müssen.
Die Kombination aus massivem Javascript-Einsatz und Interaktivität bringt
zahlreiche Gefahren mit sich, die sowohl für Betreiber als auch Benutzer von Web2.0-Applikationen fatale Folgen haben können. Über geschickte Eingaben kann ein
Angreifer zum Beispiel die Nutzerdatenbank manipulieren, einen Server für
längere Zeit lahm legen oder Inhalte verändern.
• JavaScript sollten Sie niemals als Sicherheitsmaßnahme zur Validierung der
Formulareingabe nutzen, weil diese Methode leicht ausgehebelt werden kann.
Verwenden Sie JavaScript nur um den Benutzer auf seine Fehler im Formular
hinzuweisen.
Sicherheitslücke: MySQL-Datenbank
SQL Injectionen gehören zu den gefährlichsten und weitverbreitesten Fehlern bei
Webanwendungen. Besondere Bedeutung fällt dabei der Datenbank „mysql” zu.
Hier werden sämtliche Berechtigungen gespeichert. Fällt diese Datenbank in
fremde Hände, ist es für einen Neugierigen ein leichtes, mit der richtigen
Kombination aus Host, Benutzerkennung und Passwort unbemerkt Daten
auszuspionieren oder diese zu manipulieren.
http://webbausteine.de/blog/php/sicherheit.php
• Das maskieren von Sonderzeichen ist ganz wichtig als Schutz vor so genannten
SQL-Injektions. Bei einer SQL-Injektion versucht der Angreifer, eigene
Datenbankbefehle einzuschleusen. Die Ziele dabei sind, Zugriff auf geschützte
Bereiche zu erhalten, weitere Daten von anderen Kunden zu sehen oder einfach
nur Schaden anzurichten.
• Ein Angreifer, der mit einem Formular zum Einloggen konfrontiert wird,
spekuliert über die Weise, wie die Abfrage zur Validierung des Benutzernamens
und des Passwortes funktioniert. Ein Blick in den HTML-Quelltext gibt meist schon
zu viel preis. Besonders leicht hat es der Angreifer, wenn die gewählten Namen
leicht zu erraten sind, etwa wenn der Benutzername in der Variable
$benutzername und das Passwort in der Variable $passwort gespeichert werden
und die zugehörigen Datenbankfelder genauso heißen.
Sicherheitslücke: Datei-. und Verzeichnisnamen
Viele Datei-. und Verzeichnisnamen laden zum „hacken” gerade zu ein: login,
intern, secure, geheim, privat, …Verzichten Sie lieber auf solche und andere
auffällige Namen.
» 10 Regeln zu Dateinamen
• Der Inhalt der Seite, falls diese durch eine Suchmaschine indexiert wird, kann
Text enthalten der nicht für eine Indexierung bestimmt ist. Abhilfe schafft hier »
robots.txt (die Suchmaschinen müssen sich aber nicht unbedingt daran halten!)
oder ein Verzicht auf bestimmte Schlagwörter.
Halten Sie Ihren Code unter Verschluss!
Wenn Sie „öffentlichen” Code verwenden (z.B. aus Skriptarchiven),
gehen Sie das Risiko ein, dass systematisch nach diesem Code
gesucht werden kann.
Wenn Sie Ihren eigenen Code veröffentlichen (z.B.: in Foren), gehen Sie das
Risiko ein, dass potentielle Hacker darin gezielt auf die Suche nach Ihren kleinen
Sünden gehen.
Wenn Sie öffentlichen Fremdcode verwenden wollen, kann sich die Umbenennung
der Skripte bezahlt machen.
➜Hier finden Sie keinen fertigen Code um Ihre Website zu schützen, dieser muss
für jede Seite individuell angepasst werden.
Formular-Spam – Kostenlose Werbung
Hier weitere Tipps zu den oben genannten Möglichkeiten um Formular-Spam
(Kommentar-Spam) zu vermeiden:
• Enthält das Mitteilungsfeld sehr viel HTML-Code oder mehrere URLs, handelt es
sich meistens um Werbung if (substr_count($_POST["eingabe"], "http:")
> 3 ) { …
• Enthält das erste (in der Regel einzeilige) Formularfeld Zeilenumbrüche, deutet
das auf einen Versuch von E-Mail Header Injection↗ hin.
if (substr_count($_POST["email"], '\n') > 0 ) { …
if (substr_count($_POST["email"], '@') > 1 ) { …
http://webbausteine.de/blog/php/sicherheit.php
• Nach dem senden des HTML-Formulars stellen Sie die Informationen nochmals
dem Benutzer zur Bestätigung zusammen (Vorschau). Erst Durch Betätigung
mittels Formulars wird dann eine Mail ausgelöst.
• Speichern Sie die Formulardaten die Besucher machen in einer Datei ab. Damit
besteht die Möglichkeit, zu erkennen, wann Spamversuche stattfinden. Bei
„Spam” werten Sie die Datei aus und ergreifen Gegenmaßnahmen.
• Verwenden Sie in Ihrem Forum oder Blog BBCode (Bulletin Board Code) statt
HTML. Diese können anders als HTML-Tags keine Attribute wie zum Beispiel
<img src="bild.gif" onclick="location.href='seite.xy';">
enthalten.
Mehr Infos zum BBCode auf » de.wikipedia.org/wiki/BB_Code↗
• Prüfen Sie ob eine doppelte Eintragung durch falsche bzw. mißbräuchliche
Browserbenutzung (z.B.: „Reload”) möglich ist und treffen Sie dann
entsprechende Vorkehrungen (zum Beispiel eine » Floodsperre) bei der
Konstruktion der Datenverarbeitung.
Formulare – die Fehlerquelle schlechthin
Fehleingaben in Formularen sind immer möglich und wenn es sich
nur um Schreibfehler des Benutzers handelt.
• Vermeiden Sie Fehlerquellen, zum Beispiel: Eingabe eines
bestimmten Datumsformats mit den Input-Tag. Verwenden Sie dafür
Auswahllisten, je eine für Tag, Monat und Jahr.
• Zukünftige Browser sollen mehr Eingabemöglichkeiten in Formularen bieten mit
HTML5 neue Eingabe-Elemente (Web Forms 2.0) Auch hier gilt es dann (trotz
Browser-Eingabewertprüfung) die Angaben serverseitig nochmals zu prüfen
(Siehe: » HTML-<input>-Element).
Tipps
• Geben Sie absichtlich falsche Werte ein — bricht das Script mit einer
Fehlermeldung ab oder kommt es zu irgendwelchen Fehlverhalten müssen Sie
diese korrigieren.
• Speichern Sie fehlgeschlagene MySQL-Queries, Parameter die durch die
Eingangsprüfung am Anfang des Skriptes durchgefallen sind und fehlgeschlagene
Anmeldeversuche in einem Logfile zusammen mit allen Daten, die Sie vom
Verursacher haben (IP-Adresse, Browser etc.pp.) ab, das hilft Ihnen dann
mögliche Sicherheitslücken zu beheben.
• Testen Sie Formulare gründlich auf Benutzbarkeit und Barrierefreiheit.
• Oft sind Formularfelder zu klein um die Daten vernünftig einzugeben.
• Formularfelder sollten nicht nebeneinander sondern untereinander stehen.
• Niemand füllt gerne Formulare aus.
Beschränken Sie die Angaben in den Formularen auf das nötigste (nur
Pflichtfelder). Wenn Ihr Formular mehr Daten als unbedingt nötig vom Benutzer
abfragt, dringen Sie zum einen zu stark in dessen Privatsphäre ein und machen
ihm zum anderen den Vorgang Formular ausfüllen unnötigerweise unbequem.
Beides sind Gründe für den Benutzer, das Formular nicht auszufüllen. Aus
datenschutz-rechtlichen Gründen ist das Abfragen von Benutzerdaten, die man
nicht unbedingt benötigt, sowieso recht heikel.
http://webbausteine.de/blog/php/sicherheit.php
• Formulare sollten sich nicht über viele Seiten erstrecken! Es gibt technische
Gründe die es unmöglich machen alle Eingabefelder auf einer Webseite zu haben.
Aber wenn es mehr als zwei Seiten auszufüllen gibt, so sollte man das dem
Besucher von Anfang an klar machen, indem man z. B. angibt: „Schritt 1 von 5”.
• Hilfedateien oder Anmerkungen neben dem Eingabefeld, sind geeignet, beim
Benutzer entstehende Fragen zu beantworten oder Unsicherheit abzubauen.
Schlusswort
Sicherheit ist ein fortlaufender Prozess, eine Schlacht und ein Kampf. Es ist Ihr
Job als Entwickler, sich über die neuesten Sicherheitstrends auf dem Laufenden zu
halten und Ihre Anwendungen gründlich zu testen, bevor Sie diese ausliefern.
Oftmals genügt es, einige wenige Sicherheitsregeln konsequent umzusetzen, um
die Anfälligkeit auf Attacken massiv einzudämmen und auch gegen zukünftige
Sicherheitslücken seitens PHP gesichert zu sein.
Kommentar eintragen
Sie vermissen auf dieser Seite wichtige Informationen oder haben Hinweise für
uns? Hier haben Sie die Möglichkeit uns Ihren Kommentar zukommen zu
lassen — Vielen Dank!
Name:
:)
;)
Bewertung:
:(
B
U
Sicherheitsabfrage:
I
S
QUOTE
8+5=
CODE
PHP
Vorschau
COLOR
SIZE
IMG
LINK
Kommentar eintragen
© 2013 Webbausteine.de - Nutzungsbedingungen - Kontakt & Impressum - Über diese Website
http://webbausteine.de/blog/php/sicherheit.php