Seite 2 von 7

Re: Frage an die PHP-Experten...

Verfasst: 08.03.2010, 15:49
von Fightmeyer
Mic hat geschrieben:Wie genau möchtest du denn die Aktfotos von dir schützen? Vor dem Verlinken auf anderen Seite oder grundsätzlich, also der direkte Aufruf?
Sowohl als auch. Ich habe mir ein entsprechende "Galleriefunktion" in php geschrieben, über die die Bilder angezeigt werden und das sollte eigentlich auch der einzige Weg sein, diese bilder zu Gesicht zu bekommen.
Mic hat geschrieben: Für ersteres ist mod_rewrite (wieder) dein Freund. Du legst eine .htaccess in das Verzeichnis mit den Bildern, die folgenden Inhalt haben sollte:

Code: Alles auswählen

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?deinedomain.de/.*$ [NC]
RewriteRule .(gif|jpg|png|GIF|JPG|PNG)$ http://www.deinedomain.de/ersatz.gif [R,L]
Sie macht folgendes:
Sobald eine Grafik geladen wird (gif, png, jpg), wird die Grafik http://www.deinedomain.de/ersatz.gif angezeigt, also nicht das ursprüngliche Bild. Mit einer Ausnahme, und zwar wenn die Grafik von der Domain http://www.deinedomain.de geladen wird, welche deine sein sollte.

Willst du aber grundsätzlich den Aufruf verhindern, würde ich so langsam deine grundsätzliche Herangehensweise überdenken. Vielleicht solltest du den kompletten Auftritt per .htaccess schützen. In dieser .htaccess könntest du dann Benutzer anlegen.
Damit habe ich mal angefangen. Aber da ich auf der Seite selber ja noch verschiedene Berechtigungen habe (für den Adminbereich), bin ich dann dazu übergegangen, das ausschließlich über PHP umzusetzen, um eine doppelte Anmeldung zu vermeiden.

Die User hätten ja sonst immer erst die Anmeldung via htaccess und dann noch meine PHP-Anmeldung. Das wäre unschön. Oder kann man den angemdeleten htaccess-Namen irgendwie an php übergeben?

Re: Frage an die PHP-Experten...

Verfasst: 08.03.2010, 16:02
von Mic
Fightmeyer hat geschrieben:Die User hätten ja sonst immer erst die Anmeldung via htaccess und dann noch meine PHP-Anmeldung. Das wäre unschön. Oder kann man den angemdeleten htaccess-Namen irgendwie an php übergeben?
Jau, darauf kannst du direkt zugreifen:

Code: Alles auswählen

$_SERVER['PHP_AUTH_USER']
$_SERVER['PHP_AUTH_PW']

Re: Frage an die PHP-Experten...

Verfasst: 08.03.2010, 16:06
von Fightmeyer
Cool! Daß das geht hätte ich nciht gedacht. Na dann mach ichs mit dem Verzeichnisschutz...
Danke für den Tipp!

Re: Frage an die PHP-Experten...

Verfasst: 08.03.2010, 20:08
von Beowulf
Du kannst diese zu schützenden Bilder und die PHP-Dateien, die diese einbinden, in ein und das selbe Verzeichnis packen. Damit schlägst du zwei Fliegen mit einer Klappe: Wenn sich die Leute per htaccess einloggen, um auf die PHP-Datei zuzugreifen, sind die Bilder auch automatisch freigeschaltet! :)

Re: Frage an die PHP-Experten...

Verfasst: 08.03.2010, 20:12
von Fightmeyer
@Mic

Mal noch ne Frage:
GIbts ne vergleichbare Funktion auch, um die htaccess-Gruppe in der der User ist, auszulesen?

Re: Frage an die PHP-Experten...

Verfasst: 08.03.2010, 22:47
von Mic
Spontan wüsste ich da nichts, da ich auch noch nie etwas in dieser Richtung gebraucht habe. Da müsstest du schon Google bemühen. Ansonsten könntest du die .htgroup auch einfach mit PHP auslesen.

Re: Frage an die PHP-Experten...

