Per ?set=id auf eine Seite, klappt aber nicht!

Habe ja schon geschrieben, dass es sich um den Code von oben handelt. Aber bitte, hier nochmal den Code:

Ausschnitt:
PHP:
$abfrage1 = "SELECT * FROM sw_portal WHERE username LIKE '$user'";
          $ergebnis1 = mysql_query($abfrage1)
          OR die("Error: $abfrage1 <br>".mysql_error());
          while($row1 = mysql_fetch_object($ergebnis1))
          {

if($row1->admin=="1")
{
echo "<br><br>";
echo "<a href=\"admin/admin_change_662712315.php?set=$id\">Diese Seite ändern</a>";
}

?>

ganzer Code:
PHP:
<?php
session_start();

include("l/mysql_connect.php");

$id=$_GET['set'];

$abfrage = "SELECT * FROM sw_homepage_seiten WHERE ID LIKE '$id'";
          $ergebnis = mysql_query($abfrage)
          OR die("Error: $abfrage <br>".mysql_error());
          while($row = mysql_fetch_object($ergebnis))
          {

include("include/variablen.php"); ?>
<!-- Ende Variablen -->




<link rel="SHORTCUT ICON" href="<?php echo "$url"; ?>/images/favicon.ico">
<link rel="STYLESHEET" type="text/css" href="<?php echo "$url"; ?>/css/default.css">
<title><?php echo $row->seitentitel; ?></title>
<!-- Bis hier bitte nichts entfernen -->




<!-- Start
POPUP -->

<!-- Ende
POPUP -->




<!-- Start
Fotobox -->
<script type="text/javascript">
    var GB_ROOT_DIR = "<?php echo "$url"; ?>/js/box/";
</script>
<script type="text/javascript" src="<?php echo "$url"; ?>/js/box/AJS.js"></script>
<script type="text/javascript" src="<?php echo "$url"; ?>/js/box/AJS_fx.js"></script>
<script type="text/javascript" src="<?php echo "$url"; ?>/js/box/gb_scripts.js"></script>
<link href="<?php echo "$url"; ?>/js/box/gb_styles.css" rel="stylesheet" type="text/css" />
<!-- End
Fotobox -->




<!-- Start
Videobox -->
<script type="text/javascript" src="<?php echo "$url"; ?>/js/video/mootools.js"></script>
<script type="text/javascript" src="js/video/swfobject.js"></script>
<script type="text/javascript" src="js/video/videobox.js"></script>
<link rel="stylesheet" href="<?php echo "$url"; ?>/js/video/videobox.css" type="text/css" media="screen" />
<!-- End
Videobox -->




<!-- Start
Header -->
<div id="header"></div>
<!-- End
Header -->





<?php
if ($id=="78926" OR $id=="78927" OR $id=="78928")
{
echo "&nbsp;";
}
else
{
?>
<!-- Start
Navigation -->
<div id="navi"> 
<br><br>
<?php include("include/navigation.html"); ?>
</div>
<!-- Ende
Navigation -->
<? } ?>






<!-- Start
Randbox -->
<?php include("include/randbox.html"); ?>
<!-- Ende
Randbox -->

     

     

<!--Start 
Content -->        
<div id="content"> 
<?php
$user=$_SESSION['username'];

if ($id=="")
{
Header("Location: render.php?set=1");
}
else
{
echo "<h1>".$row->ueberschrift."</h1>";
echo $row->Text;
}

$abfrage1 = "SELECT * FROM sw_portal WHERE username LIKE '$user'";
          $ergebnis1 = mysql_query($abfrage1)
          OR die("Error: $abfrage1 <br>".mysql_error());
          while($row1 = mysql_fetch_object($ergebnis1))
          {

if($row1->admin=="1")
{
echo "<br><br>";
echo "<a href=\"admin/admin_change_662712315.php?set=$id\">Diese Seite ändern</a>";
}

?>
</div>
<!-- End
Content -->




<!-- Start
Footer -->
<!-- Kein footer angegeben. Bitte melden Sie sich im ACP an um dieses zu &auml;ndern. -->
<!-- Ende
Footer -->
<? } ?>
<? } ?>
Gruß, Eike
 
Deine while-Schleife ist nicht beendet. Das heißt eigentlich ist der Code-Block der while-Schleife nicht beendet. Die }fehlt. Das könnte der Fehler sein, warum der Link mal angezeigt wird und mal nicht.

