yii2에서는 테스트 도구 POSTMAN을 사용하든, 명령줄 CURL 요청을 사용하든, ajax 요청을 사용하든 항상 http400: Bad Request 오류가 발생하며 웹 페이지를 사용하여 GET에 액세스하면(POST 제거) verbFilter 제한), 이는 정상입니다.
정보를 참조한 결과 이것이 CRSF 검증의 이유임을 알았습니다
원리:
쿠키 해싱, 서버 허용. 클라이언트에 전송된 모든 양식에 임의의 값_csrf를 표시하고 동시에 클라이언트의 COOKIE에 관련 토큰을 저장합니다.
확인 중에 서버는 수신할 때마다 숨겨진 _csrf 입력을 _POST()합니다. 요청과 클라이언트의 COOKIE를 비교하여 검증합니다.
공격자의 공격 원리는 클라이언트의 COOKIE를 사용하는 것이지만 공격자는 단지 사용하는 COOKIE의 특정 내용을 얻을 수 없습니다. 여기서 XSS 공격의 가능성은 웹사이트의 XSS 취약점으로 인해 쉽게 도난당할 수 있기 때문입니다. 일반적으로 공격자는 해시 값을 계산해야 한다고 판단하면 포기할 것입니다. 공격 URL에 토큰을 추가하면 확인이 실패합니다.
공격자가 (이론적으로) 제3자 쿠키를 얻을 수 없어 양식의 데이터가 구성되지 않기 때문에 이것이 가장 간단한 해결책일 수 있습니다.
해결책:
1.禁用CRSF验证(不推荐):'enableCsrfValidation' => false, 'components' => [ 'request' => [ 'cookieValidationKey' => '83r5HbITBiMfmiYPOZFdL-raVp4O1VV4', 'enableCookieValidation' => false, 'enableCsrfValidation' => false, ]
2. 데이터 제출 시 csrf 정보를 전달합니다
a. ActiveForm 컴포넌트 호출 시 제출된 데이터는 자동으로 _csrf를 가져옵니다
b. Ajax 제출은 OK입니다. 헤더(아래 참조)를 추가하여 제출할 데이터와 함께 제출하세요
c. php를 통해서도 csrf 정보를 얻을 수 있습니다
Yii::$app->request->csrfParam;(获取csrf-param) Yii::$app->request->csrfToken;(获取csrf-token)
위는 CSRF 공격에 대한 Yii2.0 방어 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!