Archief - PHP: Verwijderen van PHPSESSID uit URLs

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

JohnBeton

Legacy Member
Hi,

ik zit met het volgende probleem:
stel, ik ontvang via een bepaalde functie een URL van een site (random).
Die URL ziet er als volgt uit:
my.example.com/search.php?do=bleh&sid=83baa6d9fa8de4c13c963f90c4ec87fb
of
my.example.com/index.php?do=bleh&PHPSESSID=...

Nu had ik graag die laatste extensie (door de webserver van die site zelf toegevoegd) verwijderd uit de ontvangen URL.

Ik dacht er aan dmv split() de url op te splitsen met "sid" of "PHPSESSID" als "breekpunt", maar daar mijn Regular Expressions kennis ook niet 100% is wil het niet werken :/

Bovendien weet ik niet of split() wel de meest efficiente functie is hiervoor. Uiteindelijk geldt: hoe sneller het staartje verdwenen is, hoe beter...

Alvast bedankt!


EDIT:
Voor alle duidelijkheid: de links die ik ontvang, zijn NIET afkomstig van mijn site/een server onder mijn beheer. Het zijn random links vanop het net. Niet alle ontvangen links bevatten deze extensie, maar degene die het wel hebben moeten dus gewijzigd worden...

MrO

Legacy Member
als je die PHPSESSID wegdoet kan je problemen krijgen met je sessies

php voegt dit toe als hij de sessie niet kan tracken door middel van bv cookies

JohnBeton

Legacy Member
Ik begrijp heel goed wat sessies zijn en waarom het wordt toegevoegd.

Doch: de links die ik ontvang zijn niet van mijn sites maar van sites op het net. Die sessie IDs zijn ook niet de IDs van mijn sessie, en bovenal: ik heb ze niet nodig :)

killgore

Legacy Member
checken op HTTP_REFERER (in $_SERVER global) is het beste dat je kan doen mijn beste :).

JohnBeton

Legacy Member
???
HTTP_REFERER bevat toch enkel informatie (vanop welke pagina linkt men naar mij) van bezoekers die mijn pagina bezoeken?

Zal even eerste post aanpassen...

JohnBeton

Legacy Member
Is mijn probleem duidelijk? Of zal ik het anders formuleren?

MrO

Legacy Member
JohnBeton zei:
Is mijn probleem duidelijk? Of zal ik het anders formuleren?

Nu begrijp ik het beter, ik dacht dat je ze uit jouw urls wou verwijderen.

function remove_phpsid($url){
$url_parts=split('?', $url)
$qs_parts=split('&', $url_parts[1]);

$new_url=$url_parts[0].'?';
for($i=0;$i<$qs_parts.size();$i++){
$pos = strpos ($qs_parts[$i], "PHPSESSID");
if ($pos === false) {
$new_url.='&'.$qs_parts[$i];
}
}

return $new_url;
}

Dit is het eerste dat in me opkomt.

edit: typo

killgore

Legacy Member
JohnBeton zei:
Is mijn probleem duidelijk? Of zal ik het anders formuleren?
die HTTP_REFERER was om te controleren vanwaar je gebruiker komt ;).

@hierboven: goede methode, je kan ook preg_replace doen die begint bij PHPSESSID en eindigt bij volgende &.

JohnBeton

Legacy Member
MrO zei:
Nu begrijp ik het beter, ik dacht dat je ze uit jouw urls wou verwijderen.

function remove_phpsid($url){
$url_parts=split('?', $url)
$qs_parts=split('&', $url_parts[1]);

$new_url=$url_parts[0].'?';
for($i=0;$i<$qs_parts.size();$i++){
$pos = strpos ($qs_parts[$i], "PHPSESSID");
if ($pos === false) {
$new_url.='&'.$qs_parts[$i];
}
}

return $new_url;
}

Dit is het eerste dat in me opkomt.

edit: typo
Dit ziet er goed uit, BUT ook vrij traag... Ik bedoel, opsplitten, aflopen, IF(dit) etc. Zou een preg_replace niet sneller zijn dan?

(het is namelijk zo, dat deze handelijk redelijk vaak herhaalt wordt en de pagina nu al redelijk zwaar wordt.)

Heb dit nu:
$url=preg_replace('(sid(.*)(&))','',$url);

Probleem: wanneer er geen "&" meer volgt, verdwijnt er niets...
Aan de andere kant: die ID wordt toch steeds achteraan de url toegevoegd? Of zijn er ook gevallen waar dit niet zo is??




Indien het niet gebeurd, kan ik natuurlijk het volgende gebruiken:
$url=preg_replace('(&sid(.*))','',$url);

(is dit ok?)

JohnBeton

Legacy Member
Heb net even de test gedaan:
0.0366
my.example.com/search.php?do=bleh
0.1597
my.example.com/search.php?do=bleh&PHPSESSID=83baa6d9fa8de4c13c963f90c4ec87fb
1ste = mijn preg_replace
2de = MrO's oplossing



2de is duidelijk trager en werkt ook nog niet 100%



Kan het nog beter?

Rvl

Legacy Member
Dus eigelijk komt ge hier een vraag stellen waar ge zelf al een antwoord op weet (aka een retorische vraag). Redelijk dom niet?

killgore

Legacy Member
Rvl zei:
Dus eigelijk komt ge hier een vraag stellen waar ge zelf al een antwoord op weet (aka een retorische vraag). Redelijk dom niet?
Ik denk nu wel dat em die preg pas gevonden heeft na starten :p.
anyway:
$url=preg_replace('(PHPSESSID(.*\&|.*))','',$url);
werkt algemeen, enkel voegt hij nog een onnodige & toe op het einde als PHPSESSID de laatste parameter was, maar zo een ramp is dat niet gok ik :)?

JohnBeton

Legacy Member
Rvl zei:
Dus eigelijk komt ge hier een vraag stellen waar ge zelf al een antwoord op weet (aka een retorische vraag). Redelijk dom niet?
Helemaal niet :)
1. preg inderdaad pas gevonden na posten van thread
2. weet nog steeds niet of dit de snelste methode is (alle input hierover is steeds welkom!)


@killgore
werkt algemeen, enkel voegt hij nog een onnodige & toe op het einde als PHPSESSID de laatste parameter was, maar zo een ramp is dat niet gok ik
Is eigenlijk wel een probleem :)

Toch bedankt voor de moeite. Ik ga het voorlopig houden bij 'mijn' preg_replace, en er van uitgaan dat de session ID altijd de laatste parameter is in de query.

JohnBeton

Legacy Member
Nog een kleintje: hoe zorg ik ervoor dat m'n regexp case incensitive wordt??

killgore

Legacy Member
na uw laatste delimiter (ik gebruik #) i plaatsen,

bv: preg_replace(#regex#i",...);

edit: $regex="#(\&PHPSESSID[^&]+$|PHPSESSID(.*\&|.*))#i";

is vrij volledig denk ik :p
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan