SQL MySQL Hochkomma Problem :(

Belee

Lt. Commander
Registriert
Dez. 2006
Beiträge
1.518
Hi

Ich weiß nicht wie ich das lösen kann, hab schon alles möglich probiert doch
immer wieder die Fehlermeldung wegen invalid Argument.

Es liegt am ' Hochkomma wenn im Text vorhanden. Das einzige wäre das zu löschen doch es muss doch eine andere Möglichkeit geben?


PHP:
   mysql_connect($mysql_host, $mysql_user, $mysql_pass);
   mysql_select_db($mysql_base);
   mysql_query('SET NAMES utf8'); 
   $sql = mysql_query("SELECT * FROM `exbase` WHERE `name` = '" . $temp[0] . "'");
 
   if(mysql_num_rows($sql) == 0) {
    $dsatz = "0";
   }
   else {
    $dsatz = mysql_fetch_assoc($sql);
   }

$temp[0]
Beinhalte immer einen Künstlernamen, in dem dann hin und wieder das Hochkomma vorkommt.
Ich benutze das Script um zu schauen ob der Name in der Datenbank vorhabden ist und lese einen Wert aus, wenn nicht vorhanden dann gebe ich 0 aus.

Ich verstehe nicht warum es hier das Problem gibt, bin halt noch nicht so Fit in MySQL.
Bei jedem Namen in dem ein Hochkomma vorkommt gibt es den Fehler.
 
mysql_real_escape_string() oder addslashes()

Und das ganze ist sicherheitsrelevant!
 
Hmm wie meinst du das mit sicherheitrelevant?

mysql_real_escape_string()
Wo genau baue ich das ein? im query?

Ach so, verstehe, also wäre es besser den $temp[0] Inhalt VOR der Abfrage von sämtlichen Zeugs zu reinigen und dann den normalen query? oder?
 
jeder Parameter muss durch die Funktion geschleust werden.
Du hast gerade selbst unbewusst eine SQL-Injection durchgeführt ;)
 
Na besten Dank auch :D
Verrätst du mir auch was genau ich jetz falsch mache? oder gemacht habe?
 
Du veränderst durch den Inhalt der Variable den SQL-Befehl.
Die Hochkommata definieren Anfang und Ende des Strings, wenn deine Varaiable ein Hochkomma enthält ist der String zu Ende und SQL kann mit dem Rest nichts anfangen weil es falsche Syntax ist.

Funktionen wie addslashes fügen ein definiertes Zeichen (z.B. "\") von die ganzen Steuerzeihen wie das Hochkomma, der SQL-Server erkennt das dann als "das nächste Zeichen ist Teil des Strings und nicht das Zeichen was das Ende des Strings definiert". Nennt man "escapen".

Die Funktion musst du auf die Variable anwenden (und zwar nur auf die, nicht auf den ganzen SQL-Befehl).
Lass dir am besten den SQL-Befehl einfach mal ausgeben, setz die Funktion rein und guck dir den Befehl nochmal an.

PS: Auch ohne SQL solltest du das kennen wenn du PHP benutzt, da brauchst du das ca. alle 3 Zeilen. ;)
 
So als Hinweis: Um ein Hochkomma in einen String in SQL zu verpacken, nutzt man doppelte Hochkommas.
Code:
SELECT * FROM `exbase` WHERE `name` = 'bla''bla''bla'
 
Ja jetzt sollte es funktionieren.

Der Inhalt von temp[0] ist z.B.
Ice 'N' Sugar

PHP:
$base = mysql_real_escape_string($temp[0]);
$sql = mysql_query("SELECT * FROM `exbase` WHERE `name` = '" . $base . "'");

Da mir das aber trotzdem nicht sicher ist - hab da einiges gerade gelesen, werde ich auf Sonderzeichen in der DB ganz verzichten, das ist denke ich immer noch das sicherste.
 
Ob du auf Sonderzeichen verzichtest oder nicht: escapen musst du IMMER.
 
Wieso? wenn ich alle Sondezeichen filtere dann wozu noch escapen?
 
