PHP Curl网站正在响应未启用的JavaScript。它是如何知道的?

时间:2016-09-13 02:42:26

标签: php curl

$curl = curl_init("http://example.com/");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Host: example.com",
                                                "Connection: keep-alive",
                                                "Upgrade-Insecure-Requests: 1",
                                                "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",
                                                "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
                                                "Accept-Language: en-US,en;q=0.8"));
curl_setopt($curl, CURLOPT_VERBOSE, TRUE);
$result = curl_exec ($curl); 
echo $result;

回复是

<html><title>You are being redirected...</title>
<noscript>Javascript is required. Please enable javascript before you are allowed to see this page.</noscript>

我正在重复使用标题,就像浏览器发送到网站一样。

网站如何知道这不是真正的浏览器?加载主页时发生错误,因此不会发生任何身份验证。

事实上,页面的大部分内容甚至都不需要Javascript。我可以将它作为标准html加载,但出于某种原因,如果没有启用,整个页面都不会加载。

有什么想法吗? (对不起,不能分享真实的网站名称)。

2 个答案:

答案 0 :(得分:1)

据我所知,需要2个请求的最小值才能知道客户端是否启用了JavaScript。 由于这是CURL,并且可以设置为“原始”请求,因此响应没有任何意义,除非该网站检查请求标头,如猎犬

正如@zerkms所提到的,chrome确实会向你的CURL请求发送更多标题:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,nl;q=0.6
Cache-Control:max-age=0
Connection:keep-alive
Cookie:cookiedata
DNT:1
Host:example.com
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36

有几个不匹配,Host:example.com没有空格。其次,curl将使用curl_init()函数来处理这个问题。我也缺少DNT,缓存控制,接受编码/语言。

理论上,服务器无法检测客户端设置,但它可以很好地检测每个标头。

例如,如果我要构建这个软件,我会积累足够的数据来检测正常的浏览器标题。如果数据丢失,我可以检测到它是否是真正的用户请求。

答案 1 :(得分:0)

该网站可能无法告知该网站不是发出请求的浏览器。 HTML <noscript>标记标记了当且仅当启用了JavaScript时才应显示的内容。它似乎没有加载的原因是因为远程服务器似乎已经向您发送了元刷新/重定向页面;我可以看到的解决方案是在您重定向到的任何地方发送相同的请求。

然而,除此之外,服务器实际上还有一种方法可以告诉发送请求的是什么:User-Agent标题。此标题通常在大多数浏览器上进行硬编码,并随每个请求一起发送;它包含有关客户端的信息。不完全可靠(可能是欺骗,这是你正在做的事情),但至少它是什么。