[PHP] sessions icm register_globals off

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Boomerang
  • Registratie: November 2000
  • Niet online
Ik heb al diverse malen gezocht naar dit probleem op GoT en via google, maar ik kom er nog steeds niet uit.

Ik heb de volgende code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php

// Form with registerglobals = off
session_start();

if(isset($_POST['posted']) && $_POST['posted']) {
  echo $_POST['naam'];
  $_SESSION['naam'] = $_POST['naam'];
  $session_contents = $_SESSION['naam'];
  echo "From session : $session_contents";
  echo "Go <a href=\"index.php?action=two\">on</a> to the next page...</a>";
  }

if($_GET['action'] == "two") {
  echo "This is from the session:"; $_SESSION['naam'];
}

else {
  echo "<form action=\"index.php?action=send\" method=\"post\"><input type=\"hidden\" name=\"posted\" value=\"1\">
<input name=\"naam\"><input type=\"submit\"></form>";
  }

?>


Na submit krijg ik netjes de waarde uit de session. Zodra pagina 2 geladen wordt, is me session var weg :( , dus ik krijg de waarde die erin zat niet meer op de pagina getoond, terwijl er toch echt een session aan is gemaakt in de tmp map met correcte gegevens.

Wie kan me helpen met dit probleem ?

[ Voor 34% gewijzigd door Boomerang op 10-02-2003 14:05 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Hmm, dan denk ik dat die var. weer overschreven word aan het begin...
maak er eens van:
PHP:
1
2
3
4
5
6
7
8
9
10
11
// rest
if($_GET['action'] != "two") { 
if(isset($_POST['posted']) && $_POST['posted']) { 
  echo $_POST['naam']; 
  $_SESSION['naam'] = $_POST['naam']; 
  $session_contents = $_SESSION['naam']; 
  echo "From session : $session_contents"; 
  echo "Go <a href=\"index.php?action=two\">on</a> to the next page...</a>"; 
  } 
}
// rest

[ Voor 210% gewijzigd door Verwijderd op 09-02-2003 18:38 ]


Acties:
  • 0 Henk 'm!

  • Suffie
  • Registratie: Maart 2002
  • Laatst online: 27-01-2023
probeer is
PHP:
1
2
$naam = $_POST['naam'];
session_register("naam");


en hem dan pas oproepen met $_SESSION['naam']

edit: [php]if(isset($_POST['posted']) && $_POST['posted'])[/php]kan alleen maar TRUE && TRUE opleveren en FALSE && FALSE of mis ik iets?

[ Voor 98% gewijzigd door Suffie op 09-02-2003 18:52 ]

I don't suffer from insanity, I enjoy every minute of it
Trotse mama van Thijs&Bas


Acties:
  • 0 Henk 'm!

Verwijderd

ok, nu mag ik, kijk en vergelijk :P

PHP:
1
2
3
echo $_POST['naam']; 

<input name=\"name\">


en

PHP:
1
echo "This is from the session:"; $_SESSION['naam']; // goed kijken he ;-)

Acties:
  • 0 Henk 'm!

Verwijderd

Suffie schreef op 09 februari 2003 @ 18:47:
probeer is
PHP:
1
2
$naam = $_POST['naam'];
session_register("naam");


en hem dan pas oproepen met $_SESSION['naam']

Als je even de PHP manual leest, dan zie je dat je geen session_register() moet gebruiken als je gebruik maakt van $_SESSION.

De fout die de topicstarter maakt zit hem in deze regel:
PHP:
1
echo "This is from the session:"; $_SESSION['naam'];


Dit zijn twéé statements, namelijk de volgende twee:
PHP:
1
2
echo "This is from the session:";
$_SESSION['naam'];


De eerste echo't die string naar de output, de tweede zet de waarde van $_SESSION['naam'] in de stack, waar je met PHP niet zoveel mee kunt.

Strings concatenaten doe je met de . operator.
Maak er dus het volgende van:
PHP:
1
echo "This is from the session:" . $_SESSION['naam'];

of dit kan ook:
PHP:
1
2
echo "This is from the session:";
echo $_SESSION['naam'];

[ Voor 3% gewijzigd door Verwijderd op 09-02-2003 18:59 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Boomerang schreef op 09 februari 2003 @ 18:15:
Na submit krijg ik netjes de waarde uit de session. Zodra pagina 2 geladen wordt, is me session var weg :( , dus ik krijg de waarde die erin zat niet meer op de pagina getoond, terwijl er toch echt een session aan is gemaakt in de tmp map met correcte gegevens.
Heb je wel session_start(); bovenaan elke pagina staan ?

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 09 February 2003 @ 19:08:
[...]
Heb je wel session_start(); bovenaan elke pagina staan ?

Zoals je ziet is dit de enige pagina, en staat er session_start bovenaan.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 09 February 2003 @ 19:10:

[...]

Zoals je ziet is dit de enige pagina, en staat er session_start bovenaan.
Waarom zegt ie dan 'zodra pagina 2 geladen wordt' :?

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 09 February 2003 @ 19:11:
[...]
Waarom zegt ie dan 'zodra pagina 2 geladen wordt' :?
Zal wel een foutje zijn, hij bedoelt natuurlijk zelfde pagina met action twee.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 09 February 2003 @ 20:07:
[...]

Zal wel een foutje zijn, hij bedoelt natuurlijk zelfde pagina met action twee.
Ow ja, dat kan ook (ik zie t net pas) :)

Acties:
  • 0 Henk 'm!

  • Boomerang
  • Registratie: November 2000
  • Niet online
Verwijderd schreef op 09 februari 2003 @ 18:56:
ok, nu mag ik, kijk en vergelijk :P

PHP:
1
2
3
echo $_POST['naam']; 

<input name=\"name\">


en

PHP:
1
echo "This is from the session:"; $_SESSION['naam']; // goed kijken he ;-)
Dat was idd een hele domme fout :(

Ik heb nu het volgende, maar het wil nog steeds niet werken:

PHP:
1
2
3
4
5
6
7
8
9
10
11
// knip
if(isset($_POST['action']) && $_POST['action'] == "send") {
  $_SESSION['naam'] = $_POST['naam'];
  $session_contents = $_SESSION['naam'];
  echo "Go <a href=\"index.php?action=two\">on</a> to the next page...</a>";
  }

elseif(isset($_GET['action']) && $_GET['action'] == "two") {
  echo "This is from the session:" . $_SESSION['naam'];
}
// knip


En het formuliertje heeft als form-action: send en de variabele naam die gepost wordt. Verder nog een hidden field met name 'action' en value 'send'.


Toch krijg ik als ik doorklik op het linkje geen waarde in de session.
Ik heb alle adviezen in dit topic geprobeerd, afgezien van de session_register, die is namelijk bij 'register_globals off'' uitgesloten.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Zoek de verschillen:
code:
1
<input name=\"name\">

en
code:
1
$_SESSION['naam'] = $_POST['naam'];

[puristen mode]
Verder is het gebruik van PHP geen vrijbrief om slordige HTML te produceren...
[/puristen mode]

[ Voor 19% gewijzigd door crisp op 09-02-2003 21:40 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Suffie
  • Registratie: Maart 2002
  • Laatst online: 27-01-2023
kan iemand me vertellen wat het verschil in de uitkomst is?
PHP:
1
2
3
if(isset($_POST['action']) && $_POST['action'] == "send")
//of
if($_POST['action'] == "send")


edit: op php.net staat (samengevat):
Isset: Returns TRUE if var exists; FALSE otherwise.
dus als $_POST['action'] == "send", dan volgt daaruit dat isset($_POST['action']) is TRUE, dus overbodig?
dus klopt het dan dat wat hierboven staat dezelfde "uitkomst" heeft?

[ Voor 81% gewijzigd door Suffie op 09-02-2003 22:50 ]

I don't suffer from insanity, I enjoy every minute of it
Trotse mama van Thijs&Bas


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Suffie schreef op 09 February 2003 @ 22:46:
kan iemand me vertellen wat het verschil in de uitkomst is?
PHP:
1
2
3
if(isset($_POST['action']) && $_POST['action'] == "send")
//of
if($_POST['action'] == "send")


edit: op php.net staat (samengevat):
Isset: Returns TRUE if var exists; FALSE otherwise.
dus als $_POST['action'] == "send", dan volgt daaruit dat isset($_POST['action']) is TRUE, dus overbodig?
dus klopt het dan dat wat hierboven staat dezelfde "uitkomst" heeft?
Als $_POST['action'] niet bestaat geeft if ($_POST['action'] == "send") een warning (tip: zet je error_reporting op E_ALL!)
Nog mooier is trouwens om de server request method uit te vragen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// init
$action = '';

if ($_SERVER['REQUEST_METHOD'] == 'POST') {

  // Get POST vars
  if (isset($_POST['action'])) $action = $_POST['action'];

  if ($action == 'send') {

    // actions for send

  }

}

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Suffie
  • Registratie: Maart 2002
  • Laatst online: 27-01-2023
crisp schreef op 09 February 2003 @ 22:54:
[...]

Als $_POST['action'] niet bestaat geeft if ($_POST['action'] == "send") een warning (tip: zet je error_reporting op E_ALL!)
mijn error_reporting staat op " E_ALL & ~E_NOTICE" , maar ik kan nog steeds gewoon if ($_POST['action'] == "send") doen zonder errors (PHP version 4.1.1)

I don't suffer from insanity, I enjoy every minute of it
Trotse mama van Thijs&Bas


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Suffie schreef op 09 February 2003 @ 23:07:
[...]

mijn error_reporting staat op " E_ALL & ~E_NOTICE" , maar ik kan nog steeds gewoon if ($_POST['action'] == "send") doen zonder errors (PHP version 4.1.1)
Omdat het dus een notice geeft (warning/notice whatever); bij jou laat 'ie alle error meldingen zien behalve notices. Gewoon alleen E_ALL laat alles zien inclusief notices.

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Suffie
  • Registratie: Maart 2002
  • Laatst online: 27-01-2023
crisp schreef op 09 februari 2003 @ 23:12:
[...]

Omdat het dus een notice geeft (warning/notice whatever); bij jou laat 'ie alle error meldingen zien behalve notices. Gewoon alleen E_ALL laat alles zien inclusief notices.
* Suffie zet error_reporting op E_ALL
*schrikt* oeh, wat een foutmeldingen bij mn eigen site...

I don't suffer from insanity, I enjoy every minute of it
Trotse mama van Thijs&Bas


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Suffie schreef op 09 februari 2003 @ 23:18:
[...]

* Suffie zet error_reporting op E_ALL
*schrikt* oeh, wat een foutmeldingen bij mn eigen site...
och, 99% van alle voorbeelden die je vind op het net zullen met E_ALL meldingen genereren.
Ik ben zelf pas 3 weken bezig met PHP, en heb me daarvoor eerst stevig ingelezen en ben eigenlijk geschrokken van de kwaliteit van de code die je overal vind (ook in tutorials).
[rant]Af en toe lijkt het wel alsof het alleen maar prutsers zijn die zich met PHP bezighouden...[/rant]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Boomerang
  • Registratie: November 2000
  • Niet online
crisp schreef op 09 februari 2003 @ 21:35:
Zoek de verschillen:
code:
1
<input name=\"name\">

en
code:
1
$_SESSION['naam'] = $_POST['naam'];

[puristen mode]
Verder is het gebruik van PHP geen vrijbrief om slordige HTML te produceren...
[/puristen mode]
Als je even de moeite had genomen mijn post te lezen, staat daar al in dat ik het verandert heb. Dus lees de draad voor je blaat.

En
PHP:
1
if(isset($_POST['action']) && $_POST['action'] == "send") {

Is volgensmij gewoon goed hoor. Je kijkt of de var bestaat en of de action 'send' wordt opgevraagd (met POST, dus formuliertje).

Verder is het zeker aanbevolen om bij development E_ALL aan te zetten bij elk PHP script dat je maakt. Ofwel in Apache, ofwel bovenaan je document met:

PHP:
1
error_reporting ( E_ALL );


Maar heeft iemand nog mogelijke oplossingen ?

[ Voor 8% gewijzigd door Boomerang op 10-02-2003 14:00 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Boomerang schreef op 10 February 2003 @ 13:57:
[...]
Maar heeft iemand nog mogelijke oplossingen ?
Hier werkt de code verders prima; welke versie PHP gebruik je? versie 4.1.x staat er bijvoorbeeld om bekend nogal buggie te zijn mbt sessies.

En met geldige HTML bedoelde ik eigenlijk een compleet HTML document (met doctype, head-sectie, body etcetera); je kan er namelijk nooit vanuit gaan dat de client precies terugstuurt wat jij wilt als je ze geen geldig HTML document voert. Bij de meeste browsers zal dit wel loslopen, maar ik kan me situaties voorstellen waarbij dit problemen kan opleveren, en ik ben daar nogal puristisch in ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Boomerang
  • Registratie: November 2000
  • Niet online
crisp schreef op 10 February 2003 @ 14:19:
[...]

Hier werkt de code verders prima; welke versie PHP gebruik je? versie 4.1.x staat er bijvoorbeeld om bekend nogal buggie te zijn mbt sessies.

En met geldige HTML bedoelde ik eigenlijk een compleet HTML document (met doctype, head-sectie, body etcetera); je kan er namelijk nooit vanuit gaan dat de client precies terugstuurt wat jij wilt als je ze geen geldig HTML document voert. Bij de meeste browsers zal dit wel loslopen, maar ik kan me situaties voorstellen waarbij dit problemen kan opleveren, en ik ben daar nogal puristisch in ;)
PHP 4.3.0 en laatste apache uit de 1.3.x groep onder windows XP met error_reporting ALL. Verder had ik er natuurlijk bij moeten zeggen dat dit document ff snel gemaakt is om zoiets mee te testen. Ik wil het namelijk toepassen in een veel groter script, maar aangezien dit stuk alleen relevant is, heb ik dit ff gemaakt. (Ikzelf vind ook dat mensen over het algemeen meer tijd mogen steken in hun HTML code en em vervolgens moeten testen bij w3c.)

Ohja, en sessions worden gewoon bewaard in een mapje op me hd. Verder is het misschien interessant om te vermelden dat er 2 session files worden aangemaakt, waarvan er 1 helemaal leeg is.

[ Voor 15% gewijzigd door Boomerang op 10-02-2003 14:24 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Boomerang schreef op 10 February 2003 @ 14:21:
[...]


PHP 4.3.0 en laatste apache uit de 1.3.x groep onder windows XP met error_reporting ALL. Verder had ik er natuurlijk bij moeten zeggen dat dit document ff snel gemaakt is om zoiets mee te testen. Ik wil het namelijk toepassen in een veel groter script, maar aangezien dit stuk alleen relevant is, heb ik dit ff gemaakt. (Ikzelf vind ook dat mensen over het algemeen meer tijd mogen steken in hun HTML code en em vervolgens moeten testen bij w3c.)

Ohja, en sessions worden gewoon bewaard in een mapje op me hd. Verder is het misschien interessant om te vermelden dat er 2 session files worden aangemaakt, waarvan er 1 helemaal leeg is.
Lijkt me dan een instellingsprobleem ergens. Wat staat er precies in je php.ini met betrekking tot sessies?

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Boomerang
  • Registratie: November 2000
  • Niet online
crisp schreef op 10 February 2003 @ 14:53:
[...]

Lijkt me dan een instellingsprobleem ergens. Wat staat er precies in je php.ini met betrekking tot sessies?
Ik heb even het relevante deel uit de php.ini gehaald:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
[Session]
; Handler used to store/retrieve data.
session.save_handler = files

; Argument passed to save_handler.  In the case of files, this is the path
; where data files are stored. Note: Windows users have to change this 
; variable in order to use PHP's session functions.
session.save_path = d:\webserver\tmp

; Whether to use cookies.
session.use_cookies = 1

; This option enables administrators to make their users invulnerable to 
; attacks which involve passing session ids in URLs; defaults to 0.
 session.use_only_cookies = 1

; Name of the session (used as cookie name).
session.name = PHPSESSID

; Initialize session on request startup.
session.auto_start = 0

; Lifetime in seconds of cookie or, if 0, until browser is restarted.
session.cookie_lifetime = 0

; The path for which the cookie is valid.
session.cookie_path = d:\webserver\tmp

; The domain for which the cookie is valid.
session.cookie_domain =

; Handler used to serialize data.  php is the standard serializer of PHP.
session.serialize_handler = php

; Define the probability that the 'garbage collection' process is started
; on every session initialization.
; The probability is calculated by using gc_probability/gc_dividend,
; e.g. 1/100 means 1%.

session.gc_probability = 1
session.gc_dividend    = 1000

; After this number of seconds, stored data will be seen as 'garbage' and
; cleaned up by the garbage collection process.
session.gc_maxlifetime = 1440

; PHP 4.2 and less have an undocumented feature/bug that allows you to
; to initialize a session variable in the global scope, albeit register_globals
; is disabled.  PHP 4.3 and later will warn you, if this feature is used.
; You can disable the feature and the warning seperately. At this time,
; the warning is only displayed, if bug_compat_42 is enabled.

session.bug_compat_42 = 0
session.bug_compat_warn = 1

; Check HTTP Referer to invalidate externally stored URLs containing ids.
; HTTP_REFERER has to contain this substring for the session to be
; considered as valid.
session.referer_check =

; How many bytes to read from the file.
session.entropy_length = 0

; Specified here to create the session id.
session.entropy_file =

;session.entropy_length = 16

;session.entropy_file = /dev/urandom

; Set to {nocache,private,public,} to determine HTTP caching aspects.
; or leave this empty to avoid sending anti-caching headers.
session.cache_limiter = nocache

; Document expires after n minutes.
session.cache_expire = 180

; trans sid support is disabled by default.
; Use of trans sid may risk your users security.
; Use this option with caution.
; - User may send URL contains active session ID
;   to other person via. email/irc/etc.
; - URL that contains active session ID may be stored
;   in publically accessible computer. 
; - User may access your site with the same session ID
;   always using URL stored in browser's history or bookmarks.
session.use_trans_sid = 0

; The URL rewriter will look for URLs in a defined set of HTML tags.
; form/fieldset are special; if you include them here, the rewriter will
; add a hidden <input> field with the info which is otherwise appended
; to URLs.  If you want XHTML conformity, remove the form entry.
; Note that all valid entries require a "=", even if no value follows.
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"


Hmm, blijkbaar staat er idd iets fout, want op lycos werkt het script gewoon :?

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Ik heb 2 verschillen die er misschien mee te maken hebben.
Ten eerste gebruik ik forward slashes bij session.save_path, en ten tweede heb ik:
code:
1
session.cookie_path = /

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Boomerang
  • Registratie: November 2000
  • Niet online
crisp schreef op 10 februari 2003 @ 15:38:
Ik heb 2 verschillen die er misschien mee te maken hebben.
Ten eerste gebruik ik forward slashes bij session.save_path, en ten tweede heb ik:
code:
1
session.cookie_path = /
Yup, working like a charm :). Na deze waarden verandert te hebben. Bedankt voor alle hulp :)
Pagina: 1