PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP für Fortgeschrittene und Experten (http://www.selfphp.de/forum/forumdisplay.php?f=13)
-   -   Weiß nicht weiter (http://www.selfphp.de/forum/showthread.php?t=14272)

einsteigi 17.08.2006 23:07:12

Weiß nicht weiter
 
Hallo liebe PHPler und die, die es noch werden wollen.


Folgende Bedingungen soll PHP übeprüfen.

Zuerst soll das Script prüfen ob, die Anfrage von url_anfrage.php kommt
machen wir über
PHP-Code:

($_SERVER['HTTP_REFERER'] == 'url_anfrage.php' 

Wenn der Scriptaufruf nicht von url_anfrage.php kommt, wird auf diese Seite weitergeleitet
PHP-Code:

header "Location:    url_unbekannt.php"           );
exit; 

Wenn der Scriptaufruf von url_anfrage kam soll das geprüft werden,
ob die Variable $einverstanden leer ist, wenn sie das ist, wird auf url_leer.php weitergeleitet

PHP-Code:

$einverstanden  $_POST['einverstanden'];
if ( empty(
$einverstanden) {
header "Location:    url_leer.php"           );
exit;


Wenn Die Variable $einverstanden existiert dann wird auf url_good.php weitergeleitet
PHP-Code:

"Location:    url_good.php"           );
exit; 

Wie programmiere ich das, krieg ich nicht hin, ist wahrscheinlich schwerer als nur mit if, else ?

Serp 18.08.2006 03:27:09

AW: Weiß nicht weiter
 
Ähm, doch, es reicht if und else... Genaugenommen würd sogar if reichen...

Aber ein paar Hinweise: Erst mal ist es keine gute Idee, den Referer zu überprüfen. Man kann nämlich abstellen, dass der übertragen wird. Wer das tut, ist damit automatisch ausgesperrt.
Prüfe stattdessen lieber mit isset, ob $_POST['einverstanden'] existiert. Übrigens musst du zum Testen auf empty nicht extra noch eine neue Variable erzeugen, du kannst auch direkt $_POST['einverstanden'] prüfen.


Jetzt solltest du dir nur noch die Frage stellen, was dieses Problem unter "PHP für Fortgeschrittene und Experten" macht...

einsteigi 18.08.2006 12:10:59

AW: Weiß nicht weiter
 
@ serp,
wie verschiebe ich den Thread dann zu den Grundlagen?

DAnn muss die URLüberprüfung auf dem Server erfolgen über SSI, das kann keiner in seinerm Browser deaktivieren, stimmts?

Ich programmiere $einverstanden = $_POST['einverstanden'];,
weil es mir übersichtlicher erscheint, in vielen Büchern wird das auch so gemacht,
erst Varible erzeugt und dann auf diese zugegriffen.
Nur wenn ich viele Variablen erzeugen müsste wie bei Formularen dann nehme ich
empty($_POST['einverstanden'];.
Denke das der Server nicht viel mehr ausgelastet ist, wenn ich erst eine Variable erzeuge.

Wie kann man den Referer abstellen?


Würde das dann so machen, jetzt ist es ja einfacher.

Wenn Anfrage von url_anfrage.php dann über SSI zu prüfen.php

prüfen.php:
PHP-Code:

$einverstanden  $_POST['einverstanden'];

if (isset( 
$einverstanden )) { 
 ( 
"Location:    url_good.php"           );
exit;  
} else { 
header "Location:    url_leer.php"           );
exit;



Serp 18.08.2006 15:18:07

AW: Weiß nicht weiter
 
SSI? Server Sideded Includes? *kopfkratz*


Bei deinem Beispiel, das isset bringt dir in dem Fall nichts mehr. Denn isset() wird immer true zurückliefern, da die Variable $einverstanden erzeugt worden ist. Nur falls $_POST['einverstanden'] nicht existiert, ist sie leer (und du kriegst unter vernünftigem error_reporting ne Warnung).

Entsprechend würd ich if(isset($_POST['einverstanden']) && !empty($_POST['einverstanden'])) prüfen.

Zitat:

Denke das der Server nicht viel mehr ausgelastet ist, wenn ich erst eine Variable erzeuge.
Hast du prinzipiell Recht, vor allem, wenn vorher noch n Optimierer drüberläuft, der feststellt, dass die Variable unnötig ist. Ohne den hast du zumindest nen geringfügig höheren Speicherverbrauch.
Über die Übersicht kann man sich streiten, ich persönlich finds praktischer, wenn ich auf den ersten Blick sehen kann, ob eine Variable aus dem Formular kommt (-> ich hab aufs POST-Array zugegriffen) oder irgendwas lokales ist, das ich erzeugt hab.

Zitat:

Wie kann man den Referer abstellen?
Je nach Browser findet sich in den Einstellungen die Möglichkeite, diesen nicht mit zu übertragen.

einsteigi 18.08.2006 16:55:24

AW: Weiß nicht weiter
 
Also vergessen wir SSI.
Wichtig ist jetzt das <input name="einverstanden">
nur einmal vorkommt auf dem ganzen Server.
Habe ich so geändert, sprich in den anderen Dateien gibt es kein <input name="einverstanden"> mehr.

Nun kann die Überprüfung mittels Referer entfallen.

Habe Script so geändert:

PHP-Code:

// $einverstanden ist nicht leer
if ( isset($_POST['einverstanden']) && !empty($_POST['einverstanden']) ) { 
header 'Location:   url_good.php' );
exit;                      
} else 
//AGBs sind leer ->f_registrieren_1_agbs    
{  header 'Location:   url_bad.php' );
exit;          


Nur wenn ich es teste wird immer die url_leer.php aufgerufen.
Wo ist der Wurm drin?


Hier der HTML code:

Code:

<form action="prüfen.php" method="post" name="agbs" onSubmit="return check_radio(this)">
<input type="radio" name="einverstanden"
value="einverstanden">

Bestätige die AGB's
&nbsp;&nbsp;&nbsp;
<input type="submit" name="senden" value="&nbsp;&nbsp;Weiter&nbsp;&nbsp;">
</form>

Wie mache ich das hier.
Ich habe eine Seite nennen wir sie mal zuerst.php und dann eine dann.php

Auf dann.php soll man nur zugreifen dürfen wenn die Anfrage von zuerst.php kam. Da Referer abstellbar ist, muss es anders gehen. Nuir WIE?

xabbuh 18.08.2006 23:22:19

AW: Weiß nicht weiter
 
Zitat:

Zitat von einsteigi[U
Wie mache ich das hier.
Ich habe eine Seite nennen wir sie mal zuerst.php und dann eine dann.php

Auf dann.php soll man nur zugreifen dürfen wenn die Anfrage von zuerst.php kam. Da Referer abstellbar ist, muss es anders gehen. Nuir WIE?[/U]

Auf der Seite zuerst.php speicherst du einen bestimmten Wert in einer Session. Auf dann.php musst du dann prüfen, ob dieser Wert in der Session gesetzt ist.

Informationen zum Sessionmechanismus von PHP findest du unter:
- http://www.php.net/manual/en/features.sessions.php
- http://tut.php-q.net/sessions.html

einsteigi 21.08.2006 01:52:57

AW: Weiß nicht weiter
 
Super Idee mit den Session, so kann man sicher sein, das erstens die Anfrage, daher kommt wo Sie herkommen soll und nicht von einer Hackerseiter oder was anderem.

Was ist hier der Unterschied?
PHP-Code:

if ( isset($_POST['einverstanden']) && !empty($_POST['einverstanden']) )

und

if ( isset($_POST['einverstanden']) ) 

Laut meinen PHP-Bücher.

empty: Prüft ob Var leer, nicht definiert ist oder den Wert 0 hat, liefert dann True
denk nach ... !empty Prüft ob Var nicht leer ist, definiert ist und nicht den Wert 0 hat, dann True

isset: überprüft ob Var existiert.

Reicht es deshalb nicht aus

if ( isset($_POST['einverstanden']) ) zu verwenden, anstatt zusätzlich !empty ??

Ist es überhaupt notwendig Var mit unset zu löschen, nehmen wir an wir haben sämtliche Globale Var bekommen, diese ausgewertet und in DB eingetragen. Sollte man nun die Vars mit unset löschen, oder ist das überflüssig?

Serp 21.08.2006 17:42:07

AW: Weiß nicht weiter
 
Was ist das denn für ein PHP-Buch? empty überprüft, ob eine Variable einen Wert enthält, der als "leer" interpretiert wird. Welche genau das sind, kann auf php.net nachgelesen werden. Bei nicht definierten Variablen wirst du aber eine Warnmeldung kriegen (die der Verfasser des Buches nicht sieht, wenn er die entsprechende Fehlerausgabe nicht aktiviert hat). Natürlich liefert die Methode dann auch true, aber schöner Stil ist das keiner.

isset prüft nur, ob eine Variable existiert oder nicht. Entsprechend sollte den emptys auf jeden Fall mal ein isset vorangehen.

Ob du nach dem isset noch ein empty brauchst musst du an Hand deines Scripts entscheiden. Wenn es nur darum geht, ob die Variable gesetzt ist, reicht isset. Wenn zusätzlich noch ein Wert drinstehen soll (es also beispielsweise ausgeschlossen werden soll, dass jemand eine leere Zeichenkette übergibt), ist zusätzlich noch empty interessant. Falls auch Zeichenketten, die nur aus Whitespaces bestehen, ausgefiltert werden sollen, wäre auch empty(trim($var)) nicht verkehrt... ;) Ob du das also brauchst oder nicht musst du selbst wissen, das können wir dir nicht beantworten.

Was unset angeht: Was genau willst du damit erreichen? Wenn du ein sehr großes und speicherhungriges Script hast, bringt es unter Umständen schon etwas, mit unset wieder für mehr freien Speicher zu sorgen. Ansonsten sollte der Speicher mit Beendigung des Scripts eh wieder freigegeben werden, von daher...

xabbuh 21.08.2006 18:58:25

AW: Weiß nicht weiter
 
Zitat:

Zitat von Serp
empty überprüft, ob eine Variable einen Wert enthält, der als "leer" interpretiert wird. Welche genau das sind, kann auf php.net nachgelesen werden. Bei nicht definierten Variablen wirst du aber eine Warnmeldung kriegen (die der Verfasser des Buches nicht sieht, wenn er die entsprechende Fehlerausgabe nicht aktiviert hat).

empty() liefert keine Warnung, wenn die Variable nicht existiert:
Zitat:

empty() is the opposite of (boolean) var, except that no warning is generated when the variable is not set.
Quelle: http://de.php.net/manual/en/function.empty.php


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:09:03 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.