[PHP] Sessie waardes

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • uppie8374
  • Registratie: Maart 2002
  • Laatst online: 16-09 13:22
Voor mijn form wil ik een gegenereed plaatje gebruiken met een randomString in het plaatje om de spam zodoende wat tegen te gaan. Op zich werkt het wel goed, echter de eerste keer heeft het plaatje geen tekst. Na een refresh of bezoek aan andere pagina gaat het wel goed. De form wordt geinclude in de index op het moment dat er via het navigatiemenu op de link geklikt wordt.

Code form (gedeeltelijk):
PHP:
1
2
3
4
5
6
7
8
9
10
11
require ("php/gbsecurity/secFunctions.php"); // hierin staan de functies 'randomString($length)' en 'createSecImage($width, $height, $percentage, $text)'

session_start();
//session_register('sessionString');  #schijnt niet nodig te zijn??
$_SESSION['sessionString'] = randomString(5);

<form action="<? echo $_SERVER["PHP_SELF"]; ?>?id=gbadd" method="POST">
<img width="150" height="100" border="0" src="image.php?random='.microtime(true).'" alt=&#8221;secImage&#8221;> <br />
<input size="50" maxlength="60" type="text" name="sec"><br />
<?php echo "session:"; Print_r ($_SESSION); ?>
</form>


image.php
PHP:
1
2
3
require ("php/gbsecurity/secFunctions.php");
session_start();
createSecImage(150, 100, 100, $_SESSION['sessionString']);


In eerste instantie werkte dit al niet. Toen kreeg ik van iemand de tip om ?random='.microtime(true). achter het plaatje te zetten. Hierna werkte het ook. Alleen heb ik hierna nog het bestand hernoemd en in een submap gezet (waarbij uiteraard alle paden en namen goed zijn aangepast) maar nu werkt het niet meer??

Rebuilding knowledge database


Acties:
  • 0 Henk 'm!

  • André
  • Registratie: Maart 2002
  • Laatst online: 12-09 14:32

André

Analytics dude

Move naar Programming

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 21:46

Matis

Rubber Rocket

Is het voor jezelf niet veel makkelijker om een kant en klaar captcha script te gebruiken?

Fipo op Google:

[ Voor 7% gewijzigd door Matis op 28-08-2009 16:14 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Ik gok dat je binnen require ("php/gbsecurity/secFunctions.php"); de $_SESSION['sessionString'] vult met een waarde/

Na de require doe je echter pas de session_start(), welke de $_SESSION superglobal zal initialiseren als een lege array als je nog geen sessie hebt.
Kwestie van die 2 omdraaien.

Acties:
  • 0 Henk 'm!

  • gertvdijk
  • Registratie: November 2003
  • Laatst online: 18-09 11:40
Image.php moet wel de juiste headers meesturen en het plaatje uitspugen naar de browser...

Kia e-Niro 2021 64 kWh DynamicPlusLine. See my GitHub and my blog for articles on security and other stuff.


Acties:
  • 0 Henk 'm!

  • uppie8374
  • Registratie: Maart 2002
  • Laatst online: 16-09 13:22
Matis schreef op vrijdag 28 augustus 2009 @ 16:14:
Is het voor jezelf niet veel makkelijker om een kant en klaar captcha script te gebruiken?

Fipo op Google:
Ja het is waarschijnlijk wel makkelijker. Maar daar leer ik niet van waarom dingen wel of niet werken :) Daarnaast heb ik al aardig wat uurtjes gestoken in mijn eigen versie (die niet eens zo gek veel verschilt zo te zien van jouw link).

Rebuilding knowledge database


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 21:46

Matis

Rubber Rocket

frickY schreef op vrijdag 28 augustus 2009 @ 16:17:
Ik gok dat je binnen require ("php/gbsecurity/secFunctions.php"); de $_SESSION['sessionString'] vult met een waarde/

