NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Michal Dvořáček:1.4.2018 15:47

Ahoj,
mám takový problém, který se netýká přímo PHP, ale v mém případě to s tím tak nějak souvisí.
Snažím se posílat request na tuto stránku pomocí toho kódu "

$query = http_build_query($data);
$request = [
        'http' => [
                'method' => "POST",
                'header' =>
                        "Accept-language: en-US,en;q=0.5\r\n" .
                        "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n".
                        "Connection: keep-alive\r\n".
                        "Host: www.rvvi.cz\r\n".
                        "Referer: https://www.rvvi.cz/riv?s=rozsirene-vyhledavani\r\n".
                        "Upgrade-Insecure_Requests:1\r\n".
                        "User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:59.0) Gecko/2010\r\n".
                        "Cookie: foo=bar\r\n".
                        "Content-type: application/x-www-form-urlencoded\r\n",
                "Content-Length: ".strlen($query)."\r\n",
                'content' => $query],
];
$context=stream_context_create($request);
$page = file_get_html("https://www.rvvi.cz/riv",false,$context);

ale dostávám tento error.

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://www.rvvi.cz/…yGothics.ttf. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

Hledal jsem co to znamená a podle informací na developer.moz­zila.org jsem tak nějak pochopil, že k tomu aby můj request prošel by museli mít na straně serveru ke kterému tento požadavek posílám nastaveno něco ve smyslu

"Access-Control-Allow-Origin: *" .

Takže s tím nic neudělám, pokud to nemají povolené.
Nevím ale, jeslti jsem to pochopil správně, protože jsem našel spoustu lidí, co řeší stejný problém a povedlo se jim ho vyřešit. Nicméně řešení, které jsem od nich našel na to mé nefunguje.

Proto jsem z toho celkem zmatený a nevím, jeslti s tím opravdu něco mohu udělat nebo ne.

Setkal se už někdo s tímto problémem, případně neví prosím někdo jak ho vyřešit?
Budu vděčný za jakoukoliv radu!

 
Odpovědět
1.4.2018 15:47
Avatar
Odpovídá na Michal Dvořáček
Marian Benčat:1.4.2018 19:29

Nemůžeš s tím udělat nic. Je to ochrana proti CSRF útoku. Oni musí povolit CORS na tvoji domenu

Nahoru Odpovědět
1.4.2018 19:29
Totalitní admini..
Avatar
Marian Benčat:1.4.2018 19:30

Pokud je to request server - server postačí nepridavat hlavičku Origin, pokud ten request jde z prohlížeče, tak neudelas nic

Nahoru Odpovědět
1.4.2018 19:30
Totalitní admini..
Avatar
Šimon Rataj
Člen
Avatar
Šimon Rataj:8.4.2018 16:40

Zkus curl.
Já používám tuto funkci:

function get_remote_data($url, $post_paramtrs = false) {
    if(is_array($post_paramtrs) || is_object($post_paramtrs)) {
      $arr = (array) $post_paramtrs;
      $arr2 = [];
      foreach($arr as $k => $v) {
        $arr2[] = $k . "=" . urlencode($v);
      };
      $post_paramtrs = implode("&", $arr2);
    };
    $c = curl_init();
    curl_setopt($c, CURLOPT_URL, $url);
    curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
    if($post_paramtrs) {
      curl_setopt($c, CURLOPT_POST, true);
      curl_setopt($c, CURLOPT_POSTFIELDS, $post_paramtrs);
    };
    curl_setopt($c, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($c, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36");
    curl_setopt($c, CURLOPT_COOKIE, 'CookieName1=Value;');
    curl_setopt($c, CURLOPT_MAXREDIRS, 10);
    $follow_allowed = !(ini_get('open_basedir') || ini_get('safe_mode'));
    if($follow_allowed)
      curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($c, CURLOPT_CONNECTTIMEOUT, 9);
    curl_setopt($c, CURLOPT_REFERER, $url);
    curl_setopt($c, CURLOPT_TIMEOUT, 60);
    curl_setopt($c, CURLOPT_AUTOREFERER, true);
    curl_setopt($c, CURLOPT_ENCODING, 'gzip,deflate');
    $data = curl_exec($c);
    $status = curl_getinfo($c);
    curl_close($c);
    preg_match('/(http(|s)):\/\/(.*?)\/(.*\/|)/si', $status['url'], $link);
    $data = preg_replace('/(src|href|action)=(\'|\")((?!(http|https|javascript:|\/\/|\/)).*?)(\'|\")/si','$1=$2' . $link[0] . '$3$4$5', $data);
    $data = preg_replace('/(src|href|action)=(\'|\")((?!(http|https|javascript:|\/\/)).*?)(\'|\")/si','$1=$2' . $link[1].'://' . $link[3] . '$3$4$5', $data);
    if($status['http_code']==200)
      return $data;
    elseif($status['http_code']==301 || $status['http_code']==302) {
      if(!$follow_allowed) {
        if(!empty($status['redirect_url']))
          $redirURL = $status['redirect_url'];
        else {
          preg_match('/href\=\"(.*?)\"/si',$data,$m);
          if(!empty($m[1]))
            $redirURL=$m[1];
        };
        if(!empty($redirURL))
          return  call_user_func(__FUNCTION__, $redirURL, $post_paramtrs);
      };
    };
    return "ERRORCODE22 with " . $url . "!!<br/>Last status codes<b/>:" . json_encode($status) . "<br/><br/>Last data got<br/>:" . $data;
  };

Jako první parametr použij URL adresu a jako druhý můžeš použít i $data i $query.

 
Nahoru Odpovědět
8.4.2018 16:40
Avatar
Odpovídá na Šimon Rataj
Uživatel sítě :8.4.2018 18:21

A jak mu toto pomůže když nezná autorizační token kvůli CSRF?

Nahoru Odpovědět
8.4.2018 18:21
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na Uživatel sítě
Marian Benčat:8.4.2018 22:59

OH.. No ten dlouheej php-curl hovno kód jsem nečetl, ale ty pletes dvě věci dohromady..

On ma problém s CORS,..Ty tady mluvis o antiforgery tokenu, který se soupe jako ochrana proti CSRF.

Nahoru Odpovědět
8.4.2018 22:59
Totalitní admini..
Avatar
Odpovídá na Marian Benčat
Uživatel sítě :8.4.2018 23:08

A nemá ji ten formulář snad? :)

Nahoru Odpovědět
8.4.2018 23:08
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na Uživatel sítě
Marian Benčat:9.4.2018 6:28

Kdyby to bylo to co píšes, error je jiný.. Validation failed, precondition failed, nějaký custom.

Nahoru Odpovědět
9.4.2018 6:28
Totalitní admini..
Avatar
Odpovídá na Uživatel sítě
Marian Benčat:9.4.2018 10:19

Jinak ve formuláři vidím odesílat:
searchHash: fee9db38805bd6­43525fa5d9d89cf0090597db­78
searchKey: 244782735

takže možná to anti forgery tokeny jsou,..jemu se to ale tváří, že to nprojde už na options,.. respektive se to tak tváří.. Tak jak tak, za zkoušku určitě stojí zkusit odeslat i tyto hodnoty.

Nahoru Odpovědět
9.4.2018 10:19
Totalitní admini..
Avatar
Odpovídá na Marian Benčat
Uživatel sítě :9.4.2018 14:24

Jasně, já pouze poukazoval na to, že i kdyby vyřešil první problém (Což nechápu, jelikož mě komunikace i metodou POST funguje bez problému s touto stránkou), tak má další překážku, kterou už prostě neobejde..

Editováno 9.4.2018 14:25
Nahoru Odpovědět
9.4.2018 14:24
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na Uživatel sítě
Marian Benčat:9.4.2018 17:12

No .. jasně,.. já taky nechápu jak mu to může vyhodit tudle chybu,.. to by musel posílat i Origin header...

jinak.. tudle další překážku obejde že jo.. On si prostě nejdříve udělá:

GET https://www.rvvi.cz/riv?…

vytahne si tokeny z FORMu a pak je použije v tom POSTu..
anti forgery token brání v útocích přes prohlížeč.

tedy

var getResponse = GET((;
var token = getResponse.get­Token();
var postRequest = createPostRequ­estWithToken(to­ken);
http.post(pos­tRequest);

U prohlížeče (při pokusu o CSRF) ty ten token neziskas, protože nemáš přístup k tomu vygenerovanému formuláři s tokenem, co je vázaný na přihlášení.

Nahoru Odpovědět
9.4.2018 17:12
Totalitní admini..
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.