试图解决我的 bash 每天都会抓取这个网站的问题。它曾经与 wget 一起使用,并且具有以下功能postdata
:pin=87654321&accessCode=1234&Submit=Submit
...工作了几年然后就坏了。我注意到他们在发布数据中添加了一个名为“_csrf”的字段,经过检查,它现在发送postdata
如下:
_csrf=d3063789-88a2-4b50-ad38-5c34663797a0&pin=87654321&accessCode=1234&Submit=Submit
因此,调整后的脚本执行以下操作。
- wget index.html 并保存cookie
- grep index.html 获取 csrf 代码
- wget index.html 使用 cookie 和 csrf 代码以及我的密码登录
但是,我的 wget 只是返回登录页面,就好像我没有正确进行身份验证一样,所以我仍然做错了什么,不确定它是 cookie 还是 csrf。浏览器在登录时会执行哪些操作,而我的脚本却无法执行此操作?
PATH_HERE="testxyz/"
MY_URL="https://csea.ehawaii.gov/iwa/index.html"
wget -q -P "$PATH_HERE" --save-cookies "$PATH_HERE"cookies.txt --keep-session-cookies "$MY_URL"
CSRFCODE=$(grep -o -P '(?<=_csrf\" value=\").*(?=\")' "$PATH_HERE"index.html)
POSTDATA='_csrf='"$CSRFCODE"'&pin=87654321&accessCode=1234&Submit=Submit'
rm "$PATH_HERE"index.html
wget -q -P "$PATH_HERE" --load-cookies "$PATH_HERE"cookies.txt --post-data $POSTDATA "$MY_URL"
答案1
CSRF 令牌很难绕过。拥有它们的目的是防止跨站点请求伪造。
CSRF 令牌是一个唯一的、秘密的、不可预测的值,由服务器端应用程序生成,并以包含在客户端发出的后续 HTTP 请求中的方式传输到客户端。当发出后面的请求时,服务器端应用程序会验证该请求是否包含预期的令牌,如果令牌丢失或无效,则拒绝该请求。
因此使用简单的 wget 来实现这一点是不可能的。您需要依赖使用其他语言(例如 Python)来实现此目的,因为它具有类似的库美丽汤。使用它,您可以实现您最初想要的