You are not logged in.

  • Login

1

Monday, August 20th 2007, 9:27am

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:

PHP Quellcode

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


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

2

Monday, August 20th 2007, 12:10pm

... 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....

3

Monday, August 20th 2007, 12:16pm

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:

PHP Quellcode

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


hier board.php:

PHP Quellcode

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


Und abschließend noch subboard.php:

PHP Quellcode

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


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

4

Monday, August 20th 2007, 2:27pm

naja, dann musst du die Links von subboard.php?id=$id in index.php?page=subboard&id=$id ändern.

5

Monday, August 20th 2007, 2:42pm

Hmm - wusste gar nicht, dass das geht. Habe es jetzt versucht und mal folgendermaßen abgeändert:

index.php:

PHP Quellcode

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


board.php(auszug):

PHP Quellcode

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


navi.php:

PHP Quellcode

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


Funktioniert aber nicht:

PHP Quellcode

1
2
3
4
Home Board   
 Warning:  include(subboard.php?id=nedias) [function.include]: failed to open stream: Invalid argument in C:\xampp\htdocs\test\index.php on line 8
 
 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

6

Monday, August 20th 2007, 2:55pm

Habe ich da irgendwas falsch verstanden???

zumindest hast du falsch abgeschrieben... schau nochmal mein Posting an. Und lass auch die Index, wie sie war.

7

Monday, August 20th 2007, 3:07pm

Was ein zusätzliches .php alles bewirken kann... :(

Danke - jetzt funktioniet es.

KageMurai

8

Monday, August 20th 2007, 3:33pm

Was ein zusätzliches .php alles bewirken kann...

das 2te Fragezeichen war schuld: index.php?page=x?var=x

9

Monday, August 20th 2007, 4:17pm

PHP Quellcode

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


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. ;)

10

Monday, August 20th 2007, 4:29pm

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.

11

Tuesday, August 21st 2007, 12:09pm

Genau das war mir auch aufgefallen... ;)

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

PHP Quellcode

1
2
3
4
switch ($_GET['page']) {
case 'page1': include('page1.php'); break;
case 'page2': include('page2.php'); break;
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.

SQL Code

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

12

Tuesday, August 21st 2007, 12:59pm

Und noch einfacher - meiner Meinung nach:

PHP Quellcode

1
2
3
4
5
$cases = array('page1','page2'); // usw.
if(in_array($_GET['page'],$cases)) $page = $_GET['page'].'.php';
else $page = 'home.php';
 
include($page);

13

Tuesday, August 21st 2007, 2:33pm

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:


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

SQL Code

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

melwood

14

Thursday, August 23rd 2007, 11:28am

Unter http://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.

15

Thursday, August 23rd 2007, 11:38am

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.

16

Thursday, August 23rd 2007, 5:12pm

Unter http://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.

melwood

17

Sunday, August 26th 2007, 10:22am

Man lernt ja nie aus.
Ne, bingt wirklich nichts. Hab eure Argumentation verstanden.
Danke! :)

Social bookmarks