Ich bin also ein etwas erfahrener PHP-Entwickler und habe seit 2007 das verdammte Ding gemacht. Ich bin jedoch immer noch relativ zufrieden, wenn es darum geht, meine Anwendungen zu sichern. In der Art, dass ich nicht wirklich alles weiß, was ich weiß, könnte und sollte ich.
Ich habe die Sicherung von PHP-Webanwendungen abgeholt und lese meinen Weg durch, während ich die Dinge auf dem Weg testet . Ich habe einige Fragen für die allgemeine SO-Gruppe, die sich auf Datenbankabfragen beziehen (hauptsächlich unter mysql):
Beim Erstellen von Anwendungen, die Daten in eine Datenbank stellen, ist mysql_real_escape_string und allgemeine Überprüfung (is_numeric usw.) auf Eingabedaten genug? Was ist mit anderen Arten von Angriffen, die sich von der SQL-Injektion unterscheiden?
Könnte jemand gespeicherte Prozeduren und vorbereitete Anweisungen mit ein wenig mehr Informationen erklären als - Sie machen sie und rufen sie an. Ich würde gerne wissen, wie sie funktionieren, welche Validierung hinter den Kulissen stattfindet.
Ich arbeite in einer php4 gebundenen Umgebung und php5 ist vorerst keine Option. War sonst noch jemand in dieser Position, was haben Sie getan, um Ihre Anwendungen zu sichern, während all die coolen Kinder diese süße neue mysqli-Schnittstelle benutzen?
Was sind einige allgemeine gute Praktiken, die die Leute als vorteilhaft empfunden haben, Schwerpunkt auf der Schaffung einer Infrastruktur, die Upgrades und möglichen Migrationen standhalten kann (wie das Verschieben von php4 auf php5).
Hinweis: Hätte eine Suche rundherum nichts ähnliches finden können, das die PHP-Mysql-Sicherheit getroffen hat.
Meine Empfehlungen:
Sie können dann Folgendes tun:
%Vor%PROs:
CONs:
Javiers Antwort, die den owasp-Link hat, ist ein guter Anfang.
Es gibt noch ein paar Dinge, die Sie mehr tun können:
In Bezug auf SQL-Injection-Angriffe können Sie eine Funktion schreiben, die gängige SQL-Anweisungen wie "DROP" oder "DELETE * WHERE" wie folgt aus der Eingabe entfernt:
* $ sqlarray = array ("DROP", "oder 1 = 1", "union select", "SELECT * FROM", "Host auswählen", "create table", "FROM users", "users WHERE" ); *
Schreiben Sie dann die Funktion, die Ihre Eingabe für dieses Array überprüft. Stellen Sie sicher, dass die Inhalte in $ sqlarray nicht von den Benutzern eingegeben werden. (Vergessen Sie nicht strtolower zu benutzen, danke lou).
Ich bin mir nicht sicher, ob Memcache mit PHP 4 funktioniert, aber Sie können einen gewissen Spamschutz mit Memcache einrichten, indem Sie nur einen bestimmten Remote-IP-Zugriff auf die process.php Seite X in Y-Zeit erlauben .
Privilegien sind wichtig. Wenn Sie nur Einfügeprivilegien benötigen (z. B. Auftragsverarbeitung), sollten Sie sich mit einem Benutzer, der nur Einfüge- und möglicherweise Auswahlberechtigungen besitzt, bei der Datenbank auf der Bestellprozessseite anmelden. Das heißt, selbst wenn eine SQL-Injection ausgeführt wurde, konnten sie nur INSERT / SELECT-Abfragen durchführen und nicht löschen oder umstrukturieren.
Legen Sie wichtige PHP-Verarbeitungsdateien in ein Verzeichnis wie / include. Weisen Sie dann allen IPs den Zugriff auf dieses Verzeichnis zu.
Fügen Sie ein gesalzenes MD5 mit dem Agenten des Benutzers + remoteip + Ihrem Salt in der Sitzung des Benutzers hinzu und überprüfen Sie bei jedem Laden der Seite, ob sich das richtige MD5 in ihrem Cookie befindet.
Bestimmte Header nicht zulassen ( Ссылка ). PUT nicht zulassen (wenn keine Dateiuploads erforderlich sind) / TRACE / CONNECT / DELETE-Header.
Ich arbeite normalerweise nicht mit PHP, daher kann ich keine speziell auf Ihre Anforderungen zugeschnittene Beratung anbieten, aber ich schlage vor, dass Sie sich die OWASP-Seite ansehen, insbesondere die Top 10 der Schwachstellenberichte: Ссылка
Auf dieser Seite erhalten Sie für jede Schwachstelle eine Liste der Dinge, die Sie tun können, um das Problem auf verschiedenen Plattformen zu vermeiden (.Net, Java, PHP, etc.)
In Bezug auf die vorbereiteten Anweisungen arbeiten sie, indem sie der Datenbank-Engine mitteilen, wie viele Parameter und welche Typen während einer bestimmten Abfrage zu erwarten sind. Anhand dieser Informationen kann die Engine nachvollziehen, welche Zeichen Teil des eigentlichen Parameters sind und was nicht als SQL wie ein '(Apostroph) als Teil der Daten anstelle von' als String-Trennzeichen geparst werden. Sorry, ich kann keine weiteren Informationen zu PHP liefern, hoffe aber, dass dies hilft.
AFAIK, PHP / mySQL hat normalerweise keine parametrisierten Abfragen.
Die Verwendung von sprintf()
mit mysql_real_escape_string()
sollte ziemlich gut funktionieren. Wenn Sie geeignete Formatzeichenfolgen für sprintf()
verwenden (z. B. "% d" für Ganzzahlen), sollten Sie ziemlich sicher sein.
Ich mag mich irren, aber sollte es nicht ausreichen, mysql_real_escape_string
auf vom Nutzer bereitgestellten Daten zu verwenden?
es sei denn, es handelt sich um Zahlen. In diesem Fall sollten Sie sicherstellen, dass es sich tatsächlich um Zahlen handelt, indem Sie beispielsweise ctype_digit
oder is_numeric
oder sprintf
(mit %d
oder %u
, um Eingabe in eine Zahl zu erzwingen).
Es ist auch eine gute Idee, einen mysql-Benutzer für Ihre PHP-Skripte zu haben, die nur SELECT, INSERT, UPDATE und DELETE ausführen können ...
Beispiel von php.net
Beispiel # 3 Eine "Best Practice" -Abfrage
Die Verwendung von mysql_real_escape_string () um jede Variable verhindert SQL Injection. In diesem Beispiel wird die "Best Practice" -Methode zum Abfragen einer Datenbank unabhängig von der Einstellung "Magic Quotes" veranschaulicht.
Die Abfrage wird jetzt korrekt ausgeführt, und SQL Injection-Angriffe funktionieren nicht.
%Vor%
Verwenden Sie gespeicherte Prozeduren für alle Aktivitäten, die das Erstellen von Wrints an die Datenbank erfordern, und verwenden Sie Bindungsparameter für alle Auswahlvorgänge.
Tags und Links php mysql security sql-injection