urllib和请求始终返回状态码200

时间:2018-07-18 17:29:59

标签: python python-3.x apache http python-requests

我正在开发一个新项目,我想实现一个“等到网站打开”功能,如果http://switch-check.cf/index.php打开,它将在其中查找,然后继续。

目前,在.htaccess和php的帮助下,我竭尽全力禁止所有.php文件的访问。 因此,如果您尝试访问我提到的网页,则应该获得

  

403访问被拒绝

因此,我正在使用urllib(也尝试了请求)来查看网站是否处于打开状态或仍处于禁止访问状态 print(urllib.request.urlopen("http://switch-check.cf/index.php").getcode()) 但是,无论我尝试什么,我总是得到200 HTTP状态代码,而不是403。即使我尝试不存在的子域和文件,状态代码也始终为200。 有没有什么办法解决这一问题?还是要以不同的方式获得相同的结果?>

谢谢:)

1 个答案:

答案 0 :(得分:2)

调试此方法的方法是在浏览器(获得403)和代码(获得200)中进行尝试,比较请求标头,然后将差异二等分。

-

我是使用Chrome开发者工具中的“网络”面板并使用requests来完成此操作的,因此我只能print(page.request.headers)

在Chrome中:

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
Cookie: __test=9eea7a0d55374cb5b0673e2058581017
Host: switch-check.cf
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36

来自请求:

User-Agent python-requests/2.18.4
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive

在获得这些标题之前:Chrome请求了index.php?i=1而不是index.php。因此很明显,在我不注意的情况下进行了重定向。而且该重定向未在requests中发生,这表明它可能已编写脚本。

同时,我知道我说过一分为二,但是那里有一个饼干这一事实立即引起了怀疑。


因此,让我们看一下通过漂亮打印机运行的实际200响应:

<html>

<body>
    <script type="text/javascript" src="/aes.js"></script>
    <script>
        function toNumbers(d) {
            var e = [];
            d.replace(/(..)/g, function(d) {
                e.push(parseInt(d, 16))
            });
            return e
        }

        function toHex() {
            for (var d = [], d = 1 == arguments.length && arguments[0].constructor == Array ? arguments[0] : arguments, e = "", f = 0; f < d.length; f++) e += (16 > d[f] ? "0" : "") + d[f].toString(16);
            return e.toLowerCase()
        }
        var a = toNumbers("f655ba9d09a112d4968c63579db590b4"),
            b = toNumbers("98344c2eee86c3994890592585b49f80"),
            c = toNumbers("c4ba932dbf1d8d33ca88410be4f79eb0");
        document.cookie = "__test=" + toHex(slowAES.decrypt(c, 2, a, b)) + "; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/";
        location.href = "http://switch-check.cf/index.php?i=1";
    </script>
    <noscript>This site requires Javascript to work, please enable Javascript in your browser or use a browser with Javascript support</noscript>
</body>

</html>

好吧,这是您的问题。您实际上并没有完全拒绝访问index.php;您将返回200,其中包含一些JavaScript,该JavaScript添加了随机Cookie,然后重定向到index.php?i=1。而那是您拒绝它们的地方。

触发403的是cookie还是重定向?让我们同时尝试两种请求:

>>> r = requests.get('http://switch-check.cf/index.php', headers={'Cookie': '__test=9eea7a0d55374cb5b0673e2058581017'})
>>> r.status_code
403

>>> r = requests.get('http://switch-check.cf/index.php?i=1')
>>> r.status_code
200

因此,您仅禁止基于JavaScript生成的Cookie进行访问。

如果我们只是发送废话cookie该怎么办?

>>> r = requests.get('http://switch-check.cf/index.php', headers={'Cookie': '__test=' + '0'*32})
>>> r.status_code
403
>>> r = requests.get('http://switch-check.cf/index.php', headers={'Cookie': '__test=' + str(uuid.uuid4().hex})
>>> r.status_code
403

哇。它实际上必须是 right cookie,即服务器所期望的cookie,否则您不会被拒绝吗?这与您通常想要的逻辑相反。


可以编写一些urllibrequests代码来配合浏览器的方式-运行JS解释器,或解析三个数字并对其进行AES加密,自己建立一个cookie。但这似乎很愚蠢。

正确的做法是将服务器更改为实际上禁止访问index.php,而不是返回生成特殊cookie的JS代码,如果需要的话,该cookie将使您被禁止访问。


你怎么做到的?

好吧,你说:

  

在.htaccess和php的帮助下,我尽力防止所有.php文件被禁止访问

首先,据我所知,您认为您正在使用Apache,并且正在遵循某些指南来禁止在Apache中进行访问,但是实际上您是在使用nginx。 (请查看响应中的Server标头。)

同时,我不知道您在PHP中正在做什么,但是您可能会得到一些旨在从有效的JS运行的浏览器中获取有效cookie的代码,这是(a)错误并将其退回, b)过于复杂,并且(c)首先不是您想要的。

我不知道您在这里是否有PHP问题,还是有关Server Fault的Nginx问题,还是其他问题。但这是您需要修复的方面。

相关问题