Blutschlumpf schrieb:
Funktionen wie addslashes fügen ein definiertes Zeichen (z.B. "\") von die ganzen Steuerzeihen wie das Hochkomma, der SQL-Server erkennt das dann als "das nächste Zeichen ist Teil des Strings und nicht das Zeichen was das Ende des Strings definiert". Nennt man "escapen".
Bitte um Datenbank-Statements zu escapen nie addslashes vorschlagen, denn mysql_real_escape_string escaped noch viel mehr böse Zeichen, einfach nur das Hochkomma zu escapen reicht nicht.

Blutschlumpf schrieb:
PS: Auch ohne SQL solltest du das kennen wenn du PHP benutzt, da brauchst du das ca. alle 3 Zeilen. ;)
:confused_alt:
ich brauche addshlashes nie.
Wofür du das brauchst würde mich mal ernsthaft interessieren.

Yuuri schrieb:
So als Hinweis: Um ein Hochkomma in einen String in SQL zu verpacken, nutzt man doppelte Hochkommas.
Code:
SELECT * FROM `exbase` WHERE `name` = 'bla''bla''bla'
tatsache, das funktioniert wirklich :eek:
Die Escaping-Methode mit einem Backslash davor ist aber deutlich häufiger, bzw. machen das die ganzen Librarys der Datenbanken direkt so, die doppelte Hochkomma-Methode ist mir noch nie untergekommen - interessant.
 
Nein reicht es nicht, das sagt dir auch das Manual, es werden auch Nul-Bytes, Kommas und einige andere Dinge abgefangen, die mögen zwar nicht so prominent wie ein Hochkomata für Injections sein, könnte aber auch einmal vorkommen.
 
Das MySQL Manual sagt:

Characters encoded are NUL (ASCII 0), “\n”, “\r”, “\”, “'”, “"”, and Control+Z

Und wie oben schon gepostet:

Strictly speaking, MySQL requires only that backslash and the quote character used to quote the string in the query be escaped

Und rate mal, was addslashes escapen tut?

These characters are single quote ('), double quote ("), backslash (\) and NUL (the NULL byte).

Ich sags nochmals: Man sollte mysql_real_escape_string() verwenden, aber addslashes() hat komischerweise auch jahrelang funktioniert.

Probleme kriegst du mit addslashes wenn du zb. GBK Charset (Chinesisch) verwendest. UTF-8 ist scheinbar nicht betroffen.
 
Ich nutze utf-8, ok habe ich nicht erwähnt, mein Fehler.

Aber, brauche ich dieses ganze Theater wenn es um Scripte geht die ein User nie starten kann? und die zudem mit mod_rewrite maskiert wurden?
 
Dass du UTF8 verwendest, sieht man ja an deinem Beispiel. Aber wie gesagt, bei UTF8 funktioniert addslashes immernoch.

Das ganze ist aber kein Theater, das solltest du grundsätzlich immer machen. Jeder Input der in ein SQL Query kommt gehört überprüft/escaped. Auch wenn das script nie jemand zu sehen kriegt, gewöhn es dir an.
 
Belee schrieb:
Aber, brauche ich dieses ganze Theater wenn es um Scripte geht die ein User nie starten kann?
Überall wo Daten vom User ankommen muss gefiltert werden. Egal ob du der User bist oder einer aus Timbuktu. Du kannst schließlich auch mal etwas falsches oder nicht konformes eingeben und somit unbeabsichtigt die DB zerstören.

Anders sieht es aus, wenn du mit fixen Werten innerhalb des Script arbeitest und keine Daten von außerhalb kommen. Dann musst du nur vorher darauf achten, dass die Queries und Werte sauber sind und keine Fehler aufweisen.
 
Ok, mache ich. Danke.

Es so zu machen wäre nicht gut?

PHP:
$sql = mysql_query("SELECT * FROM `exbase` WHERE `name` LIKE '%" . mysql_real_escape_string($search) . "%' OR `alt` LIKE '%" . mysql_real_escape_string($search) . "%' ORDER BY `name` ASC");
 
Zuletzt bearbeitet:
Zurück
Oben