Wieso klappt dieses Script nicht?

SantaCruze

Erfahrenes Mitglied
Guten Abend :) Ich habe ein kleines Script um Nachrichten zu verschicken gebastelt, allerdings klappt es nicht. Ich beabsichtige eigentlich folgendes, bei der ersten SQL Anfrage prüft er ob der User Existiert, wenn ! Result nicht da ist soll er unter dem else einen neue SQL Anfrage als Insert machen , aber irgendwie prüft er nicht ob der User vorhanden ist sondern trägt immer ein. Vielleicht hat ja jmd nen Lösungsvorschlag oder nen Verbesserungsvorschlag.

PHP:
<?php
include ("connect.php");
$sql = "SELECT user FROM users WHERE user='".$_POST['an']."'"; 
$result = mysql_query($sql);
if (! $result)
{
echo "<font color='#FF6600' size='1' face='Verdana, Arial, Helvetica, sans-serif'><center>Es existiert kein User unter diesem Namen ! </center></font>";
}
else
{
$sql = "INSERT INTO `nachrichten` SET von='".$_SESSION['name']."',an='".$_POST['an']."',nachricht='".$_POST['text']."',datum='".date("d.m.y")."'"; 
$result = mysql_query($sql);
echo "<font color='#33FF00' size='1' face='Verdana, Arial, Helvetica, sans-serif'><center>Deine Nachricht hat den Empfänger erreicht! </center></font>";
}
include ("uebersicht.php");
?>
 
Hallo, probier es mal so.
Das Script habe ich nur in 2 Zeilen umgeändert, in Zeile 4 und 5, dies sollte folgendes ändern: Es wird eine Zahl ermittelt wie oft der Name in der Tabelle "users" liegt. Ist der Name nicht hinterlegt bekommt $result eine 0 und somit kann in der if -Bedingung auf kleiner als 1 überprüft werden. Ist $result eine 1 oder mehr, dann wird auch die Meldung nicht ausgeben.
PHP:
<?php
include ("connect.php");
$sql = "SELECT user FROM users WHERE user='".$_POST['an']."'"; 
$result = mysql_num_rows(mysql_query($sql));
if ($result < 1)
{
echo "<font color='#FF6600' size='1' face='Verdana, Arial, Helvetica, sans-serif'><center>Es existiert kein User unter diesem Namen ! </center></font>";
}
else
{
$sql = "INSERT INTO `nachrichten` SET von='".$_SESSION['name']."',an='".$_POST['an']."',nachricht='".$_POST['text']."',datum='".date("d.m.y")."'"; 
$result = mysql_query($sql);
echo "<font color='#33FF00' size='1' face='Verdana, Arial, Helvetica, sans-serif'><center>Deine Nachricht hat den Empfänger erreicht! </center></font>";
}
include ("uebersicht.php");
?>
 
Hi,

ich will dich darauf hinweisen, dass es eine riesige Sicherheitslücke ist, die POST Variable direkt in das SQL Statement einzubauen!

Damit kann ein geschickter Anwender so ziemlich alles auf deiner Datenbank machen.
Du solltest vorher deine POST Variable wirklich gut überprüfen!

Lg, Yanick
 
ich will dich darauf hinweisen, dass es eine riesige Sicherheitslücke ist, die POST Variable direkt in das SQL Statement einzubauen!

Damit kann ein geschickter Anwender so ziemlich alles auf deiner Datenbank machen.

Hi immer wieder liest man davon.Aber alle angeben bsp. Sql states die über Post angeführt werden funktionieren nicht.Einmal wird das Zeichen für ende der Sql anweisung übergeben und einfach eine 2 Anweisung drangehäng. (Das kann schon net funktionieren weil das php script eh immer nur 1 Sql befehl zulässt.)

Bei anderen Beispielen wird mit Abruch zeichen gearbeitet das das Sql befehl beenden soll und statt desen ein neuer Sql befehl gesendet wird.Oder mal die Hochkomma auser kraft gesetzt werden um andere Befehle einzuschleusen.Versuch man mal selbst so einen Befehl testweise in phpmyadmin auszufüren lassen. Dann kommt entweder eine fehler meldung.Oder man kann den Rest der Sql Anweisung nicht sinvoll ergänzen.Das mit den Abruch zeichen dürfte auch net so richitig gehen.(wird ignoriert)

Nun wollt ich mal wissen hab ihr es schon in einen Selbst test geschafft einen Sql Code in einer Select anweisung erfolgreich einzuschleusen wenn direkt das Post übernohmen wird?

Denn so könnte man mal testen wie sicher sein Login wirklich gegen sql injektion ist.
 
@splasch

Ohja, davon kannst du ausgehen, dass das funktioniert. Sein Script ist Injectiongefährdet.
Es stimmt zwar, dass PHP bei aktivierter magic_quotes einen backslash vor den zeichen ' und " setzt, heist aber dennoch noch lange nicht, dass da keine Manipulation möglich ist.

zum einen kann man bei ungesicherten $_REQUEST-Variablen DoS-Attacken ausführen, selbst mit magic_quotes. Zum anderen kann man ungehindert HTML-Code einschleusen, wodurch XSS (Cross-Site-Scripting)-Attacken durchführbar sind. Durch derartige Attacken kann man Cookiedaten der User stehlen und sich so Zugang zu eventuell sensiblen Daten verschaffen.

Darum: Sichert ALLE Usereingaben gegen Angriffe ab.

PHP:
function protectinput($value) {
     // HTML und PHP-Tags entfernen
     $value = strip_tags($value);
     // MySQL abfrage sichern
     $value = mysql_real_escape_string($value);

     return $value;
}

$an = $_POST['an'];
$text = $_POST['text'];
...
$sql = "SELECT user FROM users WHERE user='".protectinput($an)."'";
...

...
$sql = "INSERT INTO `nachrichten` SET von='".$_SESSION['name']."',an='".protectinput($an)."',nachricht='".protectinput($text)."',datum='".date("d.m.y")."'";
...

Grüße, Patrick
 
Das über Get manipulationen möglich sind waren mir auch klar.
Das mit Html ist ein guter einwand so kann er fremde Script auf dem Server ausführen.
Aber Sql Injektion ist sicher auch der Sql befehl manipulierbar aber nicht so leicht wie ein fremdes script einzuschleusen.

Sag mal was ist der Unterschied zwischen mysql_real_escape_string und mysql_escape_string. Beide machen doch im grunde das gleiche nur das real nur geht wenn ein Db zugriff offen ist oder sehe ich das falsch.

Danke für den Hinweis mit dem Html einbetten.

Was würde ihr davon halten mal ein Online Test Projekt zu machen mit einen Unsicheren Login. Und jeder soll versuchen sich dort einen Acount zu verschaffen durch Sql injektion .Die dann Posten wie er es geschafft hat. Danach wird das Login script verbessert und es soll weiter versucht werden sich dort acounts zu erstellen. Solang bis dann das Script so sicher ist das es keiner mehr schafft.

Hätte Ihr lust auf so ein Projekt.
 
mysql_real_escape_string sucht noch mehr ausdrücke, die eine MySQL Injection ermöglichen, wie zum Beispiel \x00, das macht mysql_escape_string nicht, sofern ich korrekt informiert bin.

für den HTML-Hinweis - kein problem ;)

was deine Idee betrifft - find ich grundweg nicht übel, könnte man vielleicht mal in Betracht ziehen. Ich wäre denk ich mal mit an Bord ;)
 
Zuletzt bearbeitet:
Ok dann werd ich mal so ein unsicheres Login erstellen und später Online stellen.
Dann könnt ihr auch aus dopen. *g

Das mit dem Html einschleusen ist eine Gefährlich sache das geht bei Get und auch bei Post. Sollte ich schleunigs in meinen Formularen ändern.
 
geht auch per $_COOKIE usw... Generell also bei allen $_REQUEST-Variablen. sogar per Headerdaten kannst du html einschleusen.

Beispielsweise willst du Browserdaten des Users speichern und später auswerten. Der User fängt seine eigenen Daten, die an den Server gesendet werden, per Proxy ab, manipuliert sie und schickt sie an dein Script weiter. Das Script speichert die Daten ungefiltert ab - der schadcode ist in der Datenbank. Rufst du dann dein Statistikmodul auf um zu sehen, wie viele User mit welchem Browser auf deine Seite zugreifen, führst du automatisch die Datenbankabfrage aus, PHP parst alles als HTML und gibt es an deinen browser weiter - und peng, könntest du unter Umständen automatisch auf eine dir fremde seite gelangen und unwissentlich oder gar wissentlich deine Cookiedaten weiter geben - ohne dass du was machen kannst.

Nur als beispiel, dass generell alle daten, die vom user kommen UND von deinem Script verarbeitet werden, manipuliert und "infiziert" sein könnten.

Gut, mal schaun wie dein Loginscript wird und was wir daraus machen können, eventuell kann ich mich sogar erweichen das Script soweit zu modifizieren, dass man eine feste PHP SessionID UND eine dynamische eigene SessionID hat und der user ausschliesslich über die dynamische SessionID authentifiziert wird ;)
 
Zurück