Christian Seiler: Parse error: syntax error, unexpected T_VARIABLE

Beitrag lesen

Hallo,

<?php include("config.php");
$eintrag = 'INSERT INTO websites(webseite, url, beschreibung)
VALUES('$_GET["webseite"]', '$_GET["url"]', '$_GET["beschreibung"]')'
Eintragen = mysql_query($eintrag);
?>

Zuerst einmal: Damit das überhaupt funktioniert, muss Dir klar sein, wann welches Zeichen welche Art von String begrenzt.

Was Du haben willst, ist ein SQL-Statement, das im Ende z.B. so aussieht:

INSERT INTO websites (website, url, beschreibung) VALUES ('test-seite', 'http://example.com/', 'Test-Eintrag')

Das Problem: Du schreibst kein SQL selbst. Sondern Du schreibst PHP, d.h. Du musst das ganze in einen PHP-String verpacken. Dann hast Du jedoch das Problem, dass wenn Du in PHP auch ' als Stringbegrenzer wählst, dass das ' im SQL-Statement den PHP-String beendet.

Du hast jetzt zwei Möglichkeiten:

1. Du nimmst den anderen Stringbegrenzer in PHP, nämlich ":

$eintrag = "INSERT INTO websites (website, url, beschreibung) VALUES ('test-seite', 'http://example.com/', 'Test-Eintrag')";

2. Du maskierst die SQL-', damit die den PHP-String nicht beenden:

$eintrag = 'INSERT INTO websites (website, url, beschreibung) VALUES (\'test-seite\', \'http://example.com/\', \'Test-Eintrag\')';

Dann kannst Du zumindest mal ein festes SQL-Statement zusammenbauen. Das Problem: Du willst das in PHP dynamisch erstellen auf Grund der Parameter, die Du übergeben bekommen hast. Um das zu bewerkstelligen, musst Du einen String aus verschiedenen Teilen zusammensetzen. In PHP funktioniert das mit dem Punkt, z.B. so:

$string = 'Hallo ' . 'Welt!';

Die Variable $string enthält dann den Text "Hallo Welt!". Das ganze geht auch mit Variablen:

$welt = "Welt";  
$string = 'Hallo ' . $welt . '!';

Auf Dein Beispiel übertragen wäre das dann (ACHTUNG: NICHT VERWENDEN, ENTHÄLT NOCH SICHERHEITSLÜCKEN):

$eintrag = "INSERT INTO websites (website, url, beschreibung) VALUES ('" . $_GET['website'] . "', '" . $_GET['url'] . "', '" . $_GET['beschreibung'] . "')";

Das würde zwra schon funktionieren, ist aber problematisch. Warum? Weil Du Dir damit eine riesige Sicherheitslücke einbaust. Der Grund ist nämlich, dass $_GET['beschreibung'] selbst ein ' enthalten könnte. Stell Dir vor, jemand würde für $_GET['beschreibung'] z.B. "It's fun" eingeben, dann würde der in PHP zusammengesetzte SQL-Befehl so aussehen:

INSERT INTO websites (website, url, beschreibung) VALUES ('fun', 'http://fun.example.com/', 'It's fun')

Wie Du siehst, ist das kein gültiges SQL mehr. In dem Fall wäre das noch harmlos, aber jemand könnte durchaus andere Dinge hereinschmuggeln durch die ', was dann dazu führt, dass jemand Dein SQL-Statement beliebig (!) modifizeren kann.

Wie kann man das verhinden? Nunja, die einfachste Möglichkeit ist, den Inhalt der von außen kommenden Variable so zu maskieren, dass er in SQL unschädlich ist. Dafür gibt's in PHP für MySQL bereits eine vorgefertige Funktion, die heißt mysql_real_escape_string. Baut man die ein, sieht das ganze so aus:

$eintrag = "INSERT INTO websites (website, url, beschreibung) VALUES ('" . mysql_real_escape_string ($_GET['website']) . "', '" . mysql_real_escape_string ($_GET['url']) . "', '" . mysql_real_escape_string ($_GET['beschreibung']) . "')";

Damit stellst Du sicher, dass niemand Dein SQL-Statement manipulieren kann und somit hast Du in dieser Hinsicht keine Sicherheitslücke.

Deine Frage zeigt jedoch, dass Du selbst von einigen PHP-Basics nicht genügend Ahnung hast, dass ich Dir *dringend* raten würde, das Quakenet PHP-Tutorial durchzuarbeiten - dort wird auch der MySQL-Zugriff erläutert.

Viele Grüße,
Christian

--
Mein "Weblog" [RSS]
Using XSLT to create JSON output (Saxon-B 9.0 for Java)
»I don't believe you can call yourself a web developer until you've built an app that uses hyperlinks for deletion and have all your data deleted by a search bot.«
            -- Kommentar bei TDWTF