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 및 쿠키 저장
- grep index.html은 csrf 코드를 얻습니다.
- wget index.html 쿠키, csrf 코드 및 비밀번호를 사용하여 로그인
그러나 내 wget은 올바르게 인증하지 않은 것처럼 로그인 페이지를 반환하므로 쿠키인지 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과 같은 다른 언어를 사용해야 합니다.아름다운 수프. 이것을 사용하면 원래 원했던 것을 얻을 수 있습니다