Toegang krijgen tot een aspx pagina met behulp van Snoopy
snoopy mezelf door een 2 pagina's met formulieren probeer te loodsen, waarbij ik vervolgens terechtkom op de pagina waar ik wil zijn.
Het doel is om met mijn php class in een keer bij mijn rooster te komen, momenteel gaat dit als volgt:
-Je komt op de eerste pagina: default.aspx hier voer je de eerste 4 letter van je achternaam in en drukt op zoek
-Je komt op de tweede pagina: LogInWebForm.aspx hier kies je uit de lijst je naam en klikt op 'rooster'
-Je komt op de derde pagina: hier zie je je rooster
Het lastige is, dat je niet simpelweg een formuliertje kan doen en direct naar de roosterpagina, maar dat je je door de pagina's heen moet loodsen, en elke keer de _VIEWSTATE variable moet ophalen (waarbij de eerste "static" is).
Hieronder mij class, die in theorie zou moeten werkenin theorie zou moeten werken.
Echter, krijg ik bij het uitvoeren hiervan de volgende print terug:
Waaruit blijkt dat zij een bepaalde instelling hebben gezet "to verify that arguments to postback or callback events originate from the server that originally rendered them".
Ik denk als volgt, als je het met je browser kan doen, moet het met PHP ook mogelijk zijn. Is er een mogelijkheid om mijn script hierop aan te passen, of is het wellicht beter om een geheel andere weg in te slaan?
Hallo, Ik ben recent begonnen met PHP en ik ben bezig met een script waarbij ik met behulp van Het doel is om met mijn php class in een keer bij mijn rooster te komen, momenteel gaat dit als volgt:
-Je komt op de eerste pagina: default.aspx hier voer je de eerste 4 letter van je achternaam in en drukt op zoek
-Je komt op de tweede pagina: LogInWebForm.aspx hier kies je uit de lijst je naam en klikt op 'rooster'
-Je komt op de derde pagina: hier zie je je rooster
Het lastige is, dat je niet simpelweg een formuliertje kan doen en direct naar de roosterpagina, maar dat je je door de pagina's heen moet loodsen, en elke keer de _VIEWSTATE variable moet ophalen (waarbij de eerste "static" is).
Hieronder mij class, die in theorie zou moeten werkenin theorie zou moeten werken.
Quote:
Code (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
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
<?php
include "Snoopy.class.php";
$snoopy = new Snoopy;
$submit_url = "http://walterbosch.cupweb6.nl";
$submit_vars["_nameTextBox"] = "jac";
$submit_vars["_zoekButton"] = "Zoek";
$submit_vars["numberOfLettersField"] = "3";
$submit_vars["__VIEWSTATE"] = "/wEPDwULLTE3NDM5MzMwMzRkZA==";
$snoopy->submit($submit_url,$submit_vars);
while(list($key,$val) = each($snoopy->headers)){
if(stripos($val, "SessionId")!==false)
{
$v = explode("ASP.NET_SessionId=",$val);
$w = explode(";",$v[1]);
$sessionId = $w[0];
}
}
$url = "http://walterbosch.cupweb6.nl/LogInWebForm.aspx";
$x = explode("__VIEWSTATE\" value=\"", $snoopy->results);
$y = explode("\"", $x[1]);
$viewstate = $y[0];
$name = "Berg van den Nick (3H1)[150033]";
$vars["__VIEWSTATE"] = $viewstate;
$vars["_nameDropDownList"] =$name;
$vars["_pincodeTextBox"] = "";
$vars["_roosterbutton"] = "Rooster";
$snoopy->cookies["ASP.NET_SessionId"] = $sessionId;
$snoopy->submit($url,$vars);
print $snoopy->results;
?>
include "Snoopy.class.php";
$snoopy = new Snoopy;
$submit_url = "http://walterbosch.cupweb6.nl";
$submit_vars["_nameTextBox"] = "jac";
$submit_vars["_zoekButton"] = "Zoek";
$submit_vars["numberOfLettersField"] = "3";
$submit_vars["__VIEWSTATE"] = "/wEPDwULLTE3NDM5MzMwMzRkZA==";
$snoopy->submit($submit_url,$submit_vars);
while(list($key,$val) = each($snoopy->headers)){
if(stripos($val, "SessionId")!==false)
{
$v = explode("ASP.NET_SessionId=",$val);
$w = explode(";",$v[1]);
$sessionId = $w[0];
}
}
$url = "http://walterbosch.cupweb6.nl/LogInWebForm.aspx";
$x = explode("__VIEWSTATE\" value=\"", $snoopy->results);
$y = explode("\"", $x[1]);
$viewstate = $y[0];
$name = "Berg van den Nick (3H1)[150033]";
$vars["__VIEWSTATE"] = $viewstate;
$vars["_nameDropDownList"] =$name;
$vars["_pincodeTextBox"] = "";
$vars["_roosterbutton"] = "Rooster";
$snoopy->cookies["ASP.NET_SessionId"] = $sessionId;
$snoopy->submit($url,$vars);
print $snoopy->results;
?>
Echter, krijg ik bij het uitvoeren hiervan de volgende print terug:
Quote:
Invalid postback or callback argument. Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.
Waaruit blijkt dat zij een bepaalde instelling hebben gezet "to verify that arguments to postback or callback events originate from the server that originally rendered them".
Ik denk als volgt, als je het met je browser kan doen, moet het met PHP ook mogelijk zijn. Is er een mogelijkheid om mijn script hierop aan te passen, of is het wellicht beter om een geheel andere weg in te slaan?
Gewijzigd op 14/04/2014 11:17:51 door Nick van Berg
Kan je niet vragen of ze een API hebben, dat lijkt me doeltreffender dan een site proberen te scrapen die opeens van de ene op de andere dag na een update van hun kant weer anders werkt.
Het is vast wel mogelijk, maar hun proberen zich er juist voor te beschermen voor zulke acties. Dus het is niet gewenst. De vraag is dan ook of je er wel zoveel moeite in wil steken om je rooster kunnen zien zonder in te loggen. Hun krijgen waarschijnlijk wel meldingen van jou pogingen, dus je hebt ook nog de kans geblokkeerd te worden.
In PHP moet je zoiets zelf nog eens schrijven :-P
Probeert u gerust zelf mijn rooster te zien op http://walterbosch.cupweb6.nl (zoek op berg) er is ook geen pincode nodig als je alleen het rooster wil zien.
Bovendien is er een redelijk aantal apps doe werken met contacturenplanner (ook gemaakt door scholieren zelf).
Gewijzigd op 14/04/2014 11:59:28 door - Ariën -
De meldingen bedoel je? Geen idee. Ik ken de taal ook niet.
>>> Het is simpelweg een site van mijn school, die gebruik maakt van het programma contacturenplanner.
>>> Bovendien is er een redelijk aantal apps doe werken met contacturenplanner (ook gemaakt door scholieren zelf).
Dat zegt natuurlijk niet dat het is toegestaan.
>>> Of zoek of ze een API aanbieden
Als je op cupweb6.nl kijkt lijkt t op een script uit de vorige eeuw (met een update in 2007). Lijkt me dat er geen API voor is.
Gewijzigd op 14/04/2014 12:18:04 door Michael -
Ik denk dat de value van die option steeds gelijk is voor jou?
Dan kun je de eerste stap dus al overslaan.
Quote:
@Ivo P
<option value="Berg van den Nick (3H1)[***]">Berg van den Nick (3H1)[***]</option>
Ik denk dat de value van die option steeds gelijk is voor jou?
Dan kun je de eerste stap dus al overslaan.
<option value="Berg van den Nick (3H1)[***]">Berg van den Nick (3H1)[***]</option>
Ik denk dat de value van die option steeds gelijk is voor jou?
Dan kun je de eerste stap dus al overslaan.
Hoe bedoel je precies? Om op de tweede pagina te komen zal je eerste door de eerste stap moeten lopen (session id).
Gewijzigd op 14/04/2014 14:13:29 door Nick van Berg
Ja en nee. Je zou de pagina inderdaad eerst moet ophalen om te weten te komen wat de viewstate en evenvalidation zijn. En de session opslaan in een cookie.
Cookie ziet eruit als
Quote:
Cookie:ASP.NET_SessionId=0q5uabvzdlqow5ptqeaznhkv; __utma=158629288.685805783.1397470187.1397470187.1397470187.1; __utmc=158629288; __utmz=158629288.1397470187.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); walterbosch=14C277B7F1CA44138298BBCB4D09181B4C50E7ED4FEFECA3484AC058FCDF838142717E3E74CD28920E6AFA9F8A534D9CE99B2DCDDEBA5FA00E4692F6336F54CD1F5F4A5B1234AAB1BEDD9004CFE0019BC549DA0D598B2FDFA001CF3305F35471B9CD8E1A757FDC8E80AC37381EB754697C70FA78CDFD87E58390E083F16A29B7
En soort gelijke gegevens als de volgende moet je dan posten naar http://walterbosch.cupweb6.nl/LogInWebForm.aspx
Quote:
__EVENTTARGET:
__EVENTARGUMENT:
__VIEWSTATE:/wEPDwUJNDAxOTQ1MjQyZGQ=
__EVENTVALIDATION:/wEWEQLc4selBALV+7CaCAK61MapDwL19/+CDQKiyObxCQLI98qEDwKtvJL3BQLDmv/6CAL99sv/AgLCyenSDwK/6piPCwK86JPdCwLBkL6FCAKD/a/UCQKV0fvMDwK+j6zRAwKA1s+bCA==
_nameDropDownList:Berg van den Nick (3H1)[150033]
_pincodeTextBox:
_roosterbutton:Rooster
__EVENTARGUMENT:
__VIEWSTATE:/wEPDwUJNDAxOTQ1MjQyZGQ=
__EVENTVALIDATION:/wEWEQLc4selBALV+7CaCAK61MapDwL19/+CDQKiyObxCQLI98qEDwKtvJL3BQLDmv/6CAL99sv/AgLCyenSDwK/6piPCwK86JPdCwLBkL6FCAKD/a/UCQKV0fvMDwK+j6zRAwKA1s+bCA==
_nameDropDownList:Berg van den Nick (3H1)[150033]
_pincodeTextBox:
_roosterbutton:Rooster
Dan hoef je dus niet eerst je naam op te halen, want die weet je al.
Toevoeging op 14/04/2014 14:31:42:
Ik kwam dit nog hier tegen.
Misschien heb je er wat aan.
Alle ** even aanpassingen naar je eigen.
Code (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
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
<?php
include "snoopy.class.php";
$snoopy = new Snoopy;
$submit_url = "http://**.cupweb6.nl/";
$submit_vars["_nameTextBox"] = "jac";
$submit_vars["_zoekButton"] = "Zoek";
$submit_vars["numberOfLettersField"] = "3";
$submit_vars["__VIEWSTATE"] = "dDwtOTM4MzIzMjk0Ozs+";
$snoopy->submit($submit_url,$submit_vars);
while(list($key,$val) = each($snoopy->headers)){
if(stripos($val, "SessionId")!==false)
{
$v = explode("ASP.NET_SessionId=",$val);
$w = explode(";",$v[1]);
$sessionId = $w[0];
}
}
$url = "http://**.cupweb6.nl/LogInWebForm.aspx";
$x = explode("__VIEWSTATE\" value=\"", $snoopy->results);
$y = explode("\"", $x[1]);
$viewstate = $y[0];
$name = "**";
$vars["__VIEWSTATE"] = $viewstate;
$vars["_nameDropDownList"] =$name;
$vars["_pincodeTextBox"] = "0000";
$vars["_roosterbutton"] = "Rooster";
$snoopy->cookies["ASP.NET_SessionId"] = $sessionId;
$snoopy->submit($url,$vars);
print $snoopy->results;
?>
include "snoopy.class.php";
$snoopy = new Snoopy;
$submit_url = "http://**.cupweb6.nl/";
$submit_vars["_nameTextBox"] = "jac";
$submit_vars["_zoekButton"] = "Zoek";
$submit_vars["numberOfLettersField"] = "3";
$submit_vars["__VIEWSTATE"] = "dDwtOTM4MzIzMjk0Ozs+";
$snoopy->submit($submit_url,$submit_vars);
while(list($key,$val) = each($snoopy->headers)){
if(stripos($val, "SessionId")!==false)
{
$v = explode("ASP.NET_SessionId=",$val);
$w = explode(";",$v[1]);
$sessionId = $w[0];
}
}
$url = "http://**.cupweb6.nl/LogInWebForm.aspx";
$x = explode("__VIEWSTATE\" value=\"", $snoopy->results);
$y = explode("\"", $x[1]);
$viewstate = $y[0];
$name = "**";
$vars["__VIEWSTATE"] = $viewstate;
$vars["_nameDropDownList"] =$name;
$vars["_pincodeTextBox"] = "0000";
$vars["_roosterbutton"] = "Rooster";
$snoopy->cookies["ASP.NET_SessionId"] = $sessionId;
$snoopy->submit($url,$vars);
print $snoopy->results;
?>
Gewijzigd op 14/04/2014 14:33:35 door Michael -
Naar aanleiding van jouw code had ik nog even dit gemaakt:
Quote:
Code (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
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
<?php
function post_to_url($url, $data) {
$fields = '';
foreach($data as $key => $value) {
$fields .= $key . '=' . $value . '&';
}
rtrim($fields, '&');
$post = curl_init();
curl_setopt($post, CURLOPT_URL, $url);
curl_setopt($post, CURLOPT_POST, count($data));
curl_setopt($post, CURLOPT_POSTFIELDS, $fields);
curl_setopt($post, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($post);
echo 'result:';
echo $result;
curl_close($post);
}
$data = array(
"__EVENTTARGET" => "",
"__EVENTARGUMENT" => "",
"__VIEWSTATE " => "/wEPDwUJNDAxOTQ1MjQyZGQ=",
"__EVENTVALIDATION " => "/wEWEQLc4selBALV+7CaCAK61MapDwL19/+CDQKiyObxCQLI98qEDwKtvJL3BQLDmv/6CAL99sv/AgLCyenSDwK/6piPCwK86JPdCwLBkL6FCAKD/a/UCQKV0fvMDwK+j6zRAwKA1s+bCA==",
"_nameDropDownList" => "Berg van den Nick (3H1)[150033]",
"_pincodeTextBox" => "",
"_roosterbutton" => "Rooster"
);
post_to_url("http://walterbosch.cupweb6.nl/LogInWebForm.aspx", $data);
?>
function post_to_url($url, $data) {
$fields = '';
foreach($data as $key => $value) {
$fields .= $key . '=' . $value . '&';
}
rtrim($fields, '&');
$post = curl_init();
curl_setopt($post, CURLOPT_URL, $url);
curl_setopt($post, CURLOPT_POST, count($data));
curl_setopt($post, CURLOPT_POSTFIELDS, $fields);
curl_setopt($post, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($post);
echo 'result:';
echo $result;
curl_close($post);
}
$data = array(
"__EVENTTARGET" => "",
"__EVENTARGUMENT" => "",
"__VIEWSTATE " => "/wEPDwUJNDAxOTQ1MjQyZGQ=",
"__EVENTVALIDATION " => "/wEWEQLc4selBALV+7CaCAK61MapDwL19/+CDQKiyObxCQLI98qEDwKtvJL3BQLDmv/6CAL99sv/AgLCyenSDwK/6piPCwK86JPdCwLBkL6FCAKD/a/UCQKV0fvMDwK+j6zRAwKA1s+bCA==",
"_nameDropDownList" => "Berg van den Nick (3H1)[150033]",
"_pincodeTextBox" => "",
"_roosterbutton" => "Rooster"
);
post_to_url("http://walterbosch.cupweb6.nl/LogInWebForm.aspx", $data);
?>
Maar die levert weer dezelfde print op:
Quote:
Invalid postback or callback argument. Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.
Gewijzigd op 14/04/2014 14:59:02 door Nick van Berg
Zal denk ik lastig worden om het werkend te krijgen.
Vraag ze eens of die beveiliging uit kan worden gezet?
Anders moet ik misschien op zoek gaan naar een andere aanpak, zoals deze website bijvoorbeeld doet. http://cup.kevinalberts.nl/rooster.php?s=1 die communiceert met een Iframe.
https://github.com/MegaCookie/CUP-PHP
Hoef je niet te gebruiken maar kan als voorbeeld dienen om via CURL het rooster op te halen.
Ik weet dat dit misschien een beetje oud is maar ik heb een eigen CUPWEB-API gemaakt voor PHP: Hoef je niet te gebruiken maar kan als voorbeeld dienen om via CURL het rooster op te halen.
Mega Cookie op 16/05/2014 11:55:11:
Ik weet dat dit misschien een beetje oud is maar ik heb een eigen CUPWEB-API gemaakt voor PHP: https://github.com/MegaCookie/CUP-PHP
Hoef je niet te gebruiken maar kan als voorbeeld dienen om via CURL het rooster op te halen.
Hoef je niet te gebruiken maar kan als voorbeeld dienen om via CURL het rooster op te halen.
Geweldig! Bedankt voor je reactie! Ik had al even snel naar open source projecten gekeken (maar cup is helaas een algemene uitdrukking). Ik zal er meteen naar kijken.
EDIT: Het werkt, ik hoefde alleen nog de _VIEWSTATE in getTimeTable aan te passen, nogmaals bedankt!
Gewijzigd op 16/05/2014 17:14:58 door Nick van Berg
Toch vrees ik dat het niet echt zal werken, gezien de ASPX-pagina een beveiliging heeft. maar het is het proberen waard. Ben benieuwd naar de bevindingen.
Off-topic: wat ben je van plan te gaan maken? Ik ben wel benieuwd.
@-AAR-: De 'beveiliging' van ASPX is gewoon een fout in de Post-headers hierbij hebben ViewState en EventValidation een grote invloed en moet je goed bestuderen welke andere headers er allemaal worden verzonden (zelfs voor een paar stomme knopjes). Daarnaast zijn ViewState of EventValidation meestal dynamisch, en dus lastig om snel te implenteren via een CURL-request.
Gewijzigd op 17/05/2014 16:43:43 door Mega Cookie
Ik weet nog niet wat ik van plan ben, het was altijd al een opmerkelijke site (het werkte nooit helemaal lekker), toen ben ik eens in de broncode gaan kijken & experimenteren. Mijn uiteindelijke doel is om in 1 klik de lessen te bekijken (dus niet meer doorklikken & wachten) en daar ben ik nu aan toegekomen (ik parseer de broncode verder niet, ik laat hem gewoon direct zien).