Johannes Zeller: Intelligente Suche

Beitrag lesen

Hallo Lupus,

$var = mysql_real_escape_string(htmlspecialchars(trim($var), ENT_QUOTES, 'UTF-8'));

Nein, so geht das nicht. Lies dir nochmal die Beschreibung zu mysql_real_escape_string() im Handbuch durch. Du musst da ansetzen, wo die Daten in dein SQL-Query eingefügt werden:

        foreach($_POST as $key => $value) {  
          if(trim($value)!='' AND $key != 'search') {  
              $i++;  
              $sql .= "(MATCH ".$key." AGAINST ('".mysql_real_escape_string($value)."') OR ";  
              $sql .= $key." LIKE '%".mysql_real_escape_string($value)."%')";  
              if($i<$a) $sql .= " AND ";  
          }  
      }

Da $value gleich $_POST['key'] ist, kann man das hier stattdessen verwenden.

Das Problem ist aber, dass mysql_real_escape_string nicht zum Maskieren von Spaltennamen verwendet werden kann und es in PHP auch keine vorgefertige Funktion dafür gibt. Eine gute Lösung dafür ist es, ein Array mit allen möglichen Spaltennamen (in deinem Falle wohl ohne 'search' zu haben. Wenn wir davon ausgehen, dass du irgendwo weiter oben ein solches Array mit dem namen $spalten angelegt hast, kannst du nun einfach überprüfen ob es eine Spalte mit dem Namen $key gibt:

        foreach($_POST as $key => $value) {  
          if(trim($value)!='' AND [link:http://www.php.net/in-array@title=in_array]($key, $spalten)) {  
              $i++;  
              $sql .= "(MATCH ".$key." AGAINST ('".mysql_real_escape_string($value)."') OR ";  
              $sql .= $key." LIKE '%".mysql_real_escape_string($value)."%')";  
              if($i<$a) $sql .= " AND ";  
          }  
      }

Also immernoch mit ENT_QUOTES Doppelte- und Einfachanführungszeichen in HTMLZeichen umwandeln.
Es sollen unter Umständen auch solche Zeichen einfefügt werden: ø æ å,...
Deshalb verwende ich überall das UTF-8 charset(Datenbank und im <head>)

Du solltest noch kontrollieren, dass dein Server auch im HTTP-Header Content-Type UTF-8 oder zumindest nichts Anderes, als du mittels er Meta-Angabe angegeben hast, sendet. Die Angabe im HTTP-Header überschreibt nämlich die Angabe im HTML-Quelltext.

Aber trotzdem nicht in HTML Zeichen umwandeln? Oder nur für die Ausgabe umwandeln lassen(z.B. eine output function).

Grunsätzlich gilt, immer nur für den entsprechenden Kontext maskieren. Also für die Kommunikation mit der Datenbank mysql_real_escape_string() verwenden, für die Ausgabe als HTML htmlspecialchars().

Was ist den die Gefahr wenn ich addslashes statt mysql_real_escape_string verwende?

Addslashes ist zu generisch und berücksichtigt nicht alle Fälle, die mysql_real_escape_string berücksichtigt.

Am ende soll diese Datenbank mit MSS (Microsoft SQL Server) laufen. Damit kenni ich micht nocht nicht sehr gut au und weiss nicht was es für befehle gibt...

Dann solltest du dein Script so programmieren, dass die Kommunikation zur Datenbank vernünftig gekapselt ist, und sich der entsprechende Teil leicht austauschen lässt.

Im PHP-Handbuch findest du die Microsoft-SQL-Server-Funktionen. Allerdings gibt es für MS-SQL keine vordefinierte Escape-Funktion. Laut den Kommentaren im Handbuch reicht es allerdings aus, ' durch '' zu ersetzen, beispielsweise mittels str_replace().

Schöne Grüße,

Johannes