[PHP] fsockopen werkt niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Goedendag allemaal.

Ik wil met een php script een PDF van een andere server ophalen en doorsturen naar de client. Mij leek fsockopen hier een goede oplossing voor.

De PDF staat met credentials beveiligt, laten we die user en pass noemen. In 1 van die 2 zit een spatie, maar daar hoeft toch niks speciaals mee gedaan te worden?

Het script:
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
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
<?
error_reporting( E_ALL );
session_start();

$_SESSION = '';
$_SESSION['user'] = 72;

if( IsSet( $_GET['module'] ) AND !empty( $_GET['module'] ) )
{
    # er is een module in de URL
    $module = intval( $_GET['module'] );
    $cursist = $_SESSION['user'];

    # verbinding openen
    $socket = fsockopen( 'ipadres', 80, $errno, $errstr, 30 );

    if( $socket )
    {
        # verbinding opzetten is gelukt

        # header samenstellen
        $output = "GET url+query HTTP/1.1\r\n";
        $output .="Host: ipadres\r\n";
        $output .="Authorization: Basic " . base64_encode( "user:pass" ) . "\r\n";
        $output .="\r\n";
        
        # header naar socket sturen
        if( fwrite( $socket, $output ) )
        {
            print_r( stream_get_meta_data( $socket ) );
            
            # output van socket [de PDF] opslaan
            while ( !feof( $socket ) )
            {
                $buffer = fgets( $socket, 1 );
                echo $buffer;
            }
        }
        else
        {
            # output sturen is mislukt
            echo "Het sturen is mislukt!";
        }
        
        # verbinding sluiten
        fclose( $socket );
    }
    else
    {
        # verbinding is mislukt, error weergeven
        echo $errstr . ': ' . $errno;
    }
}
else
{
    # geen module in URL
    echo "Geen module in url!";
}
?>


uit print_r( stream_get_meta_data( $socket ) ); krijg ik het volgende:
Array ( [stream_type] => socket [unread_bytes] => 0 [timed_out] => [blocked] => [eof] => )

Er komt dus niks terug, ook geen andere headers. Ik krijg ook een timeout bij de while, omdat er nooit een EOF zal komen (logisch want het resultaat is 0)

Ik heb iets gelezen over een realm, maar dat is toch alleen voor de server waar de PDF opstaat?

De PDF staat op een windows machine.

Waarom werkt het niet?
Alvast tnx!

Roemer

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Heb je de uiteindelijk gegenereerde headers al eens vergeleken met het manuel uitvoeren van deze actie?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • igmar
  • Registratie: April 2000
  • Laatst online: 03-09 22:58

igmar

ISO20022

Verwijderd schreef op 05 november 2004 @ 11:54:
Ik wil met een php script een PDF van een andere server ophalen en doorsturen naar de client. Mij leek fsockopen hier een goede oplossing voor.
Mij niet :) Je kan daarvoor beter een socket stream openen (met fopen), of curl gebruiken.

code:
1
2
3
        # header samenstellen
        $output = "GET url+query HTTP/1.1\r\n";
        $output .="Host: ipadres\r\n";


Host: is normaliter een hostname, en geen IP. Als je op IP connect is die Host header verder ook niet zinnig.
Waarom werkt het niet?
Alvast tnx!
Geen idee, maar begin eens met te kijken wat er gebeurd als je bovenstaande met telnet naar de betreffende machine stuurt :)

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

igmar schreef op 05 november 2004 @ 17:02:
[...]

code:
1
2
3
        # header samenstellen
        $output = "GET url+query HTTP/1.1\r\n";
        $output .="Host: ipadres\r\n";


Host: is normaliter een hostname, en geen IP. Als je op IP connect is die Host header verder ook niet zinnig.
Dat formuleer je niet helemaal correct. Een connectie wordt immers altijd op IP gemaakt. Een Host: IPadres is inderdaad nutteloos; het maken van een connectie naar een IP met als Host header een DNS name zou wel correct en zinnig zijn :)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Spider.007 schreef op 05 november 2004 @ 12:13:
Heb je de uiteindelijk gegenereerde headers al eens vergeleken met het manuel uitvoeren van deze actie?
Ik heb nu Ethereal geinstalled, en daarmee de headers van firefox en de server bekeken. Hieruit bleek dat de server met NTLM authorization werkt.

Hier de eerste [client] en tweede [server] headers
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
GET url_query HTTP/1.1
Host: ip
User-Agent: Mozilla/5.0 (Windows; U; Win98; rv:1.7.3) Gecko/20040913 Firefox/0.10.1
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive


HTTP/1.1 401 Unauthorized
Content-Length: 1656
Content-Type: text/html
Server: Microsoft-IIS/6.0
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
MicrosoftOfficeWebServer: 5.0_Pub
X-Powered-By: ASP.NET
Date: Sun, 07 Nov 2004 16:32:30 GMT


Als ik dan de eerste header (dus van die client) gebruik bij de socket, krijg ik helemaal niks terug. Ook als ik een andere header van de handshake gebruik gebeurt er niks....

ik snap er echt niks meer van....een van jullie misschien?

[edit]
Ik heb het script ondertussen vanaf mijn eigen pc gerunt (stond eerst op andere server) en daarbij ook "gesnift".
Het blijkt nu dat ik wel gewoon een header terug krijg van de server, maar het script vangt dat dus blijkbaar niet op...?

Hoe het script nu is:
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
# verbinding openen
$socket = fsockopen( 'ip', 80, $errno, $errstr, 30 );

if( $socket )
{
    # verbinding opzetten is gelukt
    stream_set_blocking( $socket, FALSE );

    # header samenstellen
    $output =  "GET url+query HTTP/1.1\r\n";
    $output .= "Host: ip\r\n";
    $output .= "User-Agent: Mozilla/5.0 (Windows; U; Win98; rv:1.7.3) Gecko/20040913 Firefox/0.10.1\r\n";
    $output .= "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n";
    $output .= "Accept-Language: en-us,en;q=0.5\r\n";
    $output .= "Accept-Encoding: gzip,deflate\r\n";
    $output .= "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
    $output .= "Keep-Alive: 300\r\n";
    $output .= "Connection: keep-alive\r\n";
    $output .= "\r\n\r\n";
    echo $output;
        
    fwrite($socket, $output);
    echo fgets( $socket );
    fclose( $socket );
}


ik snap er nu NOG minder van...

[ Voor 32% gewijzigd door Verwijderd op 07-11-2004 18:01 ]


Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Leuk dat je met ethereal het probleem hebt weten te traceren :) Nu valt mij echter op dat je fwrite en fgets gebruikt; waarom? Lees dit eens door: PHP: Socket Functions - Manual; er bestaan gewoon socket_write en socket_read functies?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 07 november 2004 @ 17:35:
[...]

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
# verbinding openen
$socket = fsockopen( 'ip', 80, $errno, $errstr, 30 );

if( $socket )
{
    # verbinding opzetten is gelukt
    stream_set_blocking( $socket, FALSE );

    # header samenstellen
    $output =  "GET url+query HTTP/1.1\r\n";
    $output .= "Host: ip\r\n";
    $output .= "User-Agent: Mozilla/5.0 (Windows; U; Win98; rv:1.7.3) Gecko/20040913 Firefox/0.10.1\r\n";
    $output .= "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n";
    $output .= "Accept-Language: en-us,en;q=0.5\r\n";
    $output .= "Accept-Encoding: gzip,deflate\r\n";
    $output .= "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
    $output .= "Keep-Alive: 300\r\n";
    $output .= "Connection: keep-alive\r\n";
    $output .= "\r\n\r\n";
    echo $output;
        
    fwrite($socket, $output);
    echo fgets( $socket );
    fclose( $socket );
}


ik snap er nu NOG minder van...
het kan natuurlijk aan mij liggen.. maar je zet je socket op non-blocking en dan vind je het gek dat je geen data terug krijgt. Je gaat er nu vanuit dat de data direct terug gestuurd wordt nadat je een request stuurt; bietje vreemd nietwaar? :)
verder is het hier totaal niet nodig om socket functies te gebruiken omdat het nu eenmaal overbodig is hier. Daar kun je het alleen maar moeilijker door maken.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ahhh....ik interpeteerde (?) die functie precies andersom dan ie is :P

Maar hoezo is het volgens jou dan overbodig om socket functies te gebruiken? Het is namelijk niet alleen een bestand opvragen, maar er moet een [challange-]response gemaakt worden voor het NTLM authorization protocol....

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 07 november 2004 @ 21:04:
ahhh....ik interpeteerde (?) die functie precies andersom dan ie is :P

Maar hoezo is het volgens jou dan overbodig om socket functies te gebruiken? Het is namelijk niet alleen een bestand opvragen, maar er moet een [challange-]response gemaakt worden voor het NTLM authorization protocol....
jah, dat is waar. Maar omdat het hier over een normale tcp stream gaat is het niet nodig om socket functies te gebruiken. fsockopen is dus prima te gebruiken voor de challenge-repsonse voor NTLM.
En zoals je ook op http://www.innovation.ch/java/ntlm.html kan zien gaat alles gewoon via http headers, dus zijn er totaal geen spannende functies ofzo nodig.
Pagina: 1