[php] Onzichtbare WWW-Authentication d.m.v. HTTP headers

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

Onderwerpen


Acties:
  • 0 Henk 'm!

  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
Nu ik vandaag weer verder ging aan mijn projectje kwam ik weer mijn probleem tegen. Ik wil graag het WWW-Authenticatie scherm van de browser vermeiden en daarvoor zelf in de plaats de authenticatie verzorgen.

Nu heb ik hier een manier voor gevonden. Dankzij een vorige topic hier op GoT:
PHP:
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
<?php
    $request = "GET ".$rootmap."/members/ HTTP/1.0\r\n";
    $request .= "Host: ".$hostname.":80\r\n";
    if(substr(getenv(OS),0,7) == 'Windows'){
        $request .= "Authorization: Basic ".base64_encode("winuser:password")."\r\n";
    }else{
        $request .= "Authorization: Basic ".base64_encode("unixuser:password")."\r\n";
    }
    $request .= "User-Agent: PHP/".phpversion()."\r\n";
    $request .= "\r\n";
    #log in op de server
    $socket  = fsockopen($hostname, 80, $errno, $errstr, 20);
    if (!$socket) {
      die('<h3>error</h3>Could not connect to socket!');
    } else {
      fputs($socket, $request); #stuur de request naar de server
      #haal de data uit de socket
        while(!feof($socket)){
          $buffer = fgets($socket, 8192);
            if($content == false){
              $strLine = ereg_replace("[\r\n]", "", $buffer);
                if(strlen($strLine) == 0){
                  $content = true;
                }
            }else{
              echo $buffer;
            }
        }
        fclose ($socket);
    }
?>

Met dit script wordt de inhoud van de index.html uit de map /members/ weergegeven. Als ik nu echter bijv. een linkje plaats in die pagina, naar een andere pagina in de zelfde map, en je klikt daar op, kijg je weer de popup dat je opnieuw moet identificeren.

Dit is dus niet wat ik graag zou hebben. Ik wil dat je net door die map kunt bladeren als je zou kunnen als je via de WWW-Authentication van de browser hebt gedaan.

Nu heb ik zelf al naar een oplossing zitten te zoeken, en had het volgende document gevonden: http://www.zvon.org/tmRFC/RFC2069/Output/chapter2.html
Hierin staat het volgende beschreven:
The following example assumes that an access-protected document is
being requested from the server. The URI of the document is
"http://www.nowhere.org/dir/index.html". Both client and server know
that the username for this document is "Mufasa", and the password is
"CircleOfLife".

The first time the client requests the document, no Authorization
header is sent, so the server responds with:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest realm="testrealm@host.com",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
opaque="5ccc069c403ebaf9f0171e9517f40e41"

The client may prompt the user for the username and password, after
which it will respond with a new request, including the following
Authorization header:

Authorization: Digest username="Mufasa",
realm="testrealm@host.com",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
uri="/dir/index.html",
response="e966c932a9242554e42c8ee200cec7f6",
opaque="5ccc069c403ebaf9f0171e9517f40e41"
Zoals je kunt zien, wordt in de laatste HTTP Header beschreven hoe je kunt authoriseren op de server. Die header wordt namelijk door de browser verstuurd.

Nu vraag ik me af of je deze header met PHP kunt samen stellen. Hoe dit moet staat ook in het document. Ik kom alleen er niet uit hoe je de response-digest (te vinden in: 2.1.2. The Authorization Request Header) moet maken. Het staat wel beschreven hoe het moet, hieronder een quote daarvan:
response-digest =
<"> < KD ( H(A1), unquoted nonce-value ":" H(A2) > <">

A1 = unquoted username-value ":" unquoted realm-value
":" password
password = < user's password >
A2 = Method ":" digest-uri-value
De bedoeling is dus dat PHP de juiste HTTP Header opstelt, zodat deze verstuurd wordt, en je in een nieuwe pagina de inhoud van een document in de beveiligde map ziet. Daarna moet je gewoon verder door die map kunnen bladeren, omdat je dus geauthoriseerd bent.

Is dit mogelijk, en zou iemand mij daar mee kunnen helpen?

Dan nog een kleine vraag:
Weet iemand waarom dit niet werkt in PHP:
PHP:
1
2
3
<?php
header('location: http://username:password@localhost/dir/file.html');
?>