Außerdem wäre es doch sinnvoll, den Status des Admin in einer Session-Variablen abzulegen. So ballerst du bei jedem Aufruf der Seite den Datenbankserver mit dem gleichen Query voll. Performant ist das nicht. mysql_free_result() wird auch nirgends angewendet.

Will dir nicht zu nahe treten, aber wenn du wirklich schon mehrere Jahre programmierst, solltest du diese elementaren Dinge eigentlich wissen. Auch um Security machst du dir anscheinend keine Gedanken. Hm...
 
Ich programmiere hobbymäßig und nicht professionell. Das weiss ich. Muss unbedingt mal einen PHP-Kurs machen, denn alles Wissen, welches ich habe, habe ich aus irgendwelchen Büchern. Was würdest Du denn verändern? Kannst Du mir da nen Tipp geben?
 
Leider konnte ich das aus dem Kontext heraus nicht erkennen. Eine Sache wäre schon mal, eine ordentliche Einrückung. Welche IDE verwendest du? Bei Eclipse+PDT bspw. kannst du mit STRG+a,STRG+i den kompletten Code ordentlich formatieren lassen (die IDE macht das für dich).

Wenn du den Code eingerückt hättest, hätte ich das sogar gesehen. Es wäre sinnvoll, die Klammer weiter oben zu setzen, um den Kontext bei zu behalten. Ich meine das etwa so:

PHP:
$abfrage1 = "SELECT * FROM sw_portal WHERE username LIKE '$user'";
$ergebnis1 = mysql_query($abfrage1)
      OR die("Error: $abfrage1 <br>".mysql_error());
while($row1 = mysql_fetch_object($ergebnis1))
{
  if($row1->admin=="1")
  {
    echo "<br><br>";
    echo "<a href=\"admin/admin_change_662712315.php?set=$id\">Diese Seite ändern</a>";
  }
}
?>

Außerdem macht es hier vielleicht sogar Sinn, die While-Schleife weg zu lassen, da nur ein Datensatz geholt werden soll. Ich hoffe die Spalte username in der Tabelle sw_portal ist PRIMARY KEY oder zu mindest UNIQUE? Sonst könnte das auch zu unvorhergesehenen Werten führen. Ich würde es so machen:

PHP:
// Wo kommt $user her? Ist das validiert? Außerdem werden nicht alle Spalten sonder nur 'admin' benötigt. LIKE ist hier m.M.n. nicht gut.
$abfrage1 = "SELECT admin FROM sw_portal WHERE username LIKE '$user'";

// Query starten und Rückgabe prüfen - gut!
$ergebnis1 = mysql_query($abfrage1)
      or die("Error: $abfrage1 <br>".mysql_error());

$row1 = mysql_fetch_object( $ergebnis1 );
if( $row1 && $row1->admin == '1')  // ist die Spalte 'admin' wirklich ein Character oder eher Integer?
{
  echo '<br/><br/>';
  echo '<a href="admin/admin_change_662712315.php?set=' . intval($id) . '">Diese Seite ändern</a>'; // Habe $id mal forciert auf INT (siehe Anmerkung)
}

So ist der Code etwas sicherer.
Ohne die INT-Forcierung könnte man ein XSS anstellen: $id wird aus $_GET['set'] geholt. Laut deinem Code wird das immer noch nicht geprüft, wie bereits vorgeschlagen. Folgendes Szenario: Ich konstruiere folgende URL:

