当前位置: 首页 > 知识库问答 >
问题:

Urllib和请求始终返回状态代码200

澹台星光
2023-03-14

我正在做一个新项目,我想实现一个“等到网站打开”功能,如果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个答案

岳涵煦
2023-03-14

调试方法是在浏览器(403)和代码(200)中尝试,比较请求头,并对差异进行二分法。

--

我使用Chrome的devtools中的“网络”面板,并使用请求,这样我就可以打印(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。所以很明显,当我不注意的时候,有一个重定向。重定向不会发生在请求中,这意味着它可能是脚本化的。

同时,我知道我说过要一分为二,但那里有一块饼干的事实立即令人怀疑。

所以,让我们看看实际的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>

这是你的问题。实际上,您并没有拒绝访问索引。php;您将返回一个200,其中包含一些添加随机cookie的JavaScript,然后重定向到索引。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的访问。

如果我们只是送一个废话饼干呢?

>>> 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

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

您可以编写一些urllib请求代码来像浏览器那样进行合作——要么运行JS解释器,要么解析三个数字并AES它们,然后自己构建一个cookie。但这似乎是一件愚蠢的事情。

正确的做法是将服务器更改为实际禁止访问索引。php,而不是返回JS代码,该代码生成一个特殊的cookie,允许您在需要时被禁止。

你是怎么做到的?

那么你说,

在. htaccess和php的帮助下,我尽了最大努力,所有. php文件都是禁止访问的

首先,据我所知,您认为您正在使用Apache,并且正在遵循一些指南来禁止Apache中的访问,但实际上您正在使用nginx。(查看响应中的服务器标题。)

同时,我不知道你在PHP中做什么,但是你可能得到了一些代码,这些代码要求运行有效JS的浏览器提供一个有效的cookie,这(a)是错误的,并且是反向的,(b)过于复杂,(c)不是你一开始想要的。

我不知道这里是否有PHP问题,或者关于服务器故障的nginx问题,或者其他问题。但这是你需要修复的一面。

 类似资料:
  • 我有一个springboot/openapi应用程序。不依赖Spring Security性。通过swagger启动POST请求时,返回的状态为403。请求未到达控制器类。然而,Get请求确实有效,并返回状态200。 配置如下 application.yaml 403状态的原因可能是什么? 控制器

  • 嗨,我是Laravel的新手,我正在尝试用ajax表单提交构建一个登录表单。 我抄了 如果我从VerifyCsrfToken检查中排除它,我的代码工作完全正常。但是我确实希望令牌验证有效。 我读过多篇关于csrf令牌的帖子,尝试过,但仍然返回状态码419。 抱歉下面的长代码,但他们在这里(我知道我没有做任何关于设置会话和东西,请忽略现在因为代码返回419状态) 路线/web.php login.j

  • 调用此获取操作时: 会引发一个异常...我的全局exc处理程序被触发。 当我的自定义响应返回给客户端时,我的小提琴手总是说: 结果:200 我还可以更改<code>返回Ok(数据)to

  • 我希望根据响应对象错误动态返回HTTPStatus代码,如400、400、404等。我被提到这个问题--使用Spring3RESTful以编程方式更改http响应状态,但没有帮助。 我有一个带有方法的控制器类 是一个类,其中有上面使用的两个方法(和)。 我不想签入if条件并相应地返回响应代码,有没有其他更好的方法来做到这一点?

  • 我正在尝试使用BitBucket GIT存储库设置Jenkins,但Jenkins控制台总是给我以下错误代码: 我尝试过很多不同的方法,但总是失败。我的服务器上允许9418端口上的通信量。服务器处于1 Gbps连接上。

  • 问题内容: 好的,我已经到处寻找了。基本上,我们使用的是跨域请求的$ http请求。我们的服务器允许该域,当请求返回200时,一切正常。但是,无论何时我们的服务器返回错误500、401,无论如何,Angular都认为这是CORS问题。 我用Fiddler调试了响应,以验证服务器是否返回了500,但Angular阻塞了。 这是请求: 然后在控制台中,我将看到: XMLHttpRequest无法加载f