我正在开发一个新项目,我想实现一个“等到网站打开”功能,如果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。
有没有什么办法解决这一问题?还是要以不同的方式获得相同的结果?>
谢谢:)
答案 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,否则您不会被拒绝吗?这与您通常想要的逻辑相反。
您可以编写一些urllib
或requests
代码来配合浏览器的方式-运行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问题,还是其他问题。但这是您需要修复的方面。