[英]Django Tastypie 0.9.13-beta: resource always return status_code 200
[英]Urllib and requests always return status code of 200
我正在研究一个新项目,我想实现“等到网站打开”功能,如果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。总有办法解决吗? 还是要以不同的方式获得相同的结果?>
谢谢 :)
调试此方法的方法是在浏览器(获得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
发生,这意味着它可能已编写脚本。
同时,我知道我说过一分为二,但是有一个cookie的事实立即引起了怀疑。
因此,让我们看一下通过漂亮打印机运行的实际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,其中包含一些添加了随机Cookie的JavaScript,然后将其重定向到index.php?i=1
。 那就是您拒绝他们的地方。
是cookie还是重定向触发了403? 让我们尝试两种请求:
>>> 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
哇。 它实际上必须是正确的 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问题,还是其他问题。 但这就是您需要修复的方面。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.