Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

javascript, frames en argumenten

Pagina: 1
Acties:
  • 167 views sinds 30-01-2008
  • Reageer

  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
Ik beheer een onderdeel van een website en die gehele website werkt met frames. Het gaat om de pagina's onder http://reunie.qharmony.nl/ die ik onder beheer heb.

Ieder oud-lid dat nog gezocht wordt, kan zich via een link in dit systeem melden. Die links zijn ook door o.a. Google opgepikt en het zou dus kunnen zijn dat hier rechtstreeks op geklikt wordt. Dat werkt echter niet en wel om de volgende reden.

Op dit moment wordt met een simpel javascript afgevangen
JavaScript:
1
2
3
4
if(top.location == self.location)  {
//als niet in frames geladen is, dit dan doen
    self.location.replace("http://www.qharmony.nl/index.php?src="+self.location);
}


In die index.php wordt dan met een simpel isset commando gecontroleerd of het frame wellicht vervangen moet worden.

Het punt is nu: al die links naar de pagina's om bepaalde oud-leden te mailen bevatten twee argumenten: een ID en een hash-waarde. Dat levert dus URL's op die fout zijn:
/index.php?src=bla.php?LidID=1&hash=bla
Hoe zorg ik er nu voor dat het tweede vraagteken vervangen wordt door een &-teken, zodat ik dit vervolgens in de index.php met php-code verder goed kan afvangen?

Ik heb al vanalles geprobeerd met javascript replace commando, maar het enige waar dit toe leidt is dat ik dit krijg:
/index.php?src=undefined
De vraag is dus kortweg: hoe krijg ik een pagina met argumenten, toch juist in een frameset?


Alvast bedankt!


Ps. Die hash-waarde als argument kan er overigens ondertussen best uit, maar wat ik nu wil moet volgens mij toch ook gewoon kunnen?

  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 28-11 11:15

sopsop

[v] [;,,;] [v]

Ik denk niet dat je het tweede ? wilt vervangen door een &. Ik denk dat je op zoek bent naar een url-encode functie. Bijvoorbeeld: http://www.webtoolkit.info/javascript-url-decode-encode.html

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:51

crisp

Devver

Pixelated

Bijna alle browsers hebben daar tegenwoordig standaard functies voor; dit zou voldoende moeten zijn:
JavaScript:
1
self.location.replace("http://www.qharmony.nl/index.php?src="+encodeURIComponent(self.location));

Intentionally left blank


  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
crisp schreef op maandag 03 september 2007 @ 10:31:
Bijna alle browsers hebben daar tegenwoordig standaard functies voor; dit zou voldoende moeten zijn:
JavaScript:
1
self.location.replace("http://www.qharmony.nl/index.php?src="+encodeURIComponent(self.location));
Dat werkt in ieder geval niet helaas. Ik heb dit gedaan namelijk:
JavaScript:
1
2
3
4
if(top.location == self.location)  {
//als niet in frames geladen is, dit dan doen
  self.location.replace("http://www.qharmony.nl/index.php?src="+encodeURIComponent(self.location));
}


Opgeslagen als test.htm en vervolgens deze URL opgeroepen:
http://reunie.qharmony.nl/test.htm?a=1&b=2

Dat levert een internal server error op.

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
Dat is een server-side error.

Ligt dat niet aan je PHP-code? Wat is de relevantie PHP-code eigenlijk? http://www.checkupdown.com/status/E500.html

[ Voor 35% gewijzigd door Rekcor op 03-09-2007 10:47 ]


  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
Rekcor schreef op maandag 03 september 2007 @ 10:45:
Dat is een server-side error.

Ligt dat niet aan je PHP-code? Wat is de relevantie PHP-code eigenlijk? http://www.checkupdown.com/status/E500.html
De PHP-code voor die frameset is heel simpel op het niveau van dit:
PHP:
1
if (isset($_GET['src'])) { $frame = $_GET['src']; } else { $frame = "bla"; }


Maar het zal toch niet aan de php-code liggen, want ik heb later een bestandje gemaakt met de mooie naam framecheck2.php met deze inhoud:
PHP:
1
2
3
<?php
echo "De URL is: ".utf8_decode ( $_GET['src']);
?>


En ook die levert een 500 internal server op: http://reunie.qharmony.nl/test.htm?a=1&b=2

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:51

crisp

Devver

Pixelated

Blijkbaar vind je server een geëncodeerd vraagteken (%3F) niet lief, of in ieder geval een argument dat 'lijkt' op een URL met argumenten (duh, dat is het ook) - het zal wel een vage beveiligingsoptie zijn die je vast uit moet kunnen zetten.

[ Voor 56% gewijzigd door crisp op 03-09-2007 10:59 ]

Intentionally left blank


  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
crisp schreef op maandag 03 september 2007 @ 10:57:
Blijkbaar vind je server een geëncodeerd vraagteken (%3F) niet lief, of in ieder geval een argument dat 'lijkt' op een URL met argumenten (duh, dat is het ook) - het zal wel een vage beveiligingsoptie zijn die je vast uit moet kunnen zetten.
Ok, maar dat zal op een shared-hosting site wel geen optie zijn.

Alternatief is een constructie waarbij ik de URL in javascript omzet in een bepaalde waarde en dit met PHP weer terugzet, om het in de frameset te kunnen zetten. Nu heb ik al eerder veel zitten prutsen met het Javascript-replace commando, maar kom er niet helemaal uit.

Waarom werkt bijv. zoiets niet:
JavaScript:
1
encodeURIComponent(self.location.replace("?", "*"))

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:51

crisp

Devver

Pixelated

Het is dus volgens mij de AllowEncodedSlashes directive: http://httpd.apache.org/d....html#allowencodedslashes
TromboneFreakus schreef op maandag 03 september 2007 @ 11:09:
[...]

Waarom werkt bijv. zoiets niet:
JavaScript:
1
encodeURIComponent(self.location.replace("?", "*"))
Omdat location geen string is maar een object; location.href.replace werkt wel ;)
Maar het zit 'm dus in de slashes, niet in de encoded query-parameters.

[ Voor 63% gewijzigd door crisp op 03-09-2007 11:14 ]

Intentionally left blank


  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
TromboneFreakus schreef op maandag 03 september 2007 @ 11:09:
[...]

Ok, maar dat zal op een shared-hosting site wel geen optie zijn.
Dat kan toch met htaccess-bestandjes?

  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
crisp schreef op maandag 03 september 2007 @ 11:12:Omdat location geen string is maar een object; location.href.replace werkt wel ;)
. Ok, merci, ga ik mee aan de slag.
Maar het zit 'm dus in de slashes, niet in de encoded query-parameters.
Dat lijkt me sterk. Waarom zou dit anders wel werken:
code:
1
http://reunie.qharmony.nl/framecheck2.php?src=http%3A%2F%2Freunie.qharmony.nl%2Ftest.htm


En dit niet:
code:
1
http://reunie.qharmony.nl/framecheck2.php?src=http%3A%2F%2Freunie.qharmony.nl%2Ftest.htm%3Fa%3D1%26b%3D2


Terwijl in die toevoeging toch echt geen '%2F' of '%5C' voorkomt.

Of bedoel je nog heel andere slashes?

[ Voor 3% gewijzigd door TromboneFreakus op 03-09-2007 11:45 ]


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:51

crisp

Devver

Pixelated

TromboneFreakus schreef op maandag 03 september 2007 @ 11:44:
[...]
Of bedoel je nog heel andere slashes?
Ik weet niet helemaal zeker wat er hier aan de hand is; het feit dat Apache een status 500 genereerd ipv een 404 zoals vermeld in de docs duidt imo toch op een bug, en gezien het feit dat Apache 2 meer met dit soort bugs te kampen heeft gehad lijkt het me zelfs zeer waarschijnlijk.

De enige vraag die overblijft is of het aanzetten van de AllowEncodedSlashes directive dit wel of niet oplost (oftewel: of dit de veroorzaker is).

Intentionally left blank


  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
Ik ben hier een paar dagen niet mee bezig geweest, maar heb nu toch een oplossing. Dank aan Crisp met zijn tip over Javascript (hier), die bracht me op het goede pad. Aangezien GoT me al vaak geholpen heeft, hier weer wat code terug.


Het idee is nu als volgt:
framecheck.js
JavaScript:
1
2
3
4
5
if(top.location == self.location)  {
//als niet in frames geladen is, dit dan doen
  var str= location.href;
    self.location.replace("http://www.qharmony.nl/index.php?src="+str.replace("?", "&"));
}


index.php
PHP:
1
2
3
4
5
6
$src = $_GET['src'];
//als deze var als paramter wordt meegegeven, dan is er sprake van javascript aanroep om in frames te gaan laden
if (isset($_GET['hash'])) {
    $LidID = $_GET['LidID'];
  $src .= "?LidID=$LidID&hash=".$_GET['hash'];
}


(die isset kan natuurlijk naar ieder van de drie variabelen LidID, hash en src verwijzen, heb er gewoon een gekozen)

Verderop in die index.php staat dan vervolgens natuurlijk nog code om de frame te vervangen als de variabele $src bestaat en een waarde heeft.


En vervolgens in ieder bestand in de HTML-code in de head-sectie:
HTML:
1
<SCRIPT language="JavaScript" SRC="framecheck2.js"></SCRIPT>



Het effect is kortweg als volgt: als een pagina niet in frames geladen werd en eigen parameters meekreeg, worden die parameters nu simpelweg extra parameters van de aanroep van de frameset. In het bestand met de frameset plakt de PHP-code deze extra parameters weer simpelweg achter de URL van de pagina die in frames geladen moet worden.
Pagina: 1