Как определить, обращается ли сервер / скрипт к своему сайту через cURL/file_get_contents()? (без учета пользовательских агентов и IP-адресов)

Я столкнулся с вопросом, где у пользователя возникают трудности с доступом к изображению через скрипт (используя cURL/file_get_contents()):

Как сохранить изображение из URL с помощью PHP?

Ссылка на изображение, похоже, возвращает ошибку 403 при использовании file_get_contents() просить это. Но в cURL возвращается более подробная ошибка:

Вам было отказано в доступе к системе. Выключите двигатель или Surf Proxy, поддельный IP, если вы действительно хотите получить доступ. Прокси или не принимаются ни от каких веб-инструментов Системы предотвращения вторжений.

Binh Minh Online Data Services @ 2008 - 2012

Я также не смог получить доступ к тому же изображению после того, как сам возился с запросом cURL. Я попытался сменить user-agent на мой точный браузер user-agent, который может успешно получить доступ к изображению. Я также пробовал сценарий на своем личном локальном сервере, который (очевидно) использует тот же IP-адрес, что и мой браузер... Так что, насколько мне известно, пользовательские агенты и IP-адреса находятся вне ситуации.

Как еще кто-то может обнаружить скрипт, выполняющий запрос?

Кстати, это не для чего-то сумасшедшего. Мне просто любопытно xD

1 ответ

Решение

Это действительно cookie, который устанавливается JavaScript, а затем перенаправляет исходное изображение. Проблема в том, что curl /fgc не будет анализировать html и устанавливать cookie как его единственные файлы cookie, установленные сервером, который curl будет хранить в своем файле cookie.

Это код, который вы получаете перед перенаправлением, он создает файл cookie через JavaScript без имени, кроме location.href в качестве значения:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<HEAD>
<TITLE>http://phim.xixam.com/thumb/giotdang.jpeg</TITLE>
<meta http-equiv="Refresh" content="0;url=http://phim.xixam.com/thumb/giotdang.jpeg">
</HEAD>
<script type="text/javascript">
window.onload = function checknow() {
var today = new Date();
var expires = 3600000*1*1;
var expires_date = new Date(today.getTime() + (expires));
var ua = navigator.userAgent.toLowerCase();
if ( ua.indexOf( "safari" ) != -1 ) { document.cookie = "location.href"; } else { document.cookie = "location.href;expires=" + expires_date.toGMTString(); }
}
</script>
<BODY>
</BODY></HTML>

Но еще не все потеряно, потому что, предварительно установив / подделав куки, вы можете обойти эту меру безопасности (причина, по которой использование куки для любого типа безопасности плохо).

cookie.txt

# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.

phim.xixam.com  FALSE   /thumb/ FALSE   1338867990      location.href

Таким образом, готовый скрипт curl будет выглядеть примерно так:

<?php
function curl_get($url){
    $return = '';
    (function_exists('curl_init')) ? '' : die('cURL Must be installed!');

    //Forge the cookie
    $expire = time()+3600000*1*1;
    $cookie =<<<COOKIE
# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.

phim.xixam.com  FALSE   /thumb/ FALSE   $expire     location.href

COOKIE;
    file_put_contents(dirname(__FILE__).'/cookie.txt',$cookie);

    //Browser Masquerade cURL request
    $curl = curl_init();
    $header[0] = "Accept: text/xml,application/xml,application/json,application/xhtml+xml,";
    $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
    $header[] = "Cache-Control: max-age=0";
    $header[] = "Connection: keep-alive";
    $header[] = "Keep-Alive: 300";
    $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
    $header[] = "Accept-Language: en-us,en;q=0.5";
    $header[] = "Pragma: ";

    curl_setopt($curl, CURLOPT_COOKIEJAR, dirname(__FILE__).'/cookie.txt');
    curl_setopt($curl, CURLOPT_COOKIEFILE, dirname(__FILE__).'/cookie.txt');
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0 Firefox/5.0');
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    curl_setopt($curl, CURLOPT_HEADER, 0);
    //Pass the referer check
    curl_setopt($curl, CURLOPT_REFERER, 'http://xixam.com/forum.php');
    curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
    curl_setopt($curl, CURLOPT_AUTOREFERER, true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($curl, CURLOPT_TIMEOUT, 30);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

    $html = curl_exec($curl);
    curl_close($curl);
    return $html;
}

$image = curl_get('http://phim.xixam.com/thumb/giotdang.jpeg');

file_put_contents('test.jpg',$image);
?>

Единственный способ остановить сканер состоит в том, чтобы зарегистрировать все ваши ips посетителей в вашей базе данных и увеличить значение на основе количества посещений на ip, затем раз в неделю или около того просматривать самые популярные хиты по ip, а затем выполнять обратный поиск ip и Посмотрите, заблокирует ли его хостинг-провайдер, если это так, на брандмауэре или в htaccess, иначе вы не сможете реально остановить запрос к ресурсу, если он доступен для всех, поскольку любое препятствие может быть преодолено.

Надеюсь, поможет.

Другие вопросы по тегам