Als ik zo'n url namelijk gewoon in de browser invoer werkt het wel, maar als ik de zelfde (werkende) url in een header zet, werkt het niet, en krijg ik een 404 te zien.

Acties:
  • 0 Henk 'm!

  • jochemd
  • Registratie: November 2000
  • Laatst online: 24-08 12:31
RFC 2069 is superceded door RFC 2617. Die zou toch echt genoeg informatie moeten bevatten om Digest Authentication te kunnen implementeren. Niet dat dat je helpt, want je bent nog steeds PHP aan het authenticeren, en niet de browser.

Acties:
  • 0 Henk 'm!

  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
jochemd schreef op 22 juli 2003 @ 23:47:
Niet dat dat je helpt, want je bent nog steeds PHP aan het authenticeren, en niet de browser.
Is het dan wel mogelijk om m.b.v. PHP de browser te auhenticeren?

Acties:
  • 0 Henk 'm!

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 17-09 07:55

thomaske

» » » » » »

Ja, maar dan kan je niet direct naar de beveiligde files linken, maar moet het via een omweg (doe.php?url=http://deze.file.wil.ik.hebben, oid)

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


Acties:
  • 0 Henk 'm!

  • jochemd
  • Registratie: November 2000
  • Laatst online: 24-08 12:31
oikoyama schreef op 23 July 2003 @ 00:01:
[...]

Is het dan wel mogelijk om m.b.v. PHP de browser te auhenticeren?
Niet automatisch. Als je echt de browser wil authenticeren zal je op je eigen site en de andere site het zelfde realm, username en password moeten gaan gebruiken. Als een user dan bij jou inlogt middels Digest Authentication kan je er voor zorgen dat hij in het vervolg die headers ook automatisch naar die andere site stuurt. Zie de RFC.

Acties:
  • 0 Henk 'm!

  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
jochemd schreef op 23 July 2003 @ 01:12:
Als je echt de browser wil authenticeren zal je op je eigen site en de andere site het zelfde realm, username en password moeten gaan gebruiken.
Bedoel je met het woord site een pagina? Want alles komt op één domein, site dus te draaien. Ik hoef alleen maar van pagina naar pagina in een beveiligde map te gaan...
jochemd schreef op 23 July 2003 @ 01:12:
Als een user dan bij jou inlogt middels Digest Authentication kan je er voor zorgen dat hij in het vervolg die headers ook automatisch naar die andere site stuurt.
Weet jij toevallig hoe je dit moet toepassen?

Acties:
  • 0 Henk 'm!

  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
[edit]Deze had hier niet moeten staan... :/

[ Voor 93% gewijzigd door bgever op 23-07-2003 10:49 ]


Acties:
  • 0 Henk 'm!

  • jochemd
  • Registratie: November 2000
  • Laatst online: 24-08 12:31
oikoyama schreef op 23 juli 2003 @ 10:47:

Bedoel je met het woord site een pagina?
Je kan er zo veel tegelijk mee beveiligen als je wil, van één pagina tot een geclusterde mega-site.
Weet jij toevallig hoe je dit moet toepassen?
Zie RFC 2617, sectie 3.2.1 onder Domain.

Acties:
  • 0 Henk 'm!

  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
jochemd schreef op 23 July 2003 @ 10:59:
[...]
Zie RFC 2617, sectie 3.2.1 onder Domain.
Ik bedoelde eigenlijk meer in de zin van, hoe je dit met PHP kunt uitvoeren...

Het gaat er namelijk om, dat ik naar een nieuwe pagina die headers moet kunnen versturen, en ik heb geen idee hoe ik dat in PHP moet doen.

Acties:
  • 0 Henk 'm!

  • jochemd
  • Registratie: November 2000
  • Laatst online: 24-08 12:31
oikoyama schreef op 23 July 2003 @ 11:49:

Het gaat er namelijk om, dat ik naar een nieuwe pagina die headers moet kunnen versturen, en ik heb geen idee hoe ik dat in PHP moet doen.
Je moet misschien die RFC nog eens lezen. Je moet die headers niet in een HTTP request stoppen, maar in een response.

Acties:
  • 0 Henk 'm!

  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
Vreemd, als ik deze code gebruik gebeurd er niets, ik krijg geen popup te zien voor wachtwoord/gebruikersnaam.
PHP:
1
2
3
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Digest realm="testrealm@localhost", 
domain="http://localhost/isecure/members/"');

Terwijl dit wel werkt:
PHP:
1
header('WWW-Authenticare: Basic realm="Secured Zone"');

Waarom krijg ik geen popup te zien?

[edit]
Vreemd, lees dit eens: http://lists.w3.org/Archi...maya/2003JanMar/0372.html
Onder Mozilla Firebird werkt het namelijk wel :S

[ Voor 33% gewijzigd door bgever op 24-07-2003 00:49 ]


Acties:
  • 0 Henk 'm!

  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
Ik heb nu het volgende gedaan om het op te lossen, en hierdoor komt ook in IE een popup:
PHP:
1
2
header('WWW-Authenticate: Digest realm="testrealm@localhost",
nonce="isecure", qop="auth", domain="http://localhost/isecure/members/"');

Het probleem is dan, dat er dus een qop is gedefineerd, en je niet zelf een cnonce in de Authorization Request Header kunt maken omdat dit de client en server moeten doen, en hierdoor wordt ook nog de request-digest aangepast.

De enigste oplossing is dan om qop niet te gebruiken, maar dan werkt het niet meer in IE.
Bovendien als ik dan de vogende header verstuur:
PHP:
1
2
3
4
header('Authorization: Digest username="winuser",
realm="testrealm@localhost-0", nonce="isecure",
uri="http://localhost/isecure/members/index.html",
response="e85b25983606357141b556d383b10bcb"');

Werkt het niet terwijl deze in mozilla is aangemaakt door de volgende header:
PHP:
1
2
header('WWW-Authenticate: Digest realm="testrealm@localhost",
nonce="isecure", domain="http://localhost/isecure/members/"');


Wie kan mij helpen dat het wel werkt?

[ Voor 10% gewijzigd door bgever op 24-07-2003 01:29 . Reden: betere template opmaak van GoT ]


Acties:
  • 0 Henk 'm!

  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
*kick*
Niemand een idee hoe ik die WWW-Authentication kan omzeilen, want met Digest authorization lukt het me niet...

Edit
Jeeej! Ik heb een andere manier gevonden om bestanden uit de dir op te roepen :). Deze manier werkt voor zover ik weet in Mozilla en IE, en het goeie er aan is dat niemand de username & password kunnen zien terwijl deze gewoon in een url verstuurd worden :).

Hoe heb ik het opgelost?
Met de functie readfile() van PHP kun je een content van een bestand echo'en. Deze kun je aanroepen d.m.v. een HTTP request. Nu heb ik in die url dus het username en password staan, in de zin van: http://username:password@url.
Het enigste wat ik nog moet doen is voordat de functie aangeroepen wordt nog ff het juiste MIME type aan te geven. Dit kun je doen door een Content-Type HTTP header te versturen.
Via een GET methode wordt de locatie van het bestand (zonder user&pass) doorgegeven en wordt de juiste readfile functie aangemaakt.
Om ervoor te zorgen dat niet elke gek die url in typt, wordt elke user eerst nog ge indentificeerd door te kijken of er een sessie loopt, met daarin juiste gegevens. (dit wordt gedaan d.m.v. bijv. een login).

Dit is dus een mooie oplossing, want je ziet niets van een login. Het kan ook goed als ANTI-LEECH systeem dienen, want alle files worden beveiligd d.m.v. HTTP Athtentication, dus je kunt geen directe link maken want anders komt de browser met een login popupje op de proppen :). Het enigste wat je moet doen, is een sessie aanmaken als je op JOUW pagina zit, en dan zal het scriptje die sessie herkennen en gewoon output geven :D.

Het enigste nadeel is dat je vreemde links en img HTML tags moet maken waar je verwijst naar een script.
vb: [img]"http://www.bla.com/get.php?file=map/file.ext&mimetype=image/gif"[/img]

Natuurlijk kun je ook nog een mooi linkje maken d.m.v. mod_rewrite waardoor je iets krijgt als:
http://www.bla.com/getsecuredfile/gif/map/file.ext

Nou, klinkt dit goed of goed? (als iemand hier opmerkingen op heeft, laat het me ff weten... ;))

Het enigste wat ik nu moet weten welke MIME types dr allemaal zijn. Heb nog geen lijst kunnen vinden op google (iemand linkje?). [edit2] http://www.isi.edu/in-not...s/media-types/media-types [/edit2]

[ Voor 94% gewijzigd door bgever op 25-07-2003 02:10 ]

Pagina: 1