2010-02-22 4 views
12

Ich habe Probleme mit einer Gruppe von Hackern. sie gehackten Website paar Mal meine Kunden, und mein Kunde bekommt mehr wütend :(mein Mandant seine Datenbank verloren (die Hunderte Datensätze hat), und hatte alles, was ich bin nach einigen mehr Einführungen :(Wo verwende ich mysql_real_escape_string, um SQL Injection zu verhindern?

jetzt zu betreten;

  • feste Dateiberechtigungen
  • geänderten ftp und Host-Login-Info
  • alle Remote-mysql greift
  • gelöscht

arbeitet nun an SQL-Injection-Problem. ich habe mysql_real_escape_ Zeichenfolge an Admin-Panel-Anmeldeparameter. Wo sonst sollte ich diesen mysql_real_escape_string verwenden? Ich habe wenige E-Mail-Formulare auf der Website, ich glaube nicht, dass ich dort hinzufügen muss ...

Ich habe eine index.php als Startseite. Sollte ich etwas für diese Seite tun, um irgendwelche SQL-Injektion Angriff über URL wie index.php?somesql= zu verhindern?

Bitte beraten Sie mich! Ich schätze so sehr !!! :(


zum Beispiel:.

ich einen solchen Code haben;

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 mysql_real_escape_string für $ id zu verwenden nicht für $ this-> row_all [$ this-> tbl_jobs ['f4']]

+2

Ich bin ein MSSQL-Typ, also hoffentlich das gilt - warum hat ein Website-Login sogar die Erlaubnis, etwas zu löschen? Wie für den Verlust einer Datenbank, wo sind die Sicherungen? –

+1

"SELECT * FROM jobs WHERE id =". Mysql_real_escape_string ($ id) ist anfällig für sql injection. $ id = "1 oder Schlaf (50)" – rook

+0

+1 zu Turm. mysql_real_escape_string ist keine magische Kugel, es ist nur eine String-Escaping-Funktion und funktioniert nur, wenn es in Anführungszeichen verwendet wird. – Cheekysoft

Antwort

13

Grundsätzlich jedes Mal, wenn Sie einige unsichere Daten (Benutzereingaben, Wert aus einer Datenbank, einer Datei oder einer externen Website, dh alle Daten, die Sie nicht sind 100% sicher, dass es sicher ist) in einer SQL-Abfrage sollten Sie es mit mysql_real_escape_string entkommen. Beachten Sie, dass diese Funktion according to OWASP nicht sicher für das Entweichen dynamischer Tabellenname ist (aber das ist weit weniger üblich als "grundlegende" Eingabe von Benutzereingabe).

Ich empfehle Ihnen, einen Blick auf die ganze OWASP article on SQL injection, und auch den Rest der Website zu durchsuchen. Es ist eine großartige Quelle für Informationen zur Sicherheit in Webanwendungen.

IMO, der bevorzugte Weg zur Verhinderung von SQL-Injektion ist die Verwendung prepared statements.

Bitte denken Sie daran, dass wenn Sie wählen, mysql_real_escape_string() zu verwenden, es nur funktioniert, wenn innerhalb einer Zeichenfolge verwendet wird, die durch Anführungszeichen begrenzt wird. Verwenden Sie es niemals unter nicht angegebenen Werten. Dies beinhaltet numerische Werte; Überprüfen Sie stattdessen, ob die Benutzereingabe tatsächlich numerisch ist.

+0

Nicht nur Benutzereingaben an sich. Alle Daten, die du als Parameter verwendest, können nicht absolut sicher sein (für alle Ewigkeit), dass sie keine Charaktere enthalten, denen du entkommen musst. Z.B. Wenn Sie (aus irgendeinem Grund) Daten aus der Datenbank ziehen und diese Daten in einer anderen Abfrage verwenden, müssen Sie keine Benutzerinteraktion ausführen, sondern müssen die Daten dennoch umgehen. Oder verwende vorbereitete Aussagen. – VolkerK

+0

Sie haben Recht, ich werde meine Antwort mit Ihren Genauigkeiten aktualisieren. Vielen Dank! – Wookai

3

Eine der goldenen Regeln der Web-Entwicklung ist NIE (immer!) Benutzereingaben zu vertrauen. Daher sollten Sie überall dort, wo Daten in die Datenbank gelangen, mysql_real_escape_string() aufrufen.

Um in Zukunft verärgerte Clients zu verhindern, sollten Sie Ihre Datenbank regelmäßig sichern. Wenn ich dein Kunde wäre, wäre ich jetzt wütend.

Viel Glück bei der Sicherung Ihrer Website.

+0

danke für die Antwort. Was ist mit dem Aufruf von Daten aus db? sollen wir auch in diesem Fall mysql_real_escape_string() benutzen? oder nur für Variablen in SQL zu Datenbank gehen? –

3

Der beste Weg, SQL-Injektion zu verhindern, ist die Verwendung von vorbereiteten Anweisungen und Bindevariablen.Welche Version von MySQL verwenden Sie? Vorbereitete Aussagen sind in 4.1 und höher verfügbar.

3

Die beiden größten Dinge, mit Benutzereingaben zu tun sind

  1. Eingangsfilterung
  2. Output Escaping

Eingangsfilterung ist der Prozess, der Daten/[vor] der Umwandlung/es in gespeichert ist die Datenbank. Das Ausführen von mysql_real_escape_string() fällt unter diesen Schritt (obwohl es bessere Möglichkeiten gibt, Benutzerdaten für die DB-Einfügung zu bereinigen), aber dieser Schritt kann auch das Beschneiden von Leerraum, Profanitätsfilterung, Markupkonvertierung und mehr umfassen.

Ausgabe Escaping ist vorsichtig, wenn Benutzerinhalte an den Browser gesendet werden, die kein bösartiges Verhalten zulassen. Dies bedeutet, dass htmlentities() oder ein anderer selektiver Screening-Prozess ausgeführt wird.

Es gibt andere Dinge, die Sie tun können, wie Ressourcendrosselung (DOS-Prävention), Formulartokens (CSRF-Schutz) usw. Gehen Sie zu OWASP und fangen Sie an zu lesen.

Verwandte Themen