SQL Update mit injection [PHP]

xMiNe

Mitglied
Hallo alle Zusammen,
Ich habe volgendes Problem.
Ich weiss jetzt schon wie ich ein SQL Update / Abfrage... Mache.
Also habe ich es so gemacht das Leute auf meine Homepage gehen und dort ihre Homepage unter Links eintragen können.
Jetzt aber habe ich durch ein Freund gehört das, das nicht sicher wäre. Was ja auch stimmt wenn man in Formular einfach denn SQL eintarg zuendeschreibt und dann zum Beispiel denn Lösch befehl eingibt. Das will ich ja nicht deshalb frage ich hier nach, wie ich das verhindern kann. :)

Im Internet habe ich schon gegoogelt nur dort verstehe ich das nicht richtig wie in Wikipedia.

Führ Tippfehler nehmen ich keine Haftung. :D :D :D (Für die Dummen: das ist nur ein schärz nicht / Führ ohne h)
 
[phpf]mysql_real_escape_string[/phpf] sollte schon mal ein guter Anfang sein.

Ansonsten einfach hier im Forum suchen.
 
jopp, das wurd schon derbe oft hier gepostet.

erstell dir ne funktion:

PHP:
function protect($text)
{
     $text = mysql_real_escape_string($text);
     $text = eregi_replace("/script/", "scr*pt", $text);
     $text = htmlentities($text);
}

und umschliesse in der sql-abfrage GRUNDSÄTZLICH(!) alle php-Vatiablen in der Abfrage mit dieser Funktion! Im Prinzip wehrst du damit 95% der Gefahren ab. Gegen XSS (Cross Site Scripting) allerdings bist du damit mein ich noch nicht ganz gefeit. Aber das Thema ist auch relativ komplex, weils viele Möglichkeiten gibt XSS durchzuführen... Deswegen durchsuche ich generell alle Texte nach "script", um so einfache (!) XSS-Angriffe abzuwehren, und ersetze das Wort "script" mit *** oder was andrem...
 
Zum Schutz gegen SQL-Injektionen hilft die mysql_real_escape_string()-Funktion alleine schon, da sind die beiden anderen genannte Funktionen gar nicht notwendig. Und um die HTML-Metazeichen zu maskieren, reicht die htmlspecialchars()-Funktion aus.
 
norja sicher reicht die mysql_real_escape_string() eigentlich aus bei normalen sql-injections, aber man muss ja auch andere Möglichkeiten in Betracht ziehen. deswegen die Verwendung von eregi_replace (kann man sicherlich noch weiter dran herumdoktern, wenn man diese "maskierten Zeichen" (wie nennt man die Zeichen, die als "#A06" usw erscheinen? fällt mir grad nich ein...) auch noch umwandelt in "normale" Zeichen usw...) und htmlentities... wobei es glaub ich egal iss, ob man nun htmlspecialchars nimmt oder htmlentities... odr?^^ naja, es sei denn htmlspecialchars ist performanter... dann müssts ich auch mal ändern :D
 
Zum Maskieren der MySQL-Metazeichen, also zum Schutz vor SQL-Injektionen, reicht die mysql_real_escape_string()-Funktion alleine aus. Andere DBMS benötigen möglicherweise andere Funktionen, da sie nicht dieselben Metazeichen verwenden.
Alles andere dient nicht mehr alleine dem Schutz vor SQL-Injektionen sondern wie beispielsweise die htmlentities()-Funktion unter anderem zum Maskieren der HTML-Metazeichen, was so vor Cross-Site Scripting schützen kann. Ich bevorzuge dafür die bereits erwähnte htmlspecialchars()-Funktion, da diese ausschließlich die HTML-Metazeichen ersetzt. Das andere Genannte, das Ersetzen der Zeichenkette „script“ durch etwas anderes, ist dadurch überflüssig.
 
Oky ich habe versucht den Code injections sicher zu machen.
Aber irgendwie geht das nicht...
PHP:
<?php

mysql_connect("localhost","root","") or die
("Keine Verbindung moeglich");
mysql_select_db("test") or die
("Die Datenbank existiert nicht");
 
echo '
<form action="test.php" method="post">
<table>
<tr><td>Name:</td><td> <input type="text" name="username"></td></tr>
<tr><td>Email:</td><td> <input type="text" name="email"></td></tr>
<tr><td>Homepage:</td><td> <input type="text" name="homepage"></td></tr>
<tr><td colspan="2">Nachricht:<br>
<textarea name="nachricht" cols="35" rows="8"></textarea><td></tr>
<tr><td colspan="2"><input type="submit" value="Eintragen" name="senden"></td></tr>
</table>
</form>
';
if($_POST["senden"] == "Eintragen"){
$query = "INSERT INTO test (id, username, email, homepage, nachicht, zeit, ip) VALUES('','".{$_POST['username']}."','".{$_POST['email']}."','". {$_POST['homepage']}."','".{$_POST['nachicht']}."','".date("h:i:s")."','".$REMOTE_ADDR."')";

$eintragen = mysql_query($query);
if($eintragen){
echo 'Eintrag hinzugefuegt';

}
}

?>

ERROR:
Parse error: syntax error, unexpected '{' in C:\xampp\htdocs\test\db\test.php on line 21

20:if($_POST["senden"] == "Eintragen"){
21:$query = "INSERT INTO test (id, username, email, homepage, nachicht, zeit, ip) VALUES('','".{$_POST['username']}."','".{$_POST['email']}."','". {$_POST['homepage']}."','".{$_POST['nachicht']}."','".date("h:i:s")."','".$REMOTE_ADDR."')";
22:

könnt ihr mir helfen?

Danke

DarioFazio
 
Diese geschweiften Klammern um die Variablen haben da nichts zu suchen.
Genau das sagt ja auch die Fehlermeldung: Unerwartete "{" in C:\ etc.

Weiterhin sehe ich in deinem Skript keinmal die erwähnte Funktion [phpf]mysql_real_escape_string[/phpf].
 
PHP:
<?php

mysql_connect("localhost","root","") or die
("Keine Verbindung moeglich");
mysql_select_db("test") or die
("Die Datenbank existiert nicht");
 
echo '
<form action="test.php" method="post">
<table>
<tr><td>Name:</td><td> <input type="text" name="username"></td></tr>
<tr><td>Email:</td><td> <input type="text" name="email"></td></tr>
<tr><td>Homepage:</td><td> <input type="text" name="homepage"></td></tr>
<tr><td colspan="2">Nachricht:<br>
<textarea name="nachricht" cols="35" rows="8"></textarea><td></tr>
<tr><td colspan="2"><input type="submit" value="Eintragen" name="senden"></td></tr>
</table>
</form>
';
if($_POST["senden"] == "Eintragen"){
$query = "INSERT INTO test (id, username, email, homepage, nachicht, zeit, ip) VALUES('','".$_POST['username']."','".$_POST['email']."','". $_POST['homepage']."','".$_POST['nachicht']."','".date("h:i:s")."','".$REMOTE_ADDR."')";
$eintragen = mysql_query($query);
if($eintragen){
echo 'Eintrag hinzugefuegt';

}
}

?>
Juhoo der Code geht nur ist das jetzt auch injection sicher?
Wenn nicht könnt ihr das so ändern das das auch injection sicher ist...
 
Sämtliche Variablen die du in VALUES im SQL Query angibst, sollten durch [phpf]mysql_real_escape_string[/phpf] geschickt werden.
 
Zurück