Wo zu verwenden mysql_real_escape_string, um SQL-Injection verhindern?
Ich bin in Schwierigkeiten mit einer Gruppe von Hackern. Sie hackte meine Kunden paar mal, und mein client bekommt mehr angry 🙁 mein Klient verlor seine Datenbank (die hat Hunderte von Datensätzen), und musste Sie alle 🙁
nun bin ich nach etwas mehr Einführungen;
- Feste Datei-Berechtigungen
- geändert, ftp und host-login info
- gelöscht alle remote-mysql-Zugriffe
arbeitet jetzt auf SQL-Injection-Problem. Ich fügte hinzu, mysql_real_escape_string, um admin-panel login-Parameter. Also wo sonst soll ich das mysql_real_escape_string ? Ich habe einige E-Mail-Formulare auf der Website, ich glaube nicht, dass ich brauchen, um es hinzuzufügen...
Habe ich eine index.php als mainpage. Sollte ich irgendetwas für diese Seite verhindern, dass alle sql-injection-Angriff über eine url wie index.php?somesql=
?
Bitte beraten Sie mich! Ich Schätze so viel!!! 🙁
Beispiel:
Habe ich einen solchen code;
public function showDetails($id) {
//SQL Jobs Details
$this->sql_job = "SELECT * FROM jobs WHERE id=".mysql_real_escape_string($id);
$this->rst_job = mysql_query($this->sql_job);
$this->row_all = mysql_fetch_assoc($this->rst_job);
//SQL State
$this->sql_state = "SELECT title FROM state WHERE id=" . $this->row_all[$this->tbl_jobs['f4']];
$this->rst_state = mysql_query($this->sql_state);
$this->row_state = mysql_fetch_assoc($this->rst_state);
........
ist es genug, um zu verwenden mysql_real_escape_string für $id . nicht für $this->row_all[$this->tbl_jobs['f4']]
"SELECT * FROM jobs WHERE id=".mysql_real_escape_string($id) ist anfällig für sql-injection. $id="1 oder sleep(50)"
+1 zu Turm. mysql_real_escape_string ist nicht eine Magische Kugel, es ist nur eine string-escaping-Funktion und funktioniert nur, wenn es verwendet wird, in Anführungszeichen.
InformationsquelleAutor designer-trying-coding | 2010-02-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Grundsätzlich, jedes mal, wenn Sie einige unsichere Daten, (Benutzereingabe, Wert aus einer Datenbank, einer Datei oder einer externen website, D. H. alle Daten, die Sie nicht 100% sicher, dass es sicher ist) in eine SQL-Abfrage, sollten Sie sich entfliehen Sie mit mysql_real_escape_string. Beachten Sie, dass nach OWASP, diese Funktion ist nicht sicher für die Flucht dynamischen Tabellennamen (aber dies ist weit weniger verbreitet als "basic" user-input-insertion).
Ich schlage vor, Sie haben einen Blick auf die gesamte OWASP Artikel über SQL-injection, und auch durchsuchen Sie den rest der website. Es ist eine große Quelle von Informationen über die Sicherheit in web-Anwendungen.
IMO, ist die bevorzugte Art der Verhinderung von SQL-injection ist die Verwendung vorbereitete Anweisungen.
Bitte denken Sie daran, dass, wenn Sie wählen, um
mysql_real_escape_string()
es funktioniert nur, wennin einem string verwendet wird, ist begrenzt durch Anführungszeichen. Verwenden Sie Sie nie auf
jede nicht börsennotierte Werte. Dieser numerische Werte enthält; stattdessen, überprüfen Sie, dass der Benutzer-Eingabe ist eigentlich numerisch.
Du hast Recht, ich werde zu aktualisieren, meine Antwort mit Ihren Genauigkeiten. Danke!
InformationsquelleAutor Wookai
Die zwei größten Dinge zu tun, mit user-input werden
Eingangsfilter ist der Prozess der Umwandlung von Daten /[vor]/es ist die in der Datenbank gespeichert. Ausführung
mysql_real_escape_string()
fällt unter diesen Schritt (obwohl es bessere Möglichkeiten gibt zu desinfizieren die Benutzerdaten für die db einfügen), aber dieser Schritt kann auch das trimmen von Leerzeichen, Obszönitäten filtern, markup-Konvertierung und mehr.Output-Escaping kümmern, wenn senden von Nutzer-content an den browser, dass Sie nicht zulassen, dass bösartigen Verhalten. Dies bedeutet, dass die Ausführung
htmlentities()
oder einen anderen selektiven screening-Prozess.Gibt es andere Dinge, die Sie tun können, wie Ressourcen-Drosselung (DOS prevention), Formular-tokens (CSRF-Schutz), usw. Gehen Sie zu OWASP und anfangen zu Lesen.
InformationsquelleAutor Peter Bailey
Einer der Goldenen Regeln in der web-Entwicklung ist NIE (NIE!) trust user input. Daher überall, wo Daten in die Datenbank, rufen Sie mysql_real_escape_string().
Auch, um zu verhindern, dass böse Kunden in der Zukunft, sollten Sie regelmäßig ein backup Ihrer Datenbank. Wenn ich dein AUFTRAGGEBER wäre, würde ich wütend sein, jetzt.
Glück bei der Sicherung Ihrer Website.
InformationsquelleAutor Steven Mercatante
Der beste Weg, um zu verhindern, dass der SQL-Injektion mit der Verwendung von prepared statements und bind-Variablen. Welche version von MySQL benutzt du? Prepared statements sind verfügbar in 4.1 und höher.
InformationsquelleAutor shoover