PHP Script "sichern"

Hallo,

ich habe schon viel davon gehört, dass im internet schwache PHP Skripte “gehackt” werden und damit dann die Daten gestohlen bzw. gelöscht werden.

Ich bin gerade dabei, meine Beta Version fertig zu stellen und mache mir da schon so einige Sorgen. Es soll späte möglich sein, dass sich registrierte User einloggen können (bereits fertig) und dann Bilder in meine Galerie hochladen sollen (noch nciht fertig). Dazu sollen auch benutzerdefinierte Profile dazugehören, wo nur die Bilder des Nutzers angezeigt werden. aber ok, das geht zu weit.
Nun, wie kann ich meinen Quellcode so schreiben, dass es für andere Nutzer (und Cracker) nicht möglich ist, mein Script zu “hacken” und es zu mißbrauchen bzw. das ein user angemeldet ist und die Daten mit einfach Änderungen von anderen Usern bearbeitet/löscht?

Freundliche Grüße

Wenn Ihr den Quelltext meines (noch unsauber) programmierten Codes sehen möchtet, immer fragen. Ich will bloß nicht allzuviel auf einmal posten.

Hi,

mit am wichtigsten ist es, die eingaben der user abzusichern - das bedeutet also überall wo du $_GET und $_POST verwendest. hier findet sich oft sehr viel schadpotential.
wenn du etwas aus einem formular abfrägst achte darauf, dass du zb bei zahlen eine prüfung abziehst - für zb email-adressen gibt es in php sogenannte “filter” - einfach googlen, habe auch ich neulich erst den hinweis bekommen, sind echt gut.

knackpunkte sind auch stellen, an denen du SQL ausführst. hier kann ich pdos empfehlen. der eigentliche sinn ist, unabhängig vom typ der datenbank zu werden, weil du nicht mehr zb speziell mysql_query() aufrufen musst - allerdings steckt in dieser klasse wesentlich mehr potential: prepared statements. das bedeutet du musst nicht mehr irgendwelche zeichen escapen, auf ’ und " achten etc, etc. das alles wird sehr zuverlässig von eben jener klasse übernommen. damit wären sogenannte “SQL-Injections” erledigt.

hmm was gibt es noch für kritische zonen? datei-uploads natürlich. aber die zähl ich jetz mal zu benutzereingaben. interessanter sind urls: wenn du zb etwas includest und per get parameter ausliest –

example.com/index.php?seite=gaestebuch

– dann musst du auch hier aufpassen und per php prüfen, dass die person nicht “ausbricht”, zb –

example.com/index.php?seite=…/. … oerter.txt

– hier würde er auf einen eigentlich nicht erreichbaren unterordner mit kritischen daten zugreifen können.

ich denke das ist mit das wichtigste gewesen - wie gesagt, URLs, $_GET- und $_POST-Eingaben beachten, PDOs verwenden…

wem fällt noch mehr ein? ich finde das thema immer wieder spannend…

mfg
emil

Mir fallen noch DDOS Angriffe, die hinterlassen aber nur temporären schaden am Server, weil der dann langsamer ist, und hinterlässt z.B paar Millionen Einträge im Gästebuch, unterbinden kann man letzteres sehr gut mit Captchas oder Zeitlimits kombiniert mit Captchas.

Sonst hast du es auf dne Punkt gebracht

Bitte komplett durcharbeiten: wiki.selfhtml.org/wiki/Artikel:Kontextwechsel

Also, zum besseren verständnis und auf Deutsch (macht mir zwar nichts aus, das es englisch ist, aber sicher ist sicher, fehler passieren ^^)

Wenn ich zum Beispiel folgende Codes habe:

$con = mysql_connect('localhost', 'Benutzernam', 'Passwort') or exit(mysql_error()); mysql_select_db('DB-Name', $con) or exit(mysql_error()); (mein code zum verbinden mit der datenbank)

Kann ich sozusagen, anstatt mysql_connect([…]); einfach schreiben

Und dann würde er mit der Datenbank verbinden?

Und nun der zweite:

$sql = 'SELECT UserId FROM users WHERE UserName = \'' . $name . '\' AND UserPass=\'' . md5($pass) . '\''; if ( !$result = mysql_query($sql) ) { exit(mysql_error()); }

Ich gebs zu, den Teil hab ich noch gar nicht verstanden. Das sieht komplizierter aus als MySQL und scheint mehr die db zu belasten??? HILFE

Für die anderen Tipps bedanke ich mich natürlich.
Noch was hinzuzufügen: Man sollte doch immer den mysql_real_escape_string() bei eintragungen verwenden, stimmts?

[quote=“Adria”][]

$sql = 'SELECT UserId FROM users WHERE UserName = \'' . $name . '\' AND UserPass=\'' . md5($pass) . '\''; if ( !$result = mysql_query($sql) ) { exit(mysql_error()); }
[][/quote]das isn gutes Beispiel wie mans net macht xD Denn dort ist “name” einfach so übergeben [size=85](außer natürlich $name beinhaltet schon was sicheres)[/size]
Für MySQL nutzt man mysql_real_escape_string() ums abzusichern^^

Allgemein gilt die Regel: alles was vom User kommt ist potenziell falsch/gefährlich. Daher überprüfen, überprüfen, überprüfen. Dadurch haben auch keine Cracker ne Chance :wink:

[quote=“White-Tiger”][quote=“Adria”][]

$sql = 'SELECT UserId FROM users WHERE UserName = \'' . $name . '\' AND UserPass=\'' . md5($pass) . '\''; if ( !$result = mysql_query($sql) ) { exit(mysql_error()); }
[][/quote]das isn gutes Beispiel wie mans net macht xD Denn dort ist “name” einfach so übergeben [size=85](außer natürlich $name beinhaltet schon was sicheres)[/size]
Für MySQL nutzt man mysql_real_escape_string() ums abzusichern^^

Allgemein gilt die Regel: alles was vom User kommt ist potenziell falsch/gefährlich. Daher überprüfen, überprüfen, überprüfen. Dadurch haben auch keine Cracker ne Chance :wink:[/quote]

ja, weißt ich ^^
Das ist weiter oben in einer variable gelöst. Das ist nur ein grundscript was ich mir kopiert/heruntergeleladen habe und danach dann weitergearbeitet habe.

hi,

@emil: Sind $_GET und URLs (wie in deinem Beispiel) nicht das gleiche? Eigentlich ja schon :ps:

lg flo

//edit: vergessen abzuschicken seit paar std.

Wenn du PDO verwenden willst statt mysql_…, dann solltest du mal hier vorbeischauen:
strassenprogrammierer.de/php … p_387.html

@ryon: ja, prinzipiell schon. Ich wollte aber auch mal auf die unterschiedlichen anwendungsgebiete hinaus: viele denken nur daran, db-eingaben abzusichern, während includes und Ähnliches vernachlässigt werden.

Und nicht vergessen Ausgaben ebenfalls abzusichern. htmlspecialchars() etc.

wenn man alle eingaben korrekt absichert halte ich das eher für kontraproduktiv, da es nichts bewirken würde, außer die server zu belasten - es kann aber trotzdem eine gute ergänzende maßnahme sein, wenn man ganz sicher gehen will.

Unsinn.

Regel #1: Gespeichert werden immer Rohdaten.

Folgerung aus Regel #1: Vor der Ausgabe muss eine kontext-gerechte Behandlung erfolgen.