|
|
|
[Code PHP] TxTr 2.0 Daten verwalten. Funprojekt
Zurück zur Übersicht So, da ich mitgekriegt habe, dass hier auf mein Code so sehnlichst gewartet wird, hab ich mich trotz meines Fiebers aufgerafft um euch das Projekt zu präsentieren.
Das ganze besteht aus 4 Dateien.
Einer Index Datei, einer functions.php, einer css Datei und einer Sicherheitsdatei. Desweiteren muss ein Verzeichnis erstellt sein.
-------------------------------------
Als erstes, müssen die Dateien&ordner erstellt werden.
index.php
safety.php
functions.php
global.css
-->Ordner "pages"
------------------------------------
Als erstes fangen wir mal mit dem leichten Teil an.
Der index.php
| PHP |
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:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
|
<?php
//Alle Fehlermeldungen ausgeben lassen
ini_set('display_errors', 1);
error_reporting(E_ALL);
//***********************************//
//alle benötigten Dateien einbinden
require_once ('functions.php');
require_once ('safety.php');
//***********************************//
//Sicherheitsabschnitt II durchlaufen lassen
foreach ($_POST as $key => $value) {
$_POST[$key] = htmlentities($value);
}
foreach ($_GET as $key => $value) {
$_GET[$key] = htmlentities($value);
}
//***********************************//
//wichtige $_GET´s festlegen die immer benötigt sind
if(isset($_GET['operator']))
{
$operator = $_GET['operator'];
}
//***********************************//
//wichtige Variablen festlegen
$verzeichnis = "pages";
//***********************************//
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>TxTeR 2.0</title>
<link rel="stylesheet" type="text/css" href="global.css">
</head>
<body>
<div id="wrapper">
<div id="left">
<form action="?operator=create" method="post">
<input type="text" name="filename">
<select name="endung">
<option value="html">.html</option>
<option value="php">.php</option>
<option value="js">.js</option>
<option value="css">.css</option>
</select>
<br>
<textarea cols="50" rows="14" name="content" id="content"></textarea><br>
<input type="submit" value="erstellen">
</form>
<hr>
<?php
//prüfen ob Verzeichnis leer ist, wenn nicht folgende MÖGLICHKEITEN ausgeben
//-->existierende Datei lesen
//-->existierende Datei bearbeiten
//-->existierende Datei löschen
check_dir(FALSE); //Verzeichniss wird geprüft
if ($empty == FALSE)
{
?>
<form action="?operator=read" method="post">
<select name="filename">
<?php
//alle lesbaren Dateien ausgeben
$action=opendir($verzeichnis);
while($filename=readdir($action)){
if(!preg_match("!(\.|\..)$!", $filename)){
?>
<option value="<?php echo $filename ?>" ><?php echo $filename ?></option>
<?php
}
}
?>
</select>
<input type="submit" value="Ansehen">
</form>
<hr>
<form action="?operator=update" method="post">
<select name="filename">
<?php
$action=opendir($verzeichnis);
//alle veränderbaren Dateien ausgeben
while($filename=readdir($action)){
if(!preg_match("!(\.|\..)$!", $filename)){
?>
<option value="<?php echo $filename ?>" ><?php echo $filename ?></option>
<?php
}
}
?>
</select>
<input type="submit" value="Bearbeiten">
</form>
<hr>
<form action="?operator=delete" method="post">
<select name="filename">
<?php
$action=opendir($verzeichnis);
//alle löschbare Dateien ausgeben
while($filename=readdir($action)){
if(!preg_match("!(\.|\..)$!", $filename)){
?>
<option value="<?php echo $filename ?>" ><?php echo $filename ?></option>
<?php
}
}
?>
</select>
<input type="submit" value="Delete">
</form>
<?php
} // Ende der Verzeichnissprüfung
//***********************************//
?>
</div>
<div id="right">
<?php
echo check_dir(TRUE); //für den rechten Bereich prüfen ob Dateien vorhanden sind
//Die folgenden Operatoren werden die Aufgaben bewirken.
if (isset($operator)) //prüfen ob Operator aus einem der Form´s gesetzt wurde.
{
if ($operator == "create") //Hier wird ein neues Dokument erstellt
{
$filename = $_POST['filename'];
$content = $_POST['content'];
if ($content == "")
{
$content == "unset";
}
$endung = $_POST['endung'];
echo $operator($filename, $content, $endung);
}
elseif ($operator == "save") //Hier wird ein verändertes Dokument gespeichert
{
$filename = $_GET['filename'];
$content = $_POST['content'];
echo $operator ($filename,$content);
}
elseif ($operator == "update") //Hier wird ein veränderbares Dokument aufgerufen
{
$filename = $_POST['filename'];
echo $operator ($filename);
}
elseif ($operator == "read") //Hier wird ein DokumentInhalt ausgegeben
{
$filename = $_POST['filename'];
echo $operator ($filename);
}
elseif ($operator == "delete") //Hier wird ein Dokument gelöscht
{
$filename = $_POST['filename'];
echo $operator ($filename);
}
else
{
echo "kein gültiger operator"; //Falls irgendein anderer Operator gesetzt wurde.
}
}
?>
</div>
<div id="bottem">
<a href="index.php">Refresh this page</a><br />
</div>
</div>
</body>
</html>
|
|
-----------------------------
Das ist erstmal vielleicht ein bisschen wuchtig, aber Grundsätzlich lässt es sich leicht verstehen.
Bevor der erste HTML Teil ausgegeben wird, werden wichtige Information festgelegt.
Dann werden die einzelnden Möglichkeiten, die zur Zeit des Scriptaufrufes bestehen aufgeführt.
Als letztes wird auf der rechten Seite die aktuelle gewünschte Funktion ausgeführt.
Das Design ist sehr schlicht gehalten. Die Seite hat einen linken Teil und einen rechten Teil.
Die nötige CSS Datei sieht so aus:
| Code |
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:
|
/*-----------------------------------------------------------*/
/* Hier kommt mein eigener Stylesheet */
/*-----------------------------------------------------------*/
body {
background-color: grey;
}
#left {
width: 50%;
height: 90%;
float: left;
}
#right {
width: 50%;
height: 90%;
float:right;
}
#bottem {
width: 100%;
height: 10%;
padding-top: 40%;
} |
|
----------------------------------------
Damit steht das Grundgerüst.
Aber das bringt uns noch nicht soviel, da ja noch die ganzen Funktionen fehlen und der erste Sicherheitsabschnitt.
Also werden wir uns nun mal das Sicherheitsscript angucken:
safety.php
| PHP |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
|
<?php //PHP
$_GET = array_map('trim', $_GET);
$_POST = array_map('trim', $_POST);
$_COOKIE = array_map('trim', $_COOKIE);
$_REQUEST = array_map('trim', $_REQUEST);
if(get_magic_quotes_gpc()):
$_GET = array_map('stripslashes', $_GET);
$_POST = array_map('stripslashes', $_POST);
$_COOKIE = array_map('stripslashes', $_COOKIE);
$_REQUEST = array_map('stripslashes', $_REQUEST);
endif;
//$_GET = array_map('mysql_real_escape_string', $_GET);
//$_POST = array_map('mysql_real_escape_string', $_POST);
//$_COOKIE = array_map('mysql_real_escape_string', $_COOKIE);
//$_REQUEST = array_map('mysql_real_escape_string', $_REQUEST);
?>
|
|
Ich habe den unteren Teil in der Datei ausgeklammert, da wenn ich NUR mit diesem Projekt arbeite, ich keine DB benutze. Ansonsten muss vor dem einbinden dieser safety.php bereits der DBConnect auftreten.
BSP für einen Header:
| PHP |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
|
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
require_once ('dbconnect.php');
$link = mysql_connect("$host","$dbuser","$dbpw") or die ("Keine Verbindung moeglich");
mysql_select_db("$dbnum") or die ("Die Datenbank existiert nicht");
require_once ('functions.php');
require_once ('safety.php');
foreach ($_POST as $key => $value) {
$_POST[$key] = mysql_real_escape_string(htmlentities($value));
}
//This stops SQL Injection in GET vars
foreach ($_GET as $key => $value) {
$_GET[$key] = mysql_real_escape_string(htmlentities($value));
}
?>
|
|
-----------------------------------------
So als letztes fehlt noch die wichtigste und gleichzeitig schwierigste Datei vor uns.
die functions.php
Damit das ein bisschen einfach wird, geh ich Schrittweise vor.
Als erstes erarbeiten wir uns die Funktion check_dir($speak).
| PHP |
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:
|
<?php
function check_dir($speak)
{
$ordner=opendir("pages"); //verzeichniss innerhalb der PHP funktion wird gewählt.
$handle = $ordner; //nur der Bezeichnungshalber ändere ich hier den Variablennamen.
$i=0; //Counter für 'gefundene Dateien'
while($f = readdir($handle)) //hier fängt er an das Verzeichniss zu lesen
{
if($f == "." || $f == "..") continue; //Hier lösche ich die beiden Standard Dateien "." und ".." heraus.
$i++; //bei allen anderen Dateien die er findet, soll er den Counter um 1 erhöhen.
}
closedir($handle); //Hier schließt er das Verzeichniss wieder.
if($i == 0) //Falls kein Ergebniss soll er die Variable $empty (DT.Leer) auf Wahr setzen.
{
global $empty;
$empty = TRUE;
if ($speak == TRUE) //soll auch eine Textausgabe erfolgen, ja & nein
{
return "Keine Dateien vorhanden";
}
}
else //Wenn er also ein Ergebnis gefunden hat, soll er $empty auf Falsch setzen.
{
global $empty;
$empty = FALSE;
}
}
?>
|
|
Wie ihr an dem bisherigen Quellcode sehen könnt, lasse ich einmal am Anfang in der index.php prüfen ob Dateien vorhanden sind. Denn da soll er dann mir, wenn welche vorhanden sind die Möglichkeiten für die Dateien anzeigen. Ansonsten soll er sie komplett maskiert lassen.
Dort steht die Variable auf FALSE weil ich nur prüfen will wie die Variable ist.
Das zweite mal, lass ich die Funktion in dem Div right als erstes aufrufen um zu prüfen, ob es erlaubt ist mit den Operatoren umzugehen oder nicht.
---------------------------------
Jetzt kommt die Create funktion. Damit lassen sich neue Dateien erstellen. Anders, als bei den meisten Scripts ist es hier ERLAUBT verschiedene Endungen zu wählen, da durch die Sicherheitsabschnitte nichts schlimmes passieren kann.
| PHP |
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:
|
<?php
function create($filename, $content, $endung) //Dateiname Inhalt und Endung der Datei wird benötigt
{
if (empty($filename)) //prüft ob ein Dateiname eingegeben wurde
{
return "Kein Dateiname angeben";
exit;
}
if (empty($content)) //prüft ob ein Inhalt eingegeben wurde
{
return "Kein Inhalt angeben";
exit;
}
//************************//
echo "<br />";
$datei = $filename.'.'.$endung; //hier wird aus den beiden einzelstücken wieder ein ganzes.
$error = false; //Error wird intern genutzt um zu prüfen, ob ein Fehler auftritt oder nicht.
if (empty($datei))
{
return "";
$error = true;
}
if ($error)
{
return "Ein fehler ist aufgetreten!";
}
else //Falls kein Fehler bei der initialisierung der Datei auftritt, soll diese nun erstellt werden.
{
if (file_exists("pages/".$datei)) //prüft ob eine Datei des selben Namens bereits vorhanden ist.
{
return "Eine datei mit dem selben Namen ist bereits vorhanden<br>";
}
else //Hier wird die neue Datei erstellt
{
$fp = fopen("pages/".$datei, "w");
fwrite($fp, $content);
fclose($fp);
return "Die Datei $datei wurde erstellt<br>";
return $datei;
}
}
}
?>
|
|
Damit lassen sich nun beliebig viele Dateien erstellen. Wichtig dabei anzumerken, die Dateien lassen sich dann bei "richtigen" Scripten auch includieren, also aufgepasst.
----------------------
Jetzt wollen wir uns aber eine Datei ansehen, also brauchen wir die Funktion read.
| PHP |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
|
<?php
function read($filename) //Der Dateiname wird benötigt.
{
$datei = $filename; //Einfach zur übersichtlichkeit beitragend wird hier der Variablenname geändert.
if (file_exists("pages/".$datei)) //prüft ob die angeforderte Datei auch wirklich existiert
{
$d2 = include("pages/".$datei);
$patterns = '/1/';
$replacements = '<br />';
return preg_replace($patterns, $replacements, $d2);
}
else
{
return "Error"; //Falls Datei vorhanden, Fehler ausgeben
}
}
?>
|
|
Damit wird nun der Inhalt der Datei angezeigt. Es kann kein Schadcode enstehen, da der gesamte Inhalt nicht geparsed wird. Also weder HTML noch JAVASCRIPT noch PHP scripte gehen.
--------------------------------
Jetzt wollen wir eine Datei löschen.
| PHP |
1:
2:
3:
4:
5:
6:
7:
8:
|
<?php
function delete($filename)
{
unlink ("pages/".$filename);
return "gelöscht";
}
?>
|
|
Das ist so ziemlich die kürzeste funktion jemals. Wie bereits bei den anderen Funktionen wird der Name verlangt, und dann wird einfach die Datei per unlink gelöscht.
-------------------------
so jetzt haben wir noch zwei Funktionen vor uns, die beide miteinander zu tun haben.
Zum ersten, die Funktion update.
| PHP |
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:
|
<?php
function update($filename) //Dateiname wird benötigt
{
$datei = $filename;
if (file_exists("pages/".$datei)) //prüft ob die Datei existiert
{
if (is_writable("pages/".$datei)) //prüft ob die Datei beschreibbar ist
{
?>
<form action="?operator=save&filename=<?php echo $datei ?>" method="post">
<textarea cols="50" rows="14" name="content" id="content"><?php
$handle = fopen("pages/".$datei, "r");
$contents = fread($handle, filesize("pages/".$datei)); //gibt den bereits vorhandenen Inhalt der Datei aus
fclose($handle);
echo $contents;
?></textarea><br>
<input type="submit" value="Update">
</form>
<?php
}
else
{
echo "nicht schreibbar";
}
}
else
{
echo "$datei existiert nicht";
}
}
?>
|
|
Das hier ließe sich nun noch durch schicke Buttons erweitern, was aber für den eigentlichen Zweck total unnütz ist.
--------------------
Nun kommt die letzte Funktion die benötigt wird.
Die save funktion
| PHP |
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:
|
<?php
function save($filename, $content) //Der Dateiname und der Inhalt wird benötigt
{
if (file_exists("pages/".$filename)) //prüft ob die angeforderte Datei auch wirklich existiert
{
if (is_writable("pages/".$filename)) //prüft ob die angeforderte Datei schreibbar ist
{
if (!$handle = fopen("pages/".$filename, "w+")) //hier prüft er nun ob die Datei sich öffnen lässt
{
return "Kann die Datei \"$filename\" nicht öffnen";
exit;
}
if (!fwrite($handle, $content))
{
return "Kann in die Datei \"$filename\" nicht schreiben";
exit;
} //bei diesem Abschnitt ist anzumerken, dass ich das erfüllen über das Gegenereigniss löse.
else
{
return "Fertig, in Datei \"$filename\" wurde \"$content\" geschrieben";
}
}
fclose($handle);
}
else
{
return "Die Datei $filename ist nicht schreibbar";
}
}
else
{
return "$filename existiert nicht!";
}
}
?>
|
|
-----------------
So damit habt ihr nun alles, was ihr braucht.
Morgen werde ich noch eine Kleinigkeit hinzufügen. Und zwar eine weitere Datei über welche sich bestimmte Settings festlegen lassen, so wie z.B. das Verzeichniss. Maximale Länge einzelner Datein. Die Möglichkeit per array die Dateiendungen zu verändern.
Desweiteren werde ich morgen ein komplettpaket mit alles nötigen Dateien zur verfügung stellen
ACHTUNG ICH BEARBEITE DIESEN BEITRAG NOCH!
Kommentare
Zurück zur Übersicht
Autor Vielgeist
|
|
|
|