Na de require doe je echter pas de session_start(), welke de $_SESSION superglobal zal initialiseren als een lege array als je nog geen sessie hebt.
Kwestie van die 2 omdraaien.
Shit, dat had ik nog niet eens gezien. Jammer ook dat de code-opmaak niet helemaal lekker werkt.

Dat zal idd je probleem verhelpen. Daarnaast zitten er nog wel wat scherpe randjes aan je scriptje ;)

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • uppie8374
  • Registratie: Maart 2002
  • Laatst online: 16-09 13:22
frickY schreef op vrijdag 28 augustus 2009 @ 16:17:
Ik gok dat je binnen require ("php/gbsecurity/secFunctions.php"); de $_SESSION['sessionString'] vult met een waarde/

Na de require doe je echter pas de session_start(), welke de $_SESSION superglobal zal initialiseren als een lege array als je nog geen sessie hebt.
Kwestie van die 2 omdraaien.
Dat gebeurt in regel 5 van het eerste stukje code. Daar roep ik mijn zelf gebouwde functie randomString($length) uit secFunctions.php aan.
Matis schreef op vrijdag 28 augustus 2009 @ 16:19:
[...]
Daarnaast zitten er nog wel wat scherpe randjes aan je scriptje ;)
Tips zijn altijd welkom ;)


edit:

Inmiddels heb ik bij beide bestanden de session_start(); op de eerste regel gezet. Dit helpt echter niet.

[ Voor 23% gewijzigd door uppie8374 op 28-08-2009 16:27 ]

Rebuilding knowledge database


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 21:46

Matis

Rubber Rocket

uppie8374 schreef op vrijdag 28 augustus 2009 @ 16:21:
Dat gebeurt in regel 5 van het eerste stukje code. Daar roep ik mijn zelf gebouwde functie randomString($length) uit secFunctions.php aan.
Maar bij het includen van dat php bestand is je sessie nog niet gestart. Zo zie ik bijvoorbeeld ook nog geen verwerking van de sessie-gegevens in een plaatje.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • uppie8374
  • Registratie: Maart 2002
  • Laatst online: 16-09 13:22
index.php body switch gebeuren
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
     <?php
       $id=$_GET['id'];
       if (!isset($id)){
        $id = $confg['start'];
       }

       if (file_exists("php/".$id.".php")){   //if file exists, include file, otherwise errormessage
         include ("php/".$id.".php");
       }
       else{
         include("php/error.php");
       }
              //var_dump($_GET);
     ?>


createSecImage(150, 100, 100, $_SESSION['sessionString']); maakt het plaatje. createSecImage($width, $height, $percentage, $text) waarbij percentage voor het aantal random pixels is.

Als ik het goed begrijp is het nu de bedoeling dat ik de session_start(); in mijn index ga zetten?

edit:

Ik heb inmiddels ook een session_start(); in mijn index gezet (voor alle includes en requires), maar dit helpt ook niet.

[ Voor 9% gewijzigd door uppie8374 op 28-08-2009 16:54 ]

Rebuilding knowledge database


Acties:
  • 0 Henk 'm!

  • uppie8374
  • Registratie: Maart 2002
  • Laatst online: 16-09 13:22
Inmiddels een beetje met header() zitten knoeien. image.php ziet er nu zo uit:

PHP:
1
2
3
4
5
6
7
8
9
10
header( "Expires: Mon, 20 Dec 1998 01:00:00 GMT" );
header( "Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT" );
header( "Cache-Control: no-cache, must-revalidate" );
header( "Pragma: no-cache" );

session_start();

require ("php/XXX/secFunctions.php");

createSecImage(150, 100, 100, $_SESSION['sessionString']);


Nog geen verschil echter.

Rebuilding knowledge database


Acties:
  • 0 Henk 'm!

  • naam
  • Registratie: Oktober 2007
  • Laatst online: 12-09 13:07
De image naar de client sturen met een extra header waarin aangegeven wordt dat het een afbeelding betreft is misschien een idee?
PHP:
1
2
3
header('Content-Type: image/png');
header('Content-Type: image/gif');
header('Content-Type: image/jpeg');


