PHP / SQL-Datenbank, die gute Praxis und Sicherheit abfragt

7

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.

    
Louis 05.05.2009, 21:28
quelle

6 Antworten

6

Meine Empfehlungen:

  1. ditch mysqli zugunsten PDO (mit mysql Treiber)
  2. verwenden PDO paremeterized vorbereitete Aussagen

Sie können dann Folgendes tun:

%Vor%

PROs:

  1. Kein manuelles Entkommen mehr, da PDO alles für Sie erledigt!
  2. Es ist relativ einfach, Datenbank-Backends plötzlich zu wechseln.

CONs:

  • Ich kann mir keine vorstellen.
Kris 06.05.2009, 11:31
quelle
9

Javiers Antwort, die den owasp-Link hat, ist ein guter Anfang.

Es gibt noch ein paar Dinge, die Sie mehr tun können:

  1. 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).

  2. 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 .

  3. 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.

  4. Legen Sie wichtige PHP-Verarbeitungsdateien in ein Verzeichnis wie / include. Weisen Sie dann allen IPs den Zugriff auf dieses Verzeichnis zu.

  5. 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.

  6. Bestimmte Header nicht zulassen ( Ссылка ). PUT nicht zulassen (wenn keine Dateiuploads erforderlich sind) / TRACE / CONNECT / DELETE-Header.

SteveGSD 05.05.2009 23:56
quelle
3

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.

    
Javier 05.05.2009 21:42
quelle
2

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.

    
Jonathan Maddison 06.05.2009 12:53
quelle
1

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%
    
Svish 06.05.2009 08:54
quelle
0

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.

    
PaulJWilliams 06.05.2009 08:47
quelle

Tags und Links