我在两台主机上部署了相同的(Django)网站;一个使用SSL和一个snakeoil证书,另一个只是HTTP。我尝试使用wget
编写脚本登录脚本。以下脚本适用于HTTP站点,但不适用于HTTPS。
注意它是一个Django网站。登录需要2个请求。第一个请求在登录表单中获取CSRF令牌,第二个请求返回登录信息 - 以及CSRF令牌:
rm ${COOKIE_FILE}
TOKEN=`wget ${LOGIN_URL} -O- --save-cookies ${COOKIE_FILE} --keep-session-cookies \
--server-response --no-check-certificate \
| grep csrfmiddlewaretoken | sed -r 's/.*value="(.*)".*/\1/'`
POST="csrfmiddlewaretoken=${TOKEN}&username=${USERNAME}&password=${PASSWORD}"
wget ${LOGIN_URL} -O- --load-cookies ${COOKIE_FILE} --save-cookies ${COOKIE_FILE} \
--keep-session-cookies --no-check-certificate --server-response \
--post-data "$POST" >/dev/null
在SSL网站上,我得到了这个输出:
--2016-09-13 01:20:38-- https://nowhere.com/accounts/login/
Resolving nowhere.com (nowhere.com)... 10.1.1.123
Connecting to nowhere.com (nowhere.com)|10.1.1.123|:443... connected.
WARNING: The certificate of ‘nowhere.com’ is not trusted.
WARNING: The certificate of ‘nowhere.com’ hasn't got a known issuer.
The certificate's owner does not match hostname ‘nowhere.com’
HTTP request sent, awaiting response...
HTTP/1.1 403 FORBIDDEN
Date: Mon, 12 Sep 2016 15:20:58 GMT
X-Frame-Options: SAMEORIGIN
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html
2016-09-13 01:20:41 ERROR 403: FORBIDDEN.
我已经确认我可以通过浏览器使用相同的凭据登录HTTPS站点。我怀疑它与SSL有关?有什么想法吗?
答案 0 :(得分:1)
我查看了我的浏览器所做的不同,然后将--header="Referer: ${LOGIN_URL}"
添加到第二个wget
来电并且它有效。
不完全确定1.为什么Django会拒绝没有Referer的东西。我想它有意义(?)2。为什么它只在HTTP站点上工作。但是......继续前进。