Code:
http://deineseite.de/script.php?set=1"><script>alert('XSS');</script></a><a href="http://meineseite.de/meinscript.php

Was passiert dann in deinem Code? Pass auf:

HTML:
<a href="admin/admin_change_662712315.php?set=1"><script>alert('XSS');</script></a><a href="http://meineseite.de/meinscript.php">Diese Seite ändern</a>

Das Javascript wird sofort ausgeführt. Dann kannst du den Link klicken. Landest auf meiner Seite. Ich baue deinen Login-Bildschirm nach. Du denkst: "huch, wieso nicht mehr angemeldet? Naja, halt neu anmelden...". Schon habe ich den Benutzernamen und Passwort deines Accounts... Sowas nennt man Phishing. Möglich wurde es durch Cross-Site-Scripting, weil du deine Parameter nicht prüfst.
 
So ist der Code etwas sicherer.
Ohne die INT-Forcierung könnte man ein XSS anstellen: $id wird aus $_GET['set'] geholt. Laut deinem Code wird das immer noch nicht geprüft, wie bereits vorgeschlagen. Folgendes Szenario: Ich konstruiere folgende URL:

Doch wird es, habe allerdings den Code von meinem Beitrag eben kopiert. Aber ich habe dieses schon geändert!

PHP:
<?php
session_start();

include("l/mysql_connect.php");

$id = intval($_GET['set']);
if (!$id) $id = 1;

Ich habe Deine Tipps nun auch übernommen. Ich glaube, dass ich wirklich einen PHP-Kurs machen muss!

Hier nochmal der fertige Code:
PHP:
<?php
$user=$_SESSION['username'];

echo "<h1>".$row->ueberschrift."</h1>";
echo $row->Text;

// Wo kommt $user her? Ist das validiert? Außerdem werden nicht alle Spalten sonder nur 'admin' benötigt. LIKE ist hier m.M.n. nicht gut.
$abfrage1 = "SELECT admin FROM sw_portal WHERE username LIKE '$user'";

// Query starten und Rückgabe prüfen - gut!
$ergebnis1 = mysql_query($abfrage1)
      or die("Error: $abfrage1 <br>".mysql_error());

