2010-12-30 12 views
2

Also, welche Art von Dingen sollte eine Person mit PHP und MySql konzentrieren, um die Sicherheit zu maximieren.PHP-Sicherheitscheckliste (Injektion, Sitzungen usw.)

Dinge, die ich getan habe:
-mysql_real_escape_string alle Eingänge
-validate alle Eingänge nach em
-Placed Zufalls alpha Numerik vor meiner Tabellennamen
-50character Salz + RipeMD Passwörter

Heres zu entkommen, wo ich denke, dass ich schlafe:
-Ich weiß nichts über Sitzungen und sichern sie. Wie unsicher/sicher ist es, wenn alles, was Sie tun, ist:

session_start(); 
$_SESSION['login']= $login; 

und Kontrolle mit:

session_start(); 
if(isset($_SESSION['login'])){ 

-I gehört, etwas über andere Formen der Injektion wie Cross-Site-Injektion und was nicht .. - Und wahrscheinlich viele andere Dinge, von denen ich nichts weiß.

Gibt es eine "Checkliste"/QuickTut, um PHP sicher zu machen? Ich weiß nicht einmal, worüber ich mir Sorgen machen sollte. Ich bedauere es jetzt, dass ich CakePHP nicht mehr aufgebaut habe, da ich kein Profi bin.

Antwort

0

Es gibt mehrere Möglichkeiten der Hacker. Die erste ist, wenn ein tatsächlicher (oder falscher) Benutzer versucht, Lücken in Ihrer Software zu finden, um zu versuchen, Ihren Server zu beschädigen. Sie müssen die Escape- und Eingabeüberprüfung durchführen, um zu verhindern, dass die SQL-Injektion dies umgeht.

Das (oder ein) anderes ist ein Hacker, der versucht, eine Sitzung zu stehlen, um sich als ein anderer Benutzer auszugeben. Dadurch können sie Daten erreichen und ändern, zu denen sie nicht berechtigt sind.

SQL-Injektion wird mit mysql_real_escape_string behoben. Wenn Sie das verwenden und es richtig verwenden, müssen Sie keine Angst vor SQL-Injection haben. Es müssen keine zufälligen Zeichen den Tabellennamen vorangestellt werden. Dies macht Ihre Programmierung schwieriger und bietet keine zusätzliche Sicherheit. Sie könnten auch mysqli und parametrisierte Abfragen verwenden, die dieses Problem überhaupt nicht haben. mysqli kümmert sich um die Flucht für dich. Theoretisch könnten parametrisierte Abfragen sogar schneller ausgeführt werden, da die Abfragen effizienter zwischengespeichert werden können. In der Praxis ist dies jedoch nicht der Fall. Es ist erst seit MySQL 5.2, dass diese Abfragen überhaupt zwischengespeichert werden, aber immer noch nicht so effizient wie möglich. Das ist jedoch nichts, worüber Sie sich jetzt Sorgen machen müssen. Jede Lösung wird derzeit wahrscheinlich gut genug für Sie funktionieren.

Eine Sache, die Sie nicht tun sollten, ist, PHP-Code in benutzergenerierten Inhalten zuzulassen. Wenn Sie Benutzern das Eingeben von PHP erlauben, erlauben Sie ihnen, Ihre Anwendung zu unterbrechen und möglicherweise Ihre Datenbank zu modifizieren. Wenn ein Hacker es schafft, einen Benutzer/Inhalts-Editor zu imitieren, erhält er eine vollständige Toolbox, wenn Sie zulassen, dass der Inhalt PHP enthält.

Um zu verhindern, dass Sitzungen übersprungen werden, denke ich, dass es am besten ist, SSL zu verwenden. Wenn Sie nicht alle Ihre Seiten über SSL serversichern möchten, können Sie eine Sitzung in Cookies speichern, aber eine erneute Anmeldung (mit SSL) verlangen, wenn wichtige Änderungen vorgenommen werden.

+0

Hey. Danke für die ausführliche Antwort. Die Frage von mysql_real_escape_string kam für mich früher auf und als ich mir das Handbuch ansah, fühlte ich, dass es implizierte, dass es nur für bestimmte Arten von Injektionen funktioniert. Wenn ich es bei allen meinen Eingaben benutze, bin ich vor der Injektion sicher? Außerdem: Gibt es eine alternative Lösung für die Verwendung von ssl temporairly, bis ich es bekomme? – NoviceCoding

+0

Es funktioniert für SQL-Injektionen in Situationen, in denen Sie Eingabewerte in einer Abfrage verwenden. Wenn Sie zum Beispiel erlauben, etwas zu suchen, und Sie jemanden einen Wert in $ search eingeben lassen, können Sie eine Abfrage wie '$ query =" SELECT * FROM Seiten WHERE content LIKE '% $ search%' erstellen; "Das ist völlig in Ordnung es sei denn, jemand sucht nach "Kuh%"; Drop-Datenbank; - ". Scheint nicht wahrscheinlich? Vielleicht nicht .. Wie auch immer, das ist die Art von bösen Hacks, die Sie verhindern, abgesehen von einfachen Problemen, die auftreten können, wenn jemand nur nach etwas sucht, das ein '' 'enthält. :) – GolezTrol