1 vd 3 kiezen naar aanleiding van welk formaat je script uit spuugt :)

/Edit 1:
Dit wordt dan bvb:
PHP:
1
2
3
4
5
6
7
8
9
10
11
header('Content-Type: image/jpeg');
header( "Expires: Mon, 20 Dec 1998 01:00:00 GMT" );
header( "Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT" );
header( "Cache-Control: no-cache, must-revalidate" );
header( "Pragma: no-cache" );

session_start();

require ("php/XXX/secFunctions.php");

createSecImage(150, 100, 100, $_SESSION['sessionString']);


/Edit 2:

Wat gertvdijk dus eigelijk ook al zei :)

[ Voor 85% gewijzigd door naam op 28-08-2009 23:27 ]


Acties:
  • 0 Henk 'm!

  • thegve
  • Registratie: Februari 2004
  • Laatst online: 17-09 08:23
Hoogstwaarschijnlijk is je server nog niet klaar met het uitvoeren van je form php pagina, en heeft de sessie variabelen nog niet weggeschreven. Je server is echter al wel begonnen met het uitspugen van html en je browser laad dus ondertussen al de image.php in die dan nog niet kan beschikken over je sessie variabele.

Ik zou de sessie variabele pas verzinnen in de image.php, binnen je form is deze tijdens de GET request (de eerste keer dus), toch nog niet relevant om te weten.

Acties:
  • 0 Henk 'm!

  • uppie8374
  • Registratie: Maart 2002
  • Laatst online: 16-09 13:22
Grof gezegd is dit momenteel mijn form:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
session_start();
require ("php/XXX/secFunctions.php");
 
$_SESSION['sessionString'] = randomString(5);
session_write_close();
 