Verfasst: 10.03.2010, 12:55
von Fightmeyer
Also ne hauseigene PHP-Funktion gibts da zu anscheinend nicht. Ich hab allerdings einen Codefetzen gefunden, der die Gruppendatei ausliest und gegen den Nutzernamen abgleicht.
Beides übergebe ich nach der Anmeldung dann an eine PHP-Session und von da an funktionierts dann wie gehabt.
Der User hat dann nur eine einzige Anmeldung (die von .htaccess), die Berechtigungen auf der Seite werden dann aber via PHP ausgesteuert.

Re: Frage an die PHP-Experten...

Verfasst: 30.03.2010, 13:30
von Fightmeyer
Mal wieder ne Frage...:

Ich habe in meinem CMS-Bereich auch ne News-Eingabe, die Formatierungen über diverse Buttons unterstützt. Das funktioniert auch so weit.

Als Beispiel: Man markiert im Eingabefeld ein Wort, drückt den Button für "FETT" und das Wort wird dann von den HTML-Tags <b>Wort</b> eingerahmt.
Da könnte man das natürlich so lassen. Wenn man das gleiche aber nun mit einem Link machen will, sieht der HTML-Tag ja schon wesentlich umfangreicher und für den Laien ziemlich verwirrend aus.
Da würd ich das Ganze dann in etwa so abspeichern wollen:
[LINK,n,http://hastenichgesehen.de]Linktext[/LINK]

(das n soll für "neues Fenster" stehen bzw. alternativ g für "gleiches Fenster")

Das ganze muss ja dann während der Laufzeit bzw. während es geparsed wird in vernünftigen HTML-Code umgewandelt werden. Das kann ich jetzt natürlich aufwändig über entsprechende Textfunktionen von PHP machen, aber vielleicht gibts ja da von Hause aus einige sinnvolle PHP-Funktionen.

Kennt da jemand was?

Re: Frage an die PHP-Experten...

Verfasst: 31.03.2010, 00:25
von DasJan
Das klingt nach einem Fall für reguläre Ausdrücke. Hier ist die Doku der PHP-Funktionen, hier kannst du dich allgemein zum Thema informieren.

Das Jan

Re: Frage an die PHP-Experten...

Verfasst: 31.03.2010, 18:32
von Fightmeyer
Danke für den Link. Ich habs jetzt aber zwischenzeitlich schon so gelöst:

Meine Formatierungstags sehen relativ simpel aus.
Anstatt <b> </b> habe ich zum Beispiel <fett> </fett>. Ähnlich das ganze beim Unterstreichen oder Kursiv-schreiben.

Etwas kniffliger sind da die Links.
Die sehen bei mir so aus:
[LINK,n,URL=http://www.heise.de]Heise[/LINK]

Wobei das "n" für target="_blank" steht. (alternativ "s" für target="_self" bzw. leer)

Der PHP-Code dafür sieht nun so aus.

Code: Alles auswählen

	function textaufbereiter($langtext)
		{
			//fett-eröffnungstag setzen
			$langtext = str_replace("[fett]", "<b>", $langtext);
			//fett-endetag setzen
			$langtext = str_replace("[/fett]", "</b>", $langtext);
			//kursiv-eröffnungstag setzen
			$langtext = str_replace("[kursiv]", "<i>", $langtext);
			//kursiv-endetag setzen
			$langtext = str_replace("[/kursiv]", "</i>", $langtext);
			//unterstrichen-eröffnungstag setzen
			$langtext = str_replace("[unterstrichen]", "<u>", $langtext);
			//unterstrichen-endetag setzen
			$langtext = str_replace("[/unterstrichen]", "</u>", $langtext);
			//html-zeilenumbruch setzen
			$langtext = nl2br($langtext);
			
			//Link-Anfang aufbereiten
			$startpos="";
			$startpos=strpos($langtext,"[LINK,");
			
			//so lange durch den Text gehen, bis kein Link mehr gefunden
			while ($startpos<>"") {
				//für jeden gefundenen Link erstmal ermitteln wo der Eröffnungstag zu Ende ist
				$endpos=strpos($langtext,"]",$startpos);
				//für jeden gefundenen Link den Endetag ermitteln
				$endtagpos=strpos($langtext,"[/LINK]",$startpos);
				//wenn Link gefunden, dann erstmal Zielfenster auslesen
				switch (substr($langtext,$startpos+6,1)){
					case "n": $zielfenster=" target=\"_blank\"";
						break;
					case "s": $zielfenster=" ";
						break;
				}
				//URL auslesen
				$url=substr($langtext,$startpos+12,$endpos-$startpos-12);
				//Linktext auslesen
				$linktext=substr($langtext,$endpos+1,$endtagpos-$endpos-1);
				//css-Format für den Link festlegen
				$css=" class=\"link_auf_weiss_fett\"";
				//den selbsdefiniertenTag zusammenbauen
				$selflink="[LINK,".substr($langtext,$startpos+6,1).",URL=".$url."]".$linktext."[/LINK]";
				//alle Bestandteile zu einem HTML-Link zusammenfügen
				$link="<a href=\"".$url."\"".$zielfenster.$css.">".$linktext."</a>";
				//selbstdefinierten Link gegen HTML-Link austauschen
				$langtext = str_replace($selflink, $link, $langtext);
				
				//nach dem nächsten Link suchen
				$startposnext="";
				$startposnext=strpos($langtext,"[LINK,",$startpos);
				if ($startposnext<>""){
					$startpos=$startposnext;
					}
				else {
					$startpos="";
				}
			}
			
			return $langtext;
		}
Funzt prima.

Re: Frage an die PHP-Experten...

Verfasst: 01.04.2010, 00:37
von elevar
Reguläre Ausdrücke begegnen einem an vielen Ecken der Programmierung, nicht nur bei PHP, und sind wirklich mächtig. Es lohnt sich also, sich das mal näher anzuschauen, nicht zuletzt, da es viel performanter ist als alles, was man sich da selbst zusammenbasteln kann.

Dein Problem könnte man so lösen:

Code: Alles auswählen

$string = "In diesem Text ist ein [LINK,n,http://www.web.de]Link[/LINK] eingebaut!";

function link_zusammensetzen($matches) {
	/* In $matches werden die Treffer als Array übergeben */
	$result = "<a ";
	switch($matches[1]) {
		case "n": 
			$result .= "target=\"_blank\" ";
			break;
		case "s":
			$result .= "target=\"_self\" ";
			break;
	}
	$result .= "href=\"{$matches[2]}\">{$matches[3]}</a>";
	return $result;
}

print preg_replace_callback(
	/* Es folgt ein sogenannter regulärer Ausdruck */
	"/\[LINK(?:,([a-zA-Z]))?,(.*?)\](.*?)\[\/LINK\]/is",
	/* Die Funktion mit dem untenstehenden Namen wird für das Ersetzen eines Treffers aufgerufen */
	"link_zusammensetzen",
	$string
);
Der reguläre Ausdruck mag zunächst ziemlich wirr aussehen. Bei Interesse kannst du dir mit diversen Tutorials das Wissen anlesen, das du brauchst um den Ausdruck zu verstehen. Oder du fragst einfach hier nochmal nach.

Re: Frage an die PHP-Experten...

Verfasst: 01.04.2010, 08:04
von Hans
Denke auch, dass reguläre Ausdrücke hier das Mittel der Wahl sein sollten. Abgesehen von der Performance ist das Konstrukt von elevar auch sehr viel weniger fehleranfällig als deines.

Re: Frage an die PHP-Experten...

Verfasst: 01.04.2010, 08:17
von Fightmeyer
Das sieht in der Tat um einiges kürzer aus...

Aber ich steig irgendwie nicht hinter die Syntax von dieser Prüfung:

Code: Alles auswählen

"/\[LINK(?:,([a-zA-Z]))?,(.*?)\](.*?)\[\/LINK\]/is",
Kann mir das mal jemand erklären?!

2. Frage: Ist das richtig, dass da keine ";" am Ende stehen, sondern nur "," ??

Re: Frage an die PHP-Experten...

Verfasst: 01.04.2010, 09:45
von DasJan
Fightmeyer hat geschrieben:2. Frage: Ist das richtig, dass da keine ";" am Ende stehen, sondern nur "," ??
Ja. Das Statement erstreckt sich über mehrere Zeilen und sieht insgesamt so aus:

Code: Alles auswählen

preg_replace_callback( $regexp, "link_zusammensetzen", $string);
Jan

Re: Frage an die PHP-Experten...

Verfasst: 01.04.2010, 11:34
von Mic
Um es noch ein weniger verwirrender zu machen, möchte ich noch eine Alternative vorschlagen:

So, wie du es ja vorhast, werden die Formatierungen direkt vorgenommen. Was zur Folge hat, dass diese Änderungen beim Editieren von News sofort mit angezeigt werden. Wenn du aber erst bei der Ausgabe die Formatierungen vornimmst, so bleibt die Originalformatierungen unangetastet.

Ein entsprechendes Beispiel:

Code: Alles auswählen

// $news wäre das, was in der DB stehen würde.
$news = 'Dies ist ein [LINK,blank,http://hastenichgesehen.de]Linktext[/LINK].';
echo $news.'<br/>'; // Ausgabe zum Testen
// Mittels preg_replace formatieren wir um
$news = preg_replace('/\[LINK,([a-zA-Z]*),([^\]]*)\]([^\[]*)\[\/LINK\]/', '<a href="/$2" target="_$1">$3</a>', $news);
echo $news; // Ausgabe zum Testen
Kurze Schritt-für-Schritt-Erklärung zum regulären Ausdruck:
gesucht wird das, wobei der Inhalt natürlich variieren kann:

Code: Alles auswählen

[LINK,blank,http://hastenichgesehen.de]Linktext[/LINK]
Zuerst werden PHP-interne Zeichen maskiert (z.B. aus [ wird \[)

Code: Alles auswählen

\[LINK,blank,http://hastenichgesehen.de\]Linktext\[\/LINK\]
Dann setzt man das in Klammern, worauf man für die Ersetzung zugreifen will.

Code: Alles auswählen

\[LINK,(blank),(http://hastenichgesehen.de)\](Linktext)\[\/LINK\]
(blank) kann ja auch self beinhalten. Auf alle Fälle Buchstaben. Mit [a-zA-Z] sucht man ausschließlich nach Buchstaben, unabhängig davon, ob sie klein oder groß geschrieben werden. Mit dem Sternchen am Ende sagt man noch, dass die Anzahl egal ist.

Code: Alles auswählen

\[LINK,([a-zA-Z]*),(http://hastenichgesehen.de)\](Linktext)\[\/LINK\]
Beim Link kann vieles vorkommen. Da habe ich es mir einfach gemacht. Ich will alle Zeichen, bis auf die schließende eckige Klammer [^\]]*

Code: Alles auswählen

\[LINK,([a-zA-Z]*),([^\]]*)\](Linktext)\[\/LINK\]
Bei Linktext ist es das Gleiche, außer dass ich die öffnende eckige Klammer ausschließe [^\[]*

Code: Alles auswählen

\[LINK,([a-zA-Z]*),([^\]]*)\]([^\[]*)\[\/LINK\]
Und nun kann man auf die einzelnen Elemente, die in runden Klammern stehen für die Ersetzung mit fortlaufenden Zahlen zugreifen: $1, $2, usw.

Um es sicherer zu machen, sollte man vielleicht noch Eventualitäten abfangen. Was wäre zum Beispiel, wenn jemand anstatt http://www.irgendwas.de nur http://www.irgendwas.de eingibt? Dann würde der Link nicht mehr funktionieren.

-- edit --
Hm, müsste so gehen:

Code: Alles auswählen

$news = preg_replace('/\[LINK,([a-zA-Z]*),[http:\/\/]*([^\]]*)\]([^\[]*)\[\/LINK\]/', '<a href="http://$2" target="_$1">$3</a>', $news);