+0

Soweit Alternativen für SSL, bin ich nicht der größte Experte bei diesem, so dass es am besten sein kann, wenn ich diese Frage mit einigen dummen Ideen nicht beantworten, die Sie überhaupt nicht profitieren können. Vielleicht überlegen Sie sogar, eine neue Frage zu stellen, da dies ein völlig anderes Problem als die SQL-Injektion ist. – GolezTrol

2

Sie können versuchen, eine Entführung zu vermeiden, indem Sie den User Agent testen.

So etwas:

if (isset($_SESSION['userAgent'])) { 
    if ($_SESSION['userAgent'] != md5($_SERVER['HTTP_USER_AGENT'])) { 
     // HACK !!! 
     // Kill the process or ask for authenticating 
    } 
} 
else { 
    $_SESSION['userAgent'] = md5($_SERVER['HTTP_USER_AGENT']); 
} 
+0

Dies wird nicht einen ernsthaften Hacker aus hyjacking Ihrer Sitzung beenden. – GolezTrol

+0

Golez was dann? – NoviceCoding

+2

Schauen wir uns das an: http://stackoverflow.com/questions/328/php-session-security Dort wird auch die UserAgent-Prüfung erwähnt, aber wie Sie an den Kommentaren sehen können, bin ich nicht die einzige jemand, der es für einen nutzlosen Scheck hält. Wenn die Überprüfung fehlschlägt, können Sie nur feststellen, dass Sie mit einem sehr dummen Hacker zu tun haben. – GolezTrol

1

Wenn Ihre Anwendung die Veröffentlichung von Inhalten erlaubt, sollten Sie bei der Anmeldung eine Verschlüsselung verwenden. SSL ist am besten natürlich, armer mans ssl verschlüsselt das Passwort mit JS, bevor er das Login-Formular abschickt.

Um Session-Hijacking zu vermeiden, binden Sie die Sitzung auf die IP-Adresse bei der Anmeldung (Speichern Sie ip bei der Anmeldung und vergleichen Sie mit jeder Anfrage).

Grüßen, // t

1

Für die Typen XSS und andere Injektionen, die hauptsächlich HTML und js Injektion der Schlüssel Sicherheit alle entkommen outputs.Everything Sie in HTML einfügen sollte für HTML entwertet werden, bedeutet nicht js oder HTML sollte vom Browser im Inhalt gesehen werden, der von etwas erzeugt wird, das direkt aus der Datenbank kommt.

Als ein Beispiel user_name, dass der Benutzer wie in einem Formular festgelegt, sollte keine HTML-oder Js-Code enthalten. Wenn jemand eine solche Sache injiziert, haben Sie ein Problem (und die einfachste Art zu injizieren ist die Eingabe des Suchformulars in den meisten Apps, wenn Ihre Suche auf der Antwortseite wiederholt wird). Daher sollten alle diese Ausgaben vor der Ausgabe ein htmlspecialchars() haben.

Hier sind einige nützlichen Links: