[PHP] Was stimmt an dieser MySQL Abfrage nicht?

JohnDoe

Cadet 3rd Year
Registriert
Aug. 2003
Beiträge
44
Hi!
Ich habe hier nen Script geschrieben, das Werte aus einer My-Sql-Tabelle abfragt. Leider gibt es alle Zeilen aller Spalten aus und nicht nur die die als wert den Inhalt der Variable $name hat (die wird aus nem Fomular übertragen). Was ist daran falsch?

PHP:
<?php
$host = "localhost";
$user = "root";
$passwort = "";
$dbname = "johndoe";
$verbindung = mysql_connect($host,$user,$passwort);
$sql = "SELECT * FROM mylog WHERE ip LIKE '%$name%'";
if (mysql_select_db($dbname,$verbindung))
 {}
else
 {
  echo "Datenbank $dbname konnte nicht ausgewählt werden!<br>\n";
 }
$ergebnis = mysql_query($sql, $verbindung);
if($ergebnis)
{
 echo "<table border='1'><br>\n";
 echo "<tr><td><b>IP:</b></td><td><b>Browser:</b></td><td><b>Timestamp:</b></td><td><b>Referer:</b></td><td><b>Methode:</b></td><td><b>HTTP Accept:</b></td><td><b>Protokoll:</b></td><td><b>Sprache:</b></td></tr>";
 while($zeile = mysql_fetch_row($ergebnis))
 {
  echo "<tr>";
  for ($i = 0; $i< mysql_num_fields($ergebnis);
   $i++)
    echo "<td>" .$zeile[$i]. "</td>";
  echo "</tr>\n";
 }
 echo "</table>\n";
 mysql_free_result($ergebnis);
}
else
{
echo "Abfrage konnte nicht ausgeführt werden<br>\n";
}

mysql_close();
?>

Irgentwo bei "'%$name%'";" müsste der fehler liegen... Ich kann den leider nicht finden...

John Doe
 
was gibt er den für einen fehler aus?

ändere mal

Code:
$ergebnis = mysql_query($sql, $verbindung);

in

Code:
$ergebnis = mysql_query($sql, $verbindung) or print(mysql_error($verbindung));

und sag mir ob da ein fehler kommt und wenn ja was für einer.

sollte kein fehler kommen, is die sql abfrage richtig und wo anders muss was falsch sein
 
Naja, es hat schon seinen Sinn, dass diese Option mittlwerweile per Standardeinstellung deaktiviert ist.
Wenn du heute ein neues Projekt mit PHP anfängst solltest du diese Option auf jeden Fall auf 'off' stellen.
Bei deaktivierten globalen Variablen musst du einmal am Anfang des Skripts eine Verbindung zum DB-Server herstellen:
Code:
resource mysql_connect ( [string Server [, string Benutzername [, string Benutzerkennwort [, bool neue_Verbindung [, int client_flags]]]]])
 
Ja, ist ein Sicherheitsrisiko, da PHP Variablen global zugänglich macht, und somit Variablen direkt ansprechbar sind. D.h. mit einer entsprechend präparierten Seite können von Aussen diese Variablen verändert werden und zu unschönen Ergebnissen führen ;)

Seit PHP 4.x werden Variablen immer in entsprechenden Arrays übergeben
($_GET[], $_POST[], $_SESSION[], ....) was die Sache (etwas) sicherer macht.
 
Es gibt da geteilte Meinungen, ob die Einführung von register_globals = off Sinn macht. Das Problem bisher war, dass man eine globale Variable durch Ändern der URL setzen konnte, z.B. http://127.0.0.1/script.php?loggedin=1

Nehmen wir folgendes Script an:
PHP:
$query = "SELECT COUNT(*) FROM user WHERE user='$user' AND password='$password'";
if ( mysql_result( mysql_query( $query ), "COUNT(*)" ) == 1 ) {
    $loggedin = 1;
}

Da wir (Angreifer) die Variable aber direkt an die URL angehängt haben, hat sie auch dann den Wert 1, wenn der Login-Mechanismus fehlschlägt und der Login-Mechanismus wäre ausgehebelt!

Wenn man aber regsiter_globals deaktviert, wird durch die manipulierte URL nur $_GET['loggedin'] und $_REQUEST['loggedin'], nicht jedoch die gloable Variable $loggedin gesetzt. Die Folge ist also die kosequente Trennung zwischen vom nicht vertrauenswürdigen Benutzer vorhandenen Daten und den anderen Variablen.

Durch saubere Programmierung kann man das Problem jedoch umgehen, indem man den Beispiel-Code um eine Else-Anweisung erweitert, die $loggedin auf den Wert 0 setzt. Dann würde ein eventuell per GET übergebener Wert (an die URL angehängt wie im Beispiel oben) überschrieben werden, falls der Login-Mechnismus fehlschlägt.

Da regsiter_globals = off jedoch Standard ist und du wohl in naher Zukunft Schwierigkeiten bekommen wirst, einen Host mit register_globals = off zu finden, solltest du es verwenden.
 
Original erstellt von Steffen
Da regsiter_globals = off jedoch Standard ist und du wohl in naher Zukunft Schwierigkeiten bekommen wirst, einen Host mit register_globals = off zu finden, solltest du es verwenden.

Irgentwie ist mir das jetzt nicht genz klar... Ich soll Schwierigkeiten bekommen einen Hoster mit register_globals = off zu bekommen? Du meinst doch das ich schwierigkeiten bekomme einen hoster mit register_globals = on zu bekommen, oder?

Das ist denke ich das kleineste Problem, da ich meinen eigenen Server habe, und alles selber einstellen kann...
 
register_off ist wohl aus Sicherheitsgründen in den neueren Relases von PHP zum Standart geworden. Und es sollte auch dabei belassen werden.

mfg
 
Original erstellt von JohnDoe
Irgentwie ist mir das jetzt nicht genz klar... Ich soll Schwierigkeiten bekommen einen Hoster mit register_globals = off zu bekommen? Du meinst doch das ich schwierigkeiten bekomme einen hoster mit register_globals = on zu bekommen, oder?
Ähm, ja. :)
 
Zurück
Oben