Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > PHP > PHP-Programmierung > Probleme mit $_COOKIE[$var]
Antwort
 
Themen-Optionen
Alt 22.02.2006, 16:31   Nach oben    #1
Benutzer
 
Benutzerbild von Magicman
 
Registriert seit: 23.09.2005
Beiträge: 35
Standard Probleme mit $_COOKIE[$var]

Hallo,

ich habe mir ein download script programmiert, das auch schon funktioniert.

Jetzt wollte ich zum schutz meines Traffics noch eine Sperre mit cookies einbauen.

Leider funktioniert die abfrage ob der cookie existiert (isset) nicht.

Die Links sehen ungefähr so aus:
"..../download.php?file=Eine Datei"

hier is mal das komplette script:

die download.php
PHP-Code:
<?php
include('download.inc.php');

if(isset(
$_GET['file']) AND isset($file[$_GET['file']]))
{
$url urldecode($_GET['file']);
$cookiename md5($url);

if(isset(
$_COOKIE[$cookiename])){
$cookie TRUE;
}

if(
stristr($_SERVER['HTTP_USER_AGENT'],Netscape) != FALSE){
$netscape TRUE;                      //Für Netscape-User
}
include(
'dltext.php');
}
else
{
    
header("Location: http://www.#########.de");
}
?>
Die dltext.php
PHP-Code:
<?php
if($cookie != TRUE){
if(
$netscape != TRUE){
echo 
'<meta http-equiv="refresh" content="1; URL='.$file[$_GET['file']].'">';
}
}

if(
$cookie == TRUE){
echo 
'<p><strong>Du hast die Datei heute bereits heruntergeladen.</strong></p><br />';
}
elseif(
$netscape == TRUE){
echo 
'<p>Netscape-User:</p><p><a href="">Hier Klicken</a> - (Ziel speichern unter)</p><br />';
}
?>
<p><a href="javascript:history.back()">Zur&uuml;ck</a></p>
$file[$_GET['file']] ist der pfad zur download.php (im ordner mit der zu downloadenden datei)
download.php:
PHP-Code:
<?php
$name 
"Eine Datei";
$filename "test.wmv";
include(
'../../config.inc.php'); // Pfad zur Config-Datei

$valid time()+86400;
$md5 md5($name);
setcookie($md5$_SERVER['REMOTE_ADDR'], $valid);

$hittime time();
$hitsql "UPDATE dlstats SET hits = hits +1, lasthit = $hittime WHERE filename='".$filename."'";
mysql_query($hitsql);
header("Location: $filename");
?>
Wo liegt der Fehler?

Danke für die Hilfe im vorraus
Magicman ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.02.2006, 16:55   Nach oben    #2
Corvin Gröning
 
Benutzerbild von Corvin
 
Registriert seit: 19.03.2005
Ort: S-H | Flensburg
Beiträge: 449
Standard

Was genau heißt denn "funktioniert nicht"?

Ruf mal die Datei mit "download.php?file=Eine%20Datei" auf.
__________________
Corvin ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.02.2006, 17:21   Nach oben    #3
Benutzer
 
Benutzerbild von Magicman
 
Registriert seit: 23.09.2005
Beiträge: 35
Standard

Habe ich schon probiert,

es geht darum, dass der cookie gesetzt wird (sehe ich in den browser einstellungen), aber es wird nicht gesagt das schonmal heruntergeladen wurde.

P.S. für des %20 hab ich ja des urldecode
Magicman ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.02.2006, 23:51   Nach oben    #4
axo
Gast
 
Beiträge: n/a
Standard

übrigens hast du ein typisches register-globals-problem... wenn ich den URL mit &cookie=0 (und register-globals=on) aufrufe, hab ich deinen counter bereits umgangen.

immer wieder das selbe: ELSE macht sinn.

und dein 'problem' liegt eigentlich nur daran, dass du nicht korrekt eingerückt hast und damit nicht korrekt nachvollziehen kannst, wie die ausführungsreihenfolge des codes ist.

halte dich an eine der beiden regeln:
http://www.dagbladet.no/development/...tandard/#brace

... und du wirst sehen, dass es gar nicht am $_COOKIE lag.

1. hinweis: netscape-user werden in deinem skript bevorzugt behandelt.
2. hinweis: strings werden in php in einfache oder doppelte anführungszeichen gepackt.
3. hinweis: guck dir ganz genau an, was unter http://us2.php.net/stristr steht: testing if a string is found or not - zähl mal die gleichzeichen.

viel spaß

Geändert von axo (23.02.2006 um 00:03 Uhr).
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.02.2006, 13:32   Nach oben    #5
bob
o_O
 
Registriert seit: 18.08.2005
Ort: Essen
Beiträge: 159
Standard