if(!IsSet($_POST['stage']))
{
?>
<form action="<? echo $_SERVER["PHP_SELF"]; ?>?id=gbadd" method="POST">
.
<img width="150" height="100" border="0" src="image.php?random='.microtime(true).'" alt=&#8221;secImage&#8221;> <br />
<input size="50" maxlength="60" type="text" name="sec"><br />
<?php echo "session:"; Print_r ($_SESSION); ?>
<input type="hidden" name="stage" value=1>
</form>
<?php
} else {


image.php:
PHP:
1
2
3
4
5
6
7
8
9
header( "Content-Type: image/png");
header( "Expires: Mon, 20 Dec 1998 01:00:00 GMT" );
header( "Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT" );
header( "Cache-Control: no-cache, must-revalidate" );
header( "Pragma: no-cache" );
 
session_start();
require ("php/XXX/secFunctions.php");
createSecImage(150, 100, 100, $_SESSION['sessionString']);


Probleem blijft echter dat de eerste keer dat de pagina van de form bezocht wordt er nog geen text in het plaatje staat. Wel bij de print_r

Rebuilding knowledge database


Acties:
  • 0 Henk 'm!

  • uppie8374
  • Registratie: Maart 2002
  • Laatst online: 16-09 13:22
Ok ik ben er inmiddels ook achter dat het niet ligt aan de caching van het plaatje.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
header( "Content-Type: image/png");
header( "Expires: Mon, 20 Dec 1998 01:00:00 GMT" );
header( "Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT" );
header( "Cache-Control: no-cache, must-revalidate" );
header( "Pragma: no-cache" );

session_start();

require ("gbsecurity/secFunctions.php");

$fp = fopen("log.txt", "a");
fwrite($fp, $_SESSION['sessionString']);
fwrite($fp, "\n");
fclose($fp);

createSecImage(150, 100, 100, $_SESSION['sessionString']);


log.txt laat zien dat de allereerste ronde $_SESSION['sessionString'] gewoon nog niet bekend is.

Rebuilding knowledge database


Acties:
  • 0 Henk 'm!

  • uppie8374
  • Registratie: Maart 2002
  • Laatst online: 16-09 13:22
Ik heb ook $_COOKIE laten wegschrijven in het log bestand, maar die is continu leeg (was een tip van iemand).

Verder merk ik dat wanneer ik de form heb verstuurd en daarna terug ga omdat de input niet geldig is, dat het plaatje wel een nieuwe sessionString heeft, maar de print_r staat nog op de oude sessionString.


Tevens kickje, probleem is al meer dan een week onopgelost :'(

Rebuilding knowledge database


Acties:
  • 0 Henk 'm!

  • uppie8374
  • Registratie: Maart 2002
  • Laatst online: 16-09 13:22
session_start() boven de headers op coderegel 1 zetten heeft ook geen effect :(

Rebuilding knowledge database


Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 23:59
uppie8374 schreef op zaterdag 29 augustus 2009 @ 16:02:
Ok ik ben er inmiddels ook achter dat het niet ligt aan de caching van het plaatje.
Dat ben je ook aan het voorkomen met headers en een random querystring, dus je mag wel verwachten dat er niet te veel gecached wordt. Dit lijkt me ook de reden waarom het plaatje wel verandert en de rest van de pagina (die print_r) niet, bij het teruggaan.

Je zegt dat $_COOKIE leeg is. Is er ook geen cookie met het sessieid in je browser te vinden? (Het zou kunnen dat PHP dat specifieke cookie eruit filtert.) Anders kun je nog eens naar de instellingen (van PHP) kijken.

Maar heb je nog niets gedaan met de laatste opmerking van voor je meerdaagse monoloog?

En of de header die session_start() stuurt om het cookie te zetten voor of na de cacheheaders komt, lijkt me niet heel interessant (maar misschien wilde je gewoon iets meer dan 'zoveelste kickje' zeggen :P ).

Acties:
  • 0 Henk 'm!

  • uppie8374
  • Registratie: Maart 2002
  • Laatst online: 16-09 13:22
Raynman schreef op woensdag 02 september 2009 @ 13:47:
[...]
Dat ben je ook aan het voorkomen met headers en een random querystring, dus je mag wel verwachten dat er niet te veel gecached wordt. Dit lijkt me ook de reden waarom het plaatje wel verandert en de rest van de pagina (die print_r) niet, bij het teruggaan.

Je zegt dat $_COOKIE leeg is. Is er ook geen cookie met het sessieid in je browser te vinden? (Het zou kunnen dat PHP dat specifieke cookie eruit filtert.) Anders kun je nog eens naar de instellingen (van PHP) kijken.

Maar heb je nog niets gedaan met de laatste opmerking van voor je meerdaagse monoloog?

En of de header die session_start() stuurt om het cookie te zetten voor of na de cacheheaders komt, lijkt me niet heel interessant (maar misschien wilde je gewoon iets meer dan 'zoveelste kickje' zeggen :P ).
Hehe, ik ben heel lief geweest en heb maar 1 kickje gebruikt O-)

Dat van de session_start() omhoog zetten was een tip die ik elders kreeg. Na wat wanhoop heb ik wat meer bronnen aangeboord, zeker omdat ik al even over mijn deadline heen zit ;( Het wegschrijven van $_COOKIE was ook een tip om te kijken of deze leeg is. Ik heb echter nog nooit met cookies gewerkt en ook dit keer gebruik ik in het geheel geen cookies.

Ik zal de randomquery string weghalen om te kijken of bij het teruggaan het plaatje nog dezelfde tekst houdt.
Ik zou de sessie variabele pas verzinnen in de image.php, binnen je form is deze tijdens de GET request (de eerste keer dus), toch nog niet relevant om te weten.
Ik heb de regel
$_SESSION['sessionString'] = randomString($confg['secString']);

al een keer naar image.php verhuisd. Toen was de eerste ronde de print_r leeg en had het plaatje een waarde. Maar ipv daarna gelijk te lopen kreeg print_r de waarde die het plaatje eerst had en had het plaatje een nieuwe waarde.

Ik vraag me daarnaast ook nog af waarom het bij mij zoveel moeite kost, terwijl ik bij "professionele scripts" vaak de code zo klein is dat ik het niet eens kan terugvinden :P

Rebuilding knowledge database

Pagina: 1