• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

[PHP] Template System + SEO-URLs funktioniert nicht korrekt

dstN

Més que un Club!

Registriert
19 Nov. 2013
Beiträge
89
Ort
/dropbox/
Hallo,

ich habe hier folgendes System, dass es mir ermöglicht für einzelne Bereiche der index.php andere Inhalte einblenden zu lassen:

[src=php]class Controller {
var $name;
var $dir;
function __construct($name, $dir = 'src') {
$this->name = $name;
$this->dir = $dir;
if(isset($_GET['page'])) {
if(file_exists($this->dir.'/'.$_GET['page'].'_'.$this->name.'.php')) {
require($this->dir.'/'.$_GET['page'].'_'.$this->name.'.php');
}
else {
require($this->dir.'/'.$this->name.'.php');
}
}
else {
require($this->dir.'/'.$this->name.'.php');
}
}
}[/src]

Aufgerufen wird dann im Template folgendermaßen:

[src=php]<?php $content = new Controller('content'); ?>[/src]

Die Datei die dann eingefügt wird, heiß dann seitenname_content.php

Folgendes funktioniert: Aufruf der Seiten via href="index.php?page=seitenname"

Ich wollte aber, dass statt dem href einfach nur der Seitenname dasteht also: href="seitenname"

Dazu folgende .htaccess:
[src=apache]RewriteEngine on

RewriteBase /

RewriteCond %{REQUEST_URI} !^/+(admin|images)/?
RewriteCond %{REQUEST_URI} !(\..{2,4})$
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)$ index.php?page=$1&%1 [L][/src]

Das funktioniert nur leider nicht. Aufruf der "index.php" erfolgt immer in ein 404-Fehler und der Aufruf anderer Seiten funktioniert zwar, aber es wird immer der Inhalt der standard content.php geladen, statt der seitenname_content.php.

Ich dachte erst, dass es an 1und1 liegt, weshalb ich extra eine Subdomain angelegt habe, die direkt in das Verzeichnis routet, in der mein Projekt liegt.. doch auch damit funktioniert es nicht. Weiß jemand Rat?
 

Kugelfisch

Nerd

Registriert
12 Juli 2013
Beiträge
2.342
Ort
Im Ozean
Ist die RewriteBase korrekt? Lasse dir ggf. einmal $_GET['page'] in deinem PHP-Skript ausgeben und stelle sicher, dass der Seitenname beim Aufruf über die Rewrite-Regel enthalten ist. Abgesehen davon würde sich statt
[src=apache]RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)$ index.php?page=$1&%1 [L][/src]
anbieten, zur Erhaltung des Query-Strings die in mod_rewrite in Form des [QSA]-Flags enthaltene Funktionalität zu nutzen:
[src=apache]RewriteRule ^.*$ index.php?page=$0 [QSA,L][/src]

Beachte auch, dass du über
[src=php] if(file_exists($this->dir.'/'.$_GET['page'].'_'.$this->name.'.php')) {
require($this->dir.'/'.$_GET['page'].'_'.$this->name.'.php');
}[/src]
eine kritische Local-File-Inclusion-Schwachstelle aufreisst, so wäre es z.B. möglich, über einen GET-Parameter der Form`page=../../../../../etc/passwd%00` beliebige Dateien auf deinem Server auszulesen und als PHP-Code verarbeiten zu lassen. Du solltest zumindest sicherstellen, dass $_GET['page'] ausschliesslich alphanumerische Zeichen enthält.
 

dstN

Més que un Club!

Registriert
19 Nov. 2013
Beiträge
89
Ort
/dropbox/
  • Thread Starter Thread Starter
  • #3
Ist die RewriteBase korrekt? Lasse dir ggf. einmal $_GET['page'] in deinem PHP-Skript ausgeben und stelle sicher, dass der Seitenname beim Aufruf über die Rewrite-Regel enthalten ist.

echo von $_GET['page'] ist "kunden/kunde/seitenname" - Projekt liegt auf meinem Server unter domain.de/kunden/kunde - und obwohl die Subdomain kunde.domain.de genau in das Verzeichnis reinroutet, entstehen hinter der Subdomain die Links "/kunden/kunde/seitenname" - was für mich persönlich keinen Sinn macht, aber es passiert. Das System scheint also eigentlich zu funktionieren, nur lädt er nicht den korrekten Content des jeweiligen Seitennamen.

//Edit: Wenn ich die ReWriteBase auf "/kunden/kunde" ändere, kriege ich 404er.

Abgesehen davon würde sich statt
[src=apache]RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)$ index.php?page=$1&%1 [L][/src]
anbieten, zur Erhaltung des Query-Strings die in mod_rewrite in Form des [QSA]-Flags enthaltene Funktionalität zu nutzen:
[src=apache]RewriteRule ^.*$ index.php?page=$0 [QSA,L][/src]

Danke, habe ich mich mal so übernommen.

Beachte auch, dass du über
[src=php] if(file_exists($this->dir.'/'.$_GET['page'].'_'.$this->name.'.php')) {
require($this->dir.'/'.$_GET['page'].'_'.$this->name.'.php');
}[/src]
eine kritische Local-File-Inclusion-Schwachstelle aufreisst, so wäre es z.B. möglich, über einen GET-Parameter der Form`page=../../../../../etc/passwd%00` beliebige Dateien auf deinem Server auszulesen und als PHP-Code verarbeiten zu lassen. Du solltest zumindest sicherstellen, dass $_GET['page'] ausschliesslich alphanumerische Zeichen enthält.

Wie kann ich denn einen alphanumerischen Filter hinzufügen? Bin noch relativ am "Anfang" meiner php-Künste, um ehrlich zu sein.
 

Kugelfisch

Nerd

Registriert
12 Juli 2013
Beiträge
2.342
Ort
Im Ozean
echo von $_GET['page'] ist "kunden/kunde/seitenname" - Projekt liegt auf meinem Server unter domain.de/kunden/kunde - und obwohl die Subdomain kunde.domain.de genau in das Verzeichnis reinroutet, entstehen hinter der Subdomain die Links "/kunden/kunde/seitenname" - was für mich persönlich keinen Sinn macht, aber es passiert.
Das hängt davon ab, wie genau die Subdomains und deren Verzeichnis-Zuordnungen intern realisiert sind. Anyway, in deinem Fall wäre
[src=apache]RewriteBase /kunden/kunde/[/src]
passend (inklusive dem abschliessenden Slash).


Wie kann ich denn einen alphanumerischen Filter hinzufügen? Bin noch relativ am "Anfang" meiner php-Künste, um ehrlich zu sein.
Zum Beispiel indem du alle nicht-Alphanumerischen Zeichen ([^\w], d.h. nicht a-z, A-Z, 0-9, _) entfernst ...
[src=php]$page = preg_replace('/[^\w]/', '', (string)($_GET['page']));[/src]
... und in Folge $page verwendest.
 
Oben