Werfen Sie einen Blick auf PDO und die vorbereiteten Anweisungen. Es würde Ihnen viel Zeit und Kopfschmerzen ersparen.
– jwueller
22. November 2010 um 8:50 Uhr
Warum benutzt du mysql_select_db() zweimal?
– jwueller
22. November 2010 um 9:02 Uhr
Warum verwendet heutzutage irgendjemand hirntote, dynamisch generierte Zeichenfolgen für SQL? (Die tatsächlich gültigen Anwendungsfälle sind sehr weit und dazwischen.)
Die MySQL-Verbindung. Wenn die Link-ID nicht angegeben wird, wird der letzte von mysql_connect() geöffnete Link angenommen. Wenn kein solcher Link gefunden wird, wird versucht, einen zu erstellen, als ob mysql_connect() ohne Argumente aufgerufen worden wäre. Wenn keine Verbindung gefunden oder hergestellt wird, wird ein Fehler der Stufe E_WARNING generiert.
Wie hier erklärt: Schützt mysql_real_escape_string() VOLLSTÄNDIG vor SQL-Injection?
Basierend auf Ihrem Code-Snippet haben Sie die Datenbank zweimal verbunden.
Daher hat mysql_set_charset keine Auswirkung auf das bereitgestellte echte Escape$_POST für Multibyte-Zeichen.
Anregung
den zweiten entfernen mysql_connect($db_host,$username,$password);
explizit hinzufügen $db_con beim tun mysql_real_escape_string
typ sehr gut erklärt. +1 für Ihre gute Erklärung und Links
– Awais Qarni
11. August 2011 um 13:05 Uhr
Update Oktober 2013: mysql_real_escape_string ist veraltet. Verwenden Sie mysqli_real_escape_string() oder PDO::quote()
– Pablofiumara
20. Oktober 2013 um 12:17 Uhr
Eine Anmerkung für die möglichen Leser. Diese “Antwort” erklärt nicht, wie die Datenbank gehackt wurde. Denn für den im OP bereitgestellten Code ist es unmöglich, etwas einzuschleusen. Keine der im verlinkten Beitrag erwähnten Kodierungen wird verwendet, und daher wird standardmäßig latin1 verwendet, was bedeutet, dass dieser Code unverwundbar ist.
– Ihr gesunder Menschenverstand
13. September 2016 um 9:02 Uhr
Es sieht nicht so aus, als ob der von Ihnen eingefügte Code einen geeigneten Angriff bietet. Ich würde dies untersuchen, indem ich die MySQL-Binärprotokolle nach der relevanten DROP TABLE-Anweisung scanne, um mir einen Zeitstempel zu geben. Dann können Sie diesen Zeitstempel verwenden, um nach Apache-Anforderungen zu suchen, die Sie damit korrelieren können.
Dann geht es nur noch darum, den Code in jeder Kandidatenanfrage sorgfältig zu prüfen, bis Sie es geschafft haben 🙁
Vielleicht haben Sie einen MySQL-Benutzer mit einem schwachen Passwort. Ich würde alle Passwörter ändern und prüfen, wer berechtigt ist, sich mit der MySQL-Datenbank zu verbinden. Sperren Sie Ihre Firewall, sodass nur benötigte Ports geöffnet werden (80.443?)
Heutzutage ist der Fernzugriff auf MySQL standardmäßig deaktiviert und wird normalerweise auch auf die weiße Liste gesetzt, es sei denn, Sie haben einen beschissenen Host.
– Cyber-Wache
22. November 2010 um 10:18 Uhr
remote access to MySQL is disabled by default – kann dies begründen? oder weitere Informationen dazu geben?
– ajreal
22. November 2010 um 10:20 Uhr
Wenn Sie den MySQL-Server installieren, wird der Fernzugriff, dh die Anmeldung von einem anderen Computer als dem Server, auf dem der MySQL-Daemon läuft, deaktiviert; das bedeutet, dass Sie es explizit zulassen müssen. Selbst wenn eine Person einen MySQL-Benutzernamen/ein Kennwort hat, kann sie diese nicht nutzen und sich anmelden, es sei denn, sie kann Code auf dem Remote-Computer ausführen. In diesem Fall ist die Sicherheit des gesamten Servers sowieso vollständig gefährdet … Wiederverwendete Passwörter für MySQL, FTP und SSH sind ein völlig anderes, wenn auch sehr bevorstehendes Problem, aber es hat nichts mit der Sicherheit von MySQL selbst zu tun.
– Cyber-Wache
22. November 2010 um 10:55 Uhr
Dies gilt zumindest für die Linux-Box NICHT, sondern wird stattdessen durch Berechtigungen gesteuert.
– ajreal
22. November 2010 um 12:15 Uhr
Die Tatsache, dass Ihre Datenbank kompromittiert wurde, bedeutet nicht, dass es eine SQL-Injektion gab. Wenn Sie möchten, können Sie das Zugriffsprotokoll freigeben, das genügend Hinweise darauf geben sollte, wo der Angreifer eingedrungen ist. Meine Vermutung wäre die lokale Dateieinbindung, wo er die Konfigurationsdatei eingebunden hat, oder vielleicht eine Art Schwachstelle bei der Codeausführung. Ohne weitere Informationen ist es jedoch nur eine Vermutung, es könnte genauso gut ein guter Social-Engineering-Job oder ein Phishing-Angriff gewesen sein …
Auf den ersten Blick haben Sie keine Öffnungen für einen SQL-Injection-Angriff gelassen. Ist dieser Codeauszug definitiv derjenige, in dem das Eindringen stattfindet?
Ich denke, dies geschieht über die PHP-Shell (Hintertür). Ist das ein Sharing-Host? Überprüfen Sie in diesem Fall, ob andere Websites auf demselben Server ebenfalls angegriffen werden oder nicht. Auf diese Weise können Sie feststellen, ob der Angreifer aus Ihrer Nachbarschaft auf Ihre Website gelangt. Um Websites auf Ihrem Server anzuzeigen, benötigen Sie einen umgekehrten IP-Scan.
11791800cookie-checkJemand hat meine Datenbank gehackt – wie?yes
stackoverflow.com/questions/1220182
– Haim Jewgi
22. November 2010 um 8:45 Uhr
Welchen Zeichensatz verwendet Ihre Verbindung?
– CDhowie
22. November 2010 um 8:45 Uhr
Werfen Sie einen Blick auf PDO und die vorbereiteten Anweisungen. Es würde Ihnen viel Zeit und Kopfschmerzen ersparen.
– jwueller
22. November 2010 um 8:50 Uhr
Warum benutzt du
mysql_select_db()
zweimal?– jwueller
22. November 2010 um 9:02 Uhr
Warum verwendet heutzutage irgendjemand hirntote, dynamisch generierte Zeichenfolgen für SQL? (Die tatsächlich gültigen Anwendungsfälle sind sehr weit und dazwischen.)
– Benutzer166390
23. November 2010 um 5:01 Uhr