PHP (cURL) inloggen op website (CSRF_token)

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
Hallo allemaal,

Graag zou ik -middels een PHP script- op een website inloggen en daar een actie uitvoeren zodat 's morgens een telefoonnummer aan de lijst kan toevoegen, en dit 's avonds weer kan weghalen (script doet dus 2x per dag nét even iets anders, maar het lijkt natuurlijk wel op elkaar).


Ik maak gebruik van PHP en cURL. Imiddels ben ik zover dat ik "onderwater" kan inloggen, en op de website bijvoorbeeld de gemiste oproepen kan inzien die ik vervolgens ieder kwartier vanuit het scriptje doorsturen naar onze mailadressen.

Om in te loggen doe ik een POST naar de website. Vervolgens die ik (zonder dat ik cURL afsluit) een aanvraag naar deze link: https://mijn.bereik.io/history om de gemiste oproepen op te halen.
So far, so good. Dat werkt. Best handig 8)

Maar nu komt het: om een extra telefoonnummer toe te voegen wordt er schijnbaar ook een POST gedaan. Ik check dit met Live HTTP Headers. Dus ik denk "dan hoef ik ook maar weer gewoon in te loggen, en in dezelfde cURL-sessie nogmaals zo'n post te doen om die actie (tel.nr. toevoegen) te simuleren". Maar dat valt dus tegen. Deze keer wordt er namelijk een CSRF token meegestuurd in de 2e post (het nieuwe telefoonnummer toevoegen dus). Ik krijg echter die token nergens te pakken. Ik zie hem pas (in Live HTTP Headers) als ik de actie gewoon "handmatig" via de browser doe.

Is er een manier om ook via een PHP script (dus "onderwater") dit extra telefoonnummer toe te voegen? Ik ben van mening dat alles wat ik zelf (met de muis/toetsenbord) via de browser doe, ook "gesimuleerd" moet kunnen worden via PHP, klopt dat?

Hoe kan ik dit het beste aanpakken? Ik heb overal gezocht naar zo'n CSRF token, maar kan 'm echt nergens vinden!

Thanks voor 't meedenken alvast _/-\o_

Alle reacties


Acties:
  • +1 Henk 'm!

  • cooper87
  • Registratie: December 2012
  • Laatst online: 20:56
-

[ Voor 116% gewijzigd door cooper87 op 19-10-2020 14:44 ]


Acties:
  • +2 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 15:53
Nee joh, hoeft niet perse met een echte browser (of selenium). Bijv. Goutte kan dat ook: https://github.com/FriendsOfPHP/Goutte

Die kan sessies bijhouden en formulieren invullen. Goutte (met DomCrawler/css selector ed.) kan dan de bestaande waardes (dus ook hidden inputs) meenemen en hoef je alleen je eigen waardes bij te werken.

PHP:
1
2
3
4
5
6
7
$crawler = $client->request('GET', 'https://github.com/');
$crawler = $client->click($crawler->selectLink('Sign in')->link());
$form = $crawler->selectButton('Sign in')->form();
$crawler = $client->submit($form, array('login' => 'fabpot', 'password' => 'xxxxxx'));
$crawler->filter('.flash-error')->each(function ($node) {
    print $node->text()."\n";
});

Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
cooper87 schreef op woensdag 18 januari 2017 @ 13:42:
Die CSRF token is een hidden field in het formulier. Je zult dus een browser moeten simuleren met bijvoorbeeld Behat en Selenium en die op de submit knop laten klikken nadat de waarde van het input veld is aangepast.
Nooit van gehoord, maar klinkt interessant :D
Of de CSRF token parsen vanuit de HTML en meesturen met je POST request. Maar ik kan je nu al vertellen dat je dan tegen meer problemen aan gaat lopen, want er worden ook arguments als __trustedProperties e.d. meegestuurd. Dus Behat en Selenium lijkt mij het makkelijkst.
Die trustedProperties krijg ik wel te pakken, dus dat moet geen probleem zijn. Tenminste, als het er niet nog meer zijn die ik dan weer niet zie ;)
Overigens hopen we hier ooit een API voor aan te kunnen bieden ;)
We? :P Heb ik hier te maken met iemand van bij Bereik? _/-\o_

Thanks voor je reactie! Ik ga ondertussen eens kijken naar dat Behat en Selenium!

[edit]
Barryvdh schreef op woensdag 18 januari 2017 @ 13:51:
Nee joh, hoeft niet perse met een echte browser (of selenium). Bijv. Goutte kan dat ook: https://github.com/FriendsOfPHP/Goutte

Die kan sessies bijhouden en formulieren invullen. Goutte (met DomCrawler/css selector ed.) kan dan de bestaande waardes (dus ook hidden inputs) meenemen en hoef je alleen je eigen waardes bij te werken.

PHP:
1
2
3
4
5
6
7
$crawler = $client->request('GET', 'https://github.com/');
$crawler = $client->click($crawler->selectLink('Sign in')->link());
$form = $crawler->selectButton('Sign in')->form();
$crawler = $client->submit($form, array('login' => 'fabpot', 'password' => 'xxxxxx'));
$crawler->filter('.flash-error')->each(function ($node) {
    print $node->text()."\n";
});
Ik ga er meteen naar kijken :)

[ Voor 28% gewijzigd door Atmoz op 18-01-2017 13:54 ]


Acties:
  • 0 Henk 'm!

  • cooper87
  • Registratie: December 2012
  • Laatst online: 20:56
-

[ Voor 99% gewijzigd door cooper87 op 19-10-2020 14:44 ]


Acties:
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 15:53
cooper87 schreef op woensdag 18 januari 2017 @ 13:42:
Die CSRF token is een hidden field in het formulier. Je zult dus een browser moeten simuleren met bijvoorbeeld Behat en Selenium en die op de submit knop laten klikken nadat de waarde van het input veld is aangepast.

Of de CSRF token parsen vanuit de HTML en meesturen met je POST request. Maar ik kan je nu al vertellen dat je dan tegen meer problemen aan gaat lopen, want er worden ook arguments als __trustedProperties e.d. meegestuurd. Dus Behat en Selenium lijkt mij het makkelijkst.

Overigens hopen we hier ooit een API voor aan te kunnen bieden ;)
Ik weet niet of je een API wil aanbieden voor Selenium/Behat, of voor de website die genoemd wordt. Maar
cooper87 schreef op woensdag 18 januari 2017 @ 13:57:
[...]


Dat zou zo maar kunnen ;) De reden dat ik Behat en Selenium noem is omdat wij op die manier onze acceptance tests uitvoeren (waarbij we o.a. dit exacte scenario testen):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  @javascript
  Scenario: Update forwarding target with a second valid telephone number
    Given I am authenticated as "x" using password "y"
    When I go to "numbers/x"
      And I follow "edit-forwarding"
    Then I should be on "numbers/x/forwarding"
      And I should see "Naar welk(e) nummer(s) wil je dat we de beller doorschakelen (maximaal 5)?"
    When I follow "add-forwarding-number"
      And I wait for "1000" ms
    When I fill in "target[1][number]" with "x"
      And I select "+49" from "target[1][countryCode]"
      And I press "submit"
    Then I should be on "numbers/x"
      And I should see "We schakelen de beller door naar de nummers: x, y"


Waarbij x en y variablen zijn die je zelf moet invullen ;)

Maar wat Barryvdh zegt, in jouw geval is Goutte wellicht makkelijker.
Als je in PHP wil blijven, Laravel heeft onlangs een alpha van Laravel Dusk uitgebracht. Dat is ook een 'echte' browser test alleen dan met PHP API (ChromeDriver). Dan kan je ook makkelijk met Javascript dingen doen (wachten tot bepaalde waarde actief is ed.). Maar dat is pas volgende week 'stable' denk ik en overkill voor jouw ding ;)
https://laravel.com/docs/master/dusk

Acties:
  • 0 Henk 'm!

  • cooper87
  • Registratie: December 2012
  • Laatst online: 20:56
Barryvdh schreef op woensdag 18 januari 2017 @ 14:00:
[...]

Ik weet niet of je een API wil aanbieden voor Selenium/Behat, of voor de website die genoemd wordt. Maar
Voor de functionaliteiten die hij nodig heeft, ja ;)

Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
Ik snap even niet hoe ik dat Goutte aan het werken krijg...

Via https://github.com/FriendsOfPHP/Goutte heb ik de *.zip gedownload.
Die heb ik uitgepakt en geupload naar mijn online webhost waar al m'n PHP spul staat.

Vervolgens ben ik online gaan zoeken naar een tutorial. Daar staat dan vrij bovenaan:

require_once 'goutte.phar';

Maarja, die *.phar file zit niet in het archief c.q. ook niet op de online omgeving waar ik het script wil gaan gebruiken.

Heeft er iemand een idee hoe ik dit kan aanpakken?

Acties:
  • +1 Henk 'm!

  • cooper87
  • Registratie: December 2012
  • Laatst online: 20:56
Je kunt beter met composer werken. Zie ook de handleiding op: https://github.com/FriendsOfPHP/Goutte

Dus composer require fabpot/goutte en dan even de vendor/autoload.php includen in je eigen script.

Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
Thanks.
Dan maar eerst uitzoeken wat composer is/hoe dat werkt :)
Gaat vandaag niet lukken zo te zien O-)

Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
Ok, composer had ik blijkbaar al op m'n pc staan :)

Maar zowel via composer als "handmatig" (ik had ergens die *.phar file vandaan gehaald) kom ik op dezelfde foutmelding uit:

"PHP Fatal error: Uncaught exception 'GuzzleHttp\Exception\RequestException' with message 'cURL error 77: error setting certificate verify locations:"

Schijnbaar toch iets niet goed met een of ander certificaat ofzo. Maarja, daar kom ik natuurlijk niet bij omdat dat het (private) gedeelte van m'n webhost is 8)7

[edit]

Ter compleetheid de hele foutmelding:
PHP Fatal error: Uncaught exception 'GuzzleHttp\Exception\RequestException' with message 'cURL error 77: error setting certificate verify locations:
CAfile: D:\Program Files (x86)\Parallels\Plesk\Additional\PHPSettings\cacert.pem
CApath: none (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)' in D:\Inetpub\vhosts\MijnWebsite.nl\httpdocs\php\vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php:187
Stack trace:
#0 D:\Inetpub\vhosts\MijnWebsite.nl\httpdocs\php\vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php(150): GuzzleHttp\Handler\CurlFactory::createRejection(Object(GuzzleHttp\Handler\EasyHandle), Array)
#1 D:\Inetpub\vhosts\MijnWebsite.nl\httpdocs\php\vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php(103): GuzzleHttp\Handler\CurlFactory::finishError(Object(GuzzleHttp\Handler\CurlHandler), Object(GuzzleHttp\Handler\EasyHandle), Object(GuzzleHttp\Handler\CurlFactory))
#2 D:\Inetpub\vhosts\MijnWebsite.nl\httpdocs\php\vendor\guzzlehttp\guzzle\src\Handler\CurlHan in D:\Inetpub\vhosts\MijnWebsite.nl\httpdocs\php\vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php on line 187

[ Voor 54% gewijzigd door Atmoz op 18-01-2017 16:43 ]


Acties:
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 15:53
Atmoz schreef op woensdag 18 januari 2017 @ 16:41:
Ok, composer had ik blijkbaar al op m'n pc staan :)

Maar zowel via composer als "handmatig" (ik had ergens die *.phar file vandaan gehaald) kom ik op dezelfde foutmelding uit:

"PHP Fatal error: Uncaught exception 'GuzzleHttp\Exception\RequestException' with message 'cURL error 77: error setting certificate verify locations:"

Schijnbaar toch iets niet goed met een of ander certificaat ofzo. Maarja, daar kom ik natuurlijk niet bij omdat dat het (private) gedeelte van m'n webhost is 8)7

[edit]

Ter compleetheid de hele foutmelding:


[...]
Wat zegt je webhost van deze melding?

Acties:
  • 0 Henk 'm!

  • Orthodroom
  • Registratie: December 2014
  • Niet online

Acties:
  • 0 Henk 'm!

  • q-enf0rcer.1
  • Registratie: Maart 2009
  • Laatst online: 09-10 14:44
In de web browser kun je zelf JavaScript uitvoeren via de adresbalk, bijvoorbeeld:

javascript:alert('bami');void(0);

Wellicht is er ook een manier om dit te doen met PHP. Dan zou je een stukje JavaScript kunnen schrijven om het formulier de gewenste values te geven en vervolgens submit() triggeren.
Pagina: 1