$row1 = mysql_fetch_object( $ergebnis1 );
if( $row1 && $row1->admin == '1')  // ist die Spalte 'admin' wirklich ein Character oder eher Integer?
{
  echo '<br/><br/>';
  echo '<a href="admin/admin_change_662712315.php?set=' . intval($id) . '">Diese Seite ändern</a>'; // Habe $id mal forciert auf INT (siehe Anmerkung)

?>

Danke, aber woran kann das denn nun eigendlich liegen, dass der Link manchmal nicht angezeigt wird?

Gruß, Eike
 
Zuletzt bearbeitet:
Das kommt darauf an. Kannst du mit Sicherheit sagen, dass auch kein HTML dafür vorhanden ist? Manchmal wird das HTML zwar generiert aber nicht angezeigt, weil es nicht valide ist. Es gibt auch die Möglichkeit, das dieser Befehl fehlgeschlagen ist und keine Ergebnisse zurückliefert:

PHP:
$row1 = mysql_fetch_object( $ergebnis1 );

Das wiederrum kann passieren, weil $user nicht richtig gefüllt ist (ich deutete bereits darauf hin, als ich frage, wo dies her kommt). Ich sehe zwar, das es aus der SESSION kommt, aber nicht, wie es darein kommt, und ob nicht irgendwo im Code diese Session-Variable evtl. überschrieben oder gar gelöscht wird.

Du könntest temporär mal folgendes machen: Baue einen else-Block hinter das if( $row1... ), in den du eine Fehlermeldung ausgibst wie "Hier könnte ein Link stehen, wenn du admin wärst". Dann siehst du wenigstens, wo das her kommt. Du kannst es natürlich auch etwas professioneller angehen.

Benutz die angehängte Klasse zum Loggen. Logge immer, wenn du an die Stelle kommst, bevor der Query gesendet wird, den Query in $abfrage1 raus:

PHP:
Logger:log( $abfrage1 );

Dann baust du statt der Ausgabe, die ich weiter oben beschrieben habe, in den else-Block ebenfalls ein Logging:

PHP:
if( $row1 && $row1->admin == '1')  // ist die Spalte 'admin' wirklich ein Character oder eher Integer?
{
  echo '<br/><br/>';
  echo '<a href="admin/admin_change_662712315.php?set=' . intval($id) . '">Diese Seite ändern</a>'; // Habe $id mal forciert auf INT (siehe Anmerkung)
}
else
{
  Logger:log('No admin - no link: $row1->admin = ' . $row1->admin);
}

Mit der Debug-Klasse kannst du - zum Debuggen - Variablen ausgeben. Dadurch wird dir visualisiert, was in der Variable drin steht, und du kannst sehen, ob es mit dem übereinstimmt, was du erwartet hast. Benutzen kannst du das so:

PHP:
// Query starten und Rückgabe prüfen - gut!
$ergebnis1 = mysql_query($abfrage1)
      or die("Error: $abfrage1 <br>".mysql_error());

$row1 = mysql_fetch_object( $ergebnis1 );

Debug::dump( $row1 );

Edit: Achja noch vergessen: Geloggt wird in eine Datei "app.log" welche im gleichen Verzeichnis erstellt und befüllt wird, in dem das aufgerufene Script liegt.
 

Anhänge

Zuletzt bearbeitet:
Hi, habe einen else-befehl hinter das if geschrieben und mich angemeldet! Ich bekomme dann wenn ich auf die Startseite (render.php?set=1 - Problemdatei) die else-meldung! Wenn ich aber vom internen Bereich auf die render.php?set=irgendwasanderes gehe, dann klappts. Ich poste hier nochmal alle codes!

also, nochmal meine render.php:

PHP:
<?php
session_start();

include("l/mysql_connect.php");

$id = intval($_GET['set']);
if (!$id) $id = 1;

$abfrage = "SELECT * FROM sw_homepage_seiten WHERE ID LIKE '$id'";
          $ergebnis = mysql_query($abfrage)
          OR die("Error: $abfrage <br>".mysql_error());
          while($row = mysql_fetch_object($ergebnis))
          {

include("include/variablen.php"); ?>
<!-- Ende Variablen -->




<link rel="SHORTCUT ICON" href="<?php echo "$url"; ?>/images/favicon.ico">
<link rel="STYLESHEET" type="text/css" href="<?php echo "$url"; ?>/css/default.css">
<title><?php echo $row->seitentitel; ?></title>
<!-- Bis hier bitte nichts entfernen -->




<!-- Start
POPUP -->

<!-- Ende
POPUP -->




<!-- Start
Fotobox -->
<script type="text/javascript">
    var GB_ROOT_DIR = "<?php echo "$url"; ?>/js/box/";
</script>
<script type="text/javascript" src="<?php echo "$url"; ?>/js/box/AJS.js"></script>
<script type="text/javascript" src="<?php echo "$url"; ?>/js/box/AJS_fx.js"></script>
<script type="text/javascript" src="<?php echo "$url"; ?>/js/box/gb_scripts.js"></script>
<link href="<?php echo "$url"; ?>/js/box/gb_styles.css" rel="stylesheet" type="text/css" />
<!-- End
Fotobox -->




<!-- Start
Videobox -->
<script type="text/javascript" src="<?php echo "$url"; ?>/js/video/mootools.js"></script>
<script type="text/javascript" src="js/video/swfobject.js"></script>
<script type="text/javascript" src="js/video/videobox.js"></script>
<link rel="stylesheet" href="<?php echo "$url"; ?>/js/video/videobox.css" type="text/css" media="screen" />
<!-- End
Videobox -->




<!-- Start
Header -->
<div id="header"></div>
<!-- End
Header -->





<?php
if ($id=="78926" OR $id=="78927" OR $id=="78928")
{
echo "&nbsp;";
}
else
{
?>
<!-- Start
Navigation -->
<div id="navi"> 
<br><br>
<?php include("include/navigation.html"); ?>
</div>
<!-- Ende
Navigation -->
<? } ?>






<!-- Start
Randbox -->
<?php include("include/randbox.html"); ?>
<!-- Ende
Randbox -->

     

     

<!--Start 
Content -->        
<div id="content"> 
<?php
$user=$_SESSION['username'];

echo "<h1>".$row->ueberschrift."</h1>";
echo $row->Text;

// Wo kommt $user her? Ist das validiert? Außerdem werden nicht alle Spalten sonder nur 'admin' benötigt. LIKE ist hier m.M.n. nicht gut.
$abfrage1 = "SELECT admin FROM sw_portal WHERE username LIKE '$user'";

// Query starten und Rückgabe prüfen - gut!
$ergebnis1 = mysql_query($abfrage1)
      or die("Error: $abfrage1 <br>".mysql_error());

$row1 = mysql_fetch_object( $ergebnis1 );
if( $row1 && $row1->admin == '1')  // ist die Spalte 'admin' wirklich ein Character oder eher Integer?
{
  echo '<br/><br/>';
  echo '<a href="admin/admin_change_662712315.php?set=' . intval($id) . '">Diese Seite ändern</a>'; // Habe $id mal forciertauf INT (siehe Anmerkung)
}
else
{
echo "Kein Admin? Kein Link";
// Wird weiter unten beendet!

?>
</div>
<!-- End
Content -->




<!-- Start
Footer -->
<!-- Kein footer angegeben. Bitte melden Sie sich im ACP an um dieses zu &auml;ndern. -->
<!-- Ende
Footer -->
<? } ?>
<? } ?>

meine loginüberprüfungsseite portal.php:

PHP:
<?php
session_start();
include 'mysql_connect.php';
 
$username = mysql_real_escape_string($_POST['user']);
$password = mysql_real_escape_string($_POST['pass']);
 
$sql = 'SELECT * FROM `sw_portal` WHERE `username` = "'.$username.'" AND `passwort` = "'.$password.'" LIMIT 1';
if(!($result = mysql_query($sql)))
{
    include 'login.php';
}
else {
    $data = mysql_fetch_assoc($result);
    $_SESSION['username']      = $data['username']; //Das ist die $user
    $_SESSION['password']      = $data['passwort'];
    $_SESSION['benutzergroup'] = $data['benutzergroup']; 
    
    include 'start.php';
}

meine start.php:

PHP:
<?php
session_start();
 
switch($_SESSION['benutzergroup']) {
 
    case 'D********Ct':
        include 'ben/D********Ct.php'; // Familie
        break;
 
    case 'F*****04IBgyei':
        include 'ben/F*****04IBgyei.php'; // Kohlfahrt
        break;
 
    case 'imwZ*****qFDr':
        include 'ben/imwZ*****qFDr.php'; // Berlin
        break;
 
    case 'WbZai*****8lJrMwv':
        include 'ben/WbZai*****8lJrMwv.php'; // Meckpomm
        break;
 
    case 'OlS*****TZzeNptZ':
        include 'ben/OlS*****TZzeNptZ.php'; // Eine friends
        break;
 
    default:
        header ('Location: render.php?set=7'); // Loginseite
        break;
}
?>

/* Ich habe in die Codes OlS*****TZzeNptZ u.a. desshalb ** reingemacht, weil diese bei der Registration als Aktivierungscode benötigt werden, aber natürlich nur befugte Menschen in die einzelnen Gruppen darf */

LG, Eike
 
Zurück