MySQL verwirft php Variable

Hallo,

sorry für die Überschrift, aber im Titel ist nicht genug Platz für eine treffende.

Folgende Gegebenheiten:

  • Maschine mit Win XP Pro (full updated) 32bit.
  • Apache 2.2.0
  • PHP 5.1.1
  • MySQL 5.0.18

Problem:
In einer db befinden sich sog. Unworte. Worte also die, wenn sie in ein HTML-Formular eingegeben wurden, nicht weiterverarbeitet werden sollen. Auch nicht, wenn sie nur Teil eines anderen Wortes sind.
Beispiel:
in der db steht der Eintrag ‚piss‘. ‚Bepisst‘ soll also gleichermassen geblockt werden wie ‚verpiss‘ oder ‚Pisser‘.
Ich code also drauf los und weil die Eingabe aus dem Formular höchstens 20 Zeichen weit sein können und die Einträge der Unworte in der db überschaubar sind hatte ich folgene Lösund ausgearbeitet :

$unwort = $_POST[‚unwort‘];
$unwort = strtolower($unwort);
$abfrage = "SELECT unworte
FROM unwort
WHERE unworte LIKE ‚%$unwort%‘
";

?>

Es funktioniert nicht!
Ich habe wer-weiss-wieoft schon mit LIKE gearbeitet. Nie gabs Probleme.
Und nun???
Witzigerweise funktioniert aber

//$unwort = $_POST[‚unwort‘];
//$unwort = strtolower($unwort);
$abfrage = „SELECT unworte
FROM unwort
WHERE unworte LIKE ‚%piss%‘“; //Variable ersetzt mit exaktem Wert

?>.

Kann sich jemand einen Reim darauf machen?

Gruß widecrypt

Hallo

> $unwort = $\_POST['unwort'];  
> $unwort = strtolower($unwort);  
> $abfrage = "SELECT unworte  
> FROM unwort  
> WHERE unworte LIKE '%$unwort%'  
> ";  
>   
> ?\>

Stopp. Ganz großen Don’t do. Interpoliere niemals von „außen“ kommende Variablen in einen SQL-String ein.
Wenn in $unwort der Wert

';drop table ; select \* from table where "" = '

drin steht (inklusive der einfachen Anführungsstriche), wird eine Tabelle gelöscht. Also immer schön Platzhalter verwenden.

Grüße,
Moritz

Hallo

Stopp. Ganz großen Don’t do. Interpoliere niemals von
„außen“ kommende Variablen in einen SQL-String ein.
Wenn in $unwort der Wert

';drop table ; select * from
table where „“ = ’

drin steht (inklusive der einfachen Anführungsstriche), wird
eine Tabelle gelöscht. Also immer schön Platzhalter verwenden.

Hey, da passt jemand auf!
Klar kommt da vorher noch’n script welches auf enthaltene Zeichen prüft (’*, usw). Hab ich in dem Ausschnitt nur weggelassen.

Grüße,
Moritz

Gruß widecrypt

Hallo,

Stopp. Ganz großen Don’t do. Interpoliere niemals von
„außen“ kommende Variablen in einen SQL-String ein.
Wenn in $unwort der Wert

';drop table ; select * from
table where „“ = ’

drin steht (inklusive der einfachen Anführungsstriche), wird
eine Tabelle gelöscht. Also immer schön Platzhalter verwenden.

Hey, da passt jemand auf!
Klar kommt da vorher noch’n script welches auf enthaltene
Zeichen prüft (’*, usw). Hab ich in dem Ausschnitt nur
weggelassen.

Ich würde es trotzdem mit Platzhaltern machen, für den Fall, dass man mal irgendwo ein Sonderzeichen vergisst. Damit ist man immer auf der sicheren Seite.

Ich kenn mich mit PHP überhaupt nicht aus, unter Perl ginge das etwa so:

my $query = $dbh-\>prepare("SELECT FROM WHERE id = ?");
$query-\>execute($unsafe\_parameter);

Dabei wird anstelle des ? das erste Argument des execute()-Aufrufs ersetzt. Hat den Vorteil, dass man Geschwindigkeit gewinnt, wenn man mehrere Anfragen mit dem selben SQL-Code und unterschiedlichen Parametern macht.

Ich bin mir sicher, dass es unter PHP eine ähnliche Möglichkeit gibt - und die sollte man **immer** nutzen.

Grüße,
Mo 'Paranoi' ritz

Klar, dadurch dass du die Hochkommata um deine Variable gesetzt hast, sucht dein Select in der Tabelle nicht nach dem Inhalt der Variablen(piss), sondern nach dem Namen der Variablen($unwort).
Ich weiss jetzt nicht wie das Verknüpfungszeichen in mySQL geht, aber in Oracle würde ich das Ganze einfach so umschreiben:

SELECT unworte
FROM unworte
WHERE unworte LIKE ‚%‘ || $unwort || ‚%‘)LOOP

Die beiden Pipes(||) stellen den Verknüpfungsoperatorfür Strings da, falls der in mySQL anders sein sollte müsste das noch ersetzt werden.

Falls es bei dir in der DB zutrifft, denk daran dass du Groß/Kleinschreibung beachten musst.

$abfrage = "SELECT unworte
FROM unwort
WHERE unworte LIKE ‚%$unwort%‘

!=

$abfrage = "SELECT unworte
FROM unwort
WHERE unworte LIKE ‚%piss%‘

Hallo,

und danke fürs mithirnen.

Klar, dadurch dass du die Hochkommata um deine Variable
gesetzt hast, sucht dein Select in der Tabelle nicht nach dem
Inhalt der Variablen(piss), sondern nach dem Namen der
Variablen($unwort).
Ich weiss jetzt nicht wie das Verknüpfungszeichen in mySQL
geht, aber in Oracle würde ich das Ganze einfach so
umschreiben:

SELECT unworte
FROM unworte
WHERE unworte LIKE ‚%‘ || $unwort || ‚%‘)LOOP

Braucht mysql nicht. Durch die Schreibweise ‚%$var%‘ ist es klar.
Und genau da liegt auch mein Denkfehler!

Wenn ich schreibe

$unwort = „bepisst“;
$abfrage = "SELECT unworte
FROM unwort
WHERE unworte LIKE ‚%$unwort%‘
";

dann wird nach db Einträgen gesucht, in denen ‚bepisst‘ drinsteckt. Nicht ob Einträge vorhanden sind, die ihrerseits in ‚bepisst‘ vorkommen!

So funktionierts:

$abfrage = "SELECT *
FROM unwort
WHERE INSTR(’$unwort’, unworte)
";

Die beiden Pipes(||) stellen den Verknüpfungsoperatorfür
Strings da, falls der in mySQL anders sein sollte müsste das
noch ersetzt werden.

Falls es bei dir in der DB zutrifft, denk daran dass du
Groß/Kleinschreibung beachten musst.

Nicht in mysql. Da würde das selbst klappen mit BePiSsT. Wenn der Index auf text gesetzt ist, ists nicht case sensitiv.

Was lehrt uns das mal wieder?
$machine = „brain 1.0“;
if(((working_time($machine)) > 12h)
{
do not ->

$abfrage = "SELECT unworte
FROM unwort
WHERE unworte LIKE ‚%$unwort%‘

!=

$abfrage = "SELECT unworte
FROM unwort
WHERE unworte LIKE ‚%piss%‘

}
else
{
false
}

Nochmal Danke
widecrypt

huhu,

was sacht den nen

echo $abfrage

?