Ausserdem kann ich doch die Cookies einfach wieder löschen ... kann man das nich besser per ip sperre regeln?
__________________
Grüsse aus Essen,
bob
bob ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.02.2006, 13:49   Nach oben    #6
BIN EIN KRASSA HELD!!!111
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.184
Standard

Zitat:
Zitat von bob
Ausserdem kann ich doch die Cookies einfach wieder löschen ... kann man das nich besser per ip sperre regeln?
dann wähl ich halt mein internet neu an ... bzw. spätestens nach 24 stunden hab ich eh ne andere.


einzige effektive lösung für sowas ist es dass user sich anmelden müssen.
robo47 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.02.2006, 14:20   Nach oben    #7
Benutzer
 
Benutzerbild von Magicman
 
Registriert seit: 23.09.2005
Beiträge: 35
Standard

Hallo,

@axo,
danke für die Hinweise, aber könntest du etwas genauer werden?

Und warum werden die Netscape Benutzer bevorzugt, es ist klar das die einen "Rechtsklick" Link bekommen, aber das muss so sein, denn die Videos werden sonst im Browser aufgerufen (mit Zahlen. Buchstaben...) ohne das ein Download Fenster erscheint.

Ich habe jetzt alles ein bisschen eingerückt.
Aber leider seh ich immer noch nicht wo der Fehler ist.

PHP-Code:
<?php
include('download.inc.php');

if(isset(
$_GET['file']) AND isset($file[$_GET['file']])){

$url urldecode($_GET['file']);

$cookiename md5($url);

            if(isset(
$_COOKIE[$cookiename]))
            {

            
$cookie "TRUE";

            }

            if(
stristr($_SERVER['HTTP_USER_AGENT'], 'Netscape') !== FALSE)
            {
            
$netscape "TRUE";                      //Für Netscape-User
            
}

include(
'dltext.php');

}
else
{
    
header("Location: http://www.##########.de");
}
?>
Mit === "TRUE" funktioniert es nicht. Warum?

PHP-Code:
<?php
if($cookie != "TRUE")
{
           if(
$netscape != "TRUE")
           {
           echo 
'<meta http-equiv="refresh" content="1; URL='.$file[$_GET['file']].'">';
           }
}

if(
$cookie == "TRUE")
{
echo 
'<p><strong>Du hast die Datei heute bereits heruntergeladen.</strong></p><br />';
}
else if(
$netscape == "TRUE")
{
echo 
'<p>Netscape-User:</p><p><a href="">Hier Klicken</a> - (Ziel speichern unter)</p><br />';
}
?>
<p><a href="javascript:history.back()">Zur&uuml;ck</a></p>
Hier hab ich nichts verändert:
PHP-Code:
<?php
$filmname 
"#####";

$filename "##############.wmv";

include(
'../../config.inc.php'); // Pfad zur Config-Datei

####

$valid time()+86400;
$md5 md5($filmname);
setcookie($md5$_SERVER['REMOTE_ADDR'], $valid);

$hittime time();

$hitsql "UPDATE dlstats SET hits = hits +1, lasthit = $hittime WHERE filename='".$filename."'";
mysql_query($hitsql);

header("Location: $filename");
?>
Wo liegt der Fehler genau?

P.S.
Es geht mir nicht darum, den Download 100% zu beschränken, sondern nur das ein nicht so erfahrener User wie ihr, nicht gleich mehrfach den Dowload aufruft.
@robo47, anmelden finde ich für meine zwecke unnötig und nur zeitaufwendig.
Magicman ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.02.2006, 14:31   Nach oben    #8
Mensch
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
Standard

kleiner tipp:
Einrücken geht in etwa so:
PHP-Code:
if($foo)
{
    if(
$bar)
    {
        do...;
    } else {
        do...;
    }
    do...;

ist besser als dein halbherziges einrücken.
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.02.2006, 14:44   Nach oben    #9
axo
Gast
 
Beiträge: n/a
Standard

ich meine, dass die variablen $cookie und $netscape nichts miteinander zu tun haben sollten und aus diesem grund if ($cookie) {} elseif ($netscape) else {} nicht korrekt ist.
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.02.2006, 15:23   Nach oben    #10
bob
o_O
 
Registriert seit: 18.08.2005
Ort: Essen
Beiträge: 159
Standard

Zitat:
einzige effektive lösung für sowas ist es dass user sich anmelden müssen.
Jagut .... aber die meisten DAUs wissen das ja mit den Cookies eh nicht

Gruss,
bob
__________________
Grüsse aus Essen,
bob
bob ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.02.2006, 15:58   Nach oben    #11
Irgendwas mit e
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 393
Standard

Zitat:
Zitat von axo
ich meine, dass die variablen $cookie und $netscape nichts miteinander zu tun haben sollten und aus diesem grund if ($cookie) {} elseif ($netscape) else {} nicht korrekt ist.
Aber andererseits, will er ja nur folgendes machen:
Wenn der Cookie schon gesetzt ist, wird die Meldung angezeigt und wenn nicht, wird überprüft, ob der Browser Netscape ist. Und wenn das dann true ist, wird ein Download-Link angezeigt

Den Download für andere ermöglicht er ja schon hier:
PHP-Code:
if($cookie != "TRUE")
{
           if(
$netscape != "TRUE")
           {
           echo 
'<meta http-equiv="refresh" content="1; URL='.$file[$_GET['file']].'">';
           }

Zumindest würde ich jetzt den Code so interpretieren. Obwohl das ein ganz schönes rumgekorke ist

@Magicman
Hast du schon mal debuggt?
Versuch erstmal den Fehler mittels echo, print_r, var_dump und Konsorten einzugrenzen.
Also finde heraus, an welcher Stelle bereits etwas schief geht.
Ich denke du hast da wahrscheinlich irgend einen Semantikfehler drinne.

//edit: Irgendwie find ich die Aufteilung recht verwirrend. Deshalb kanns sein, dass ich jetzt axos Beitrag völlig ungerechtfertigt kommentiert hab.
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int

Geändert von Jojo (23.02.2006 um 16:00 Uhr).
Jojo ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.02.2006, 16:16   Nach oben    #12
axo
Gast
 
Beiträge: n/a
Standard

na, wenn schon drei leute mit der selben stelle code schwierigkeiten haben, muss es neu geschrieben werden, kein zweifel ... denn alles, was verwirrend ist, muss eh raus.

grüße
axo
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.02.2006, 17:01   Nach oben    #13
Benutzer
 
Benutzerbild von Magicman
 
Registriert seit: 23.09.2005
Beiträge: 35
Standard

Jojo hat den Code schon richtig interpretiert

Ich habe den Fehler auch schon mit variablen-ausgabe und so eingeschränkt und bin dabei auf das $_COOKIE[$cookiename] gestoßen.

Wenn ich z.B. $cookie direkt auf "true" setzte (ohne cookie abfrage) funktioniert das script einwandfrei.
Magicman ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.02.2006, 17:33   Nach oben    #14
Irgendwas mit e
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 393
Standard

moment.
Lass mich mal nachdenken.
Du hast mit einberechnet, dass ein gesetztes Cookie nich so ohne weiteres im selben Script abgerufen werden kann, in dem es gesetzt wird?
Aber wie ich das sehe, nutzt du diesen Umstand sowieso aus, damit man die Datei einmal runterladen kann.
Hast du mal den Namen des Cookies beim Erstellen und beim Abrufen verglichen?

Grüße,
Jojo
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
Jojo ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.02.2006, 18:02   Nach oben    #15
Benutzer
 
Benutzerbild von Magicman
 
Registriert seit: 23.09.2005
Beiträge: 35
Standard

Da mann ja dann auf die download.php (im ordner mit der datei) weitergeleitet wird, hat sich ja das problem mit dem im gleichen script gesetzten cookie erledigt.

Die Namen der cookies stimmen auch (ich habe es auch ohne md5 verschlüsselung versucht).

Ist das so ein komisches script
Magicman ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.02.2006, 18:10   Nach oben    #16
Irgendwas mit e
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 393
Standard

also liegt dein Problem hier?
PHP-Code:
if(isset($_COOKIE[$cookiename])) 
Hast du mal geguckt, dass in dem Cookie überhaupt was drin steht? Vielleicht liegt dein Fehler beim Cookie-Setzen.
Hast du mal statt 'isset()' mal 'array_key_exists()' probiert?
Denn isset liefert dir false, wenn das Element null ist, obwohl der Index existiert?

Grüße,
Jojo
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
Jojo ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.02.2006, 18:15   Nach oben    #17
Benutzer
 
Benutzerbild von Magicman
 
Registriert seit: 23.09.2005
Beiträge: 35
Standard

Könnte es daran liegen, dass der Cookie in einem anderen Ordner auf dem Server gesetzt wird?
Magicman ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.02.2006, 18:20   Nach oben    #18
Irgendwas mit e
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 393
Standard

Zitat:
Zitat von Magicman
Könnte es daran liegen, dass der Cookie in einem anderen Ordner auf dem Server gesetzt wird?
Es könnte sogar stark daran liegen.
Die Pfade müssen gleich sein, oder der auslesende muss innerhalb des gesetzten liegen.
Am einfachsten gibts du dem set_cookie ein Pfad '/' mit.

Grüße,
Jojo
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
Jojo ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.02.2006, 18:30   Nach oben    #19
Benutzer
 
Benutzerbild von Magicman
 
Registriert seit: 23.09.2005
Beiträge: 35
Standard

ähm wie soll ich das genau machen? Hab keine Ahnung wo das dann hin soll.

P.S. man kann doch auch "setcookie" schreiben anstatt "set_cookie".
Magicman ist offline