Diskuze: Cross-Origin Request Blocked error
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 11 zpráv z 11.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Nemůžeš s tím udělat nic. Je to ochrana proti CSRF útoku. Oni musí povolit CORS na tvoji domenu
Pokud je to request server - server postačí nepridavat hlavičku Origin, pokud ten request jde z prohlížeče, tak neudelas nic
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.
A jak mu toto pomůže když nezná autorizační token kvůli CSRF?
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.
Kdyby to bylo to co píšes, error je jiný.. Validation failed, precondition failed, nějaký custom.
Jinak ve formuláři vidím odesílat:
searchHash: fee9db38805bd643525fa5d9d89cf0090597db78
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.
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..
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á:
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.getToken();
var postRequest = createPostRequestWithToken(token);
http.post(postRequest);
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í.
Zobrazeno 11 zpráv z 11.