인프런 커뮤니티 질문&답변

akffkqlxmfehfkwl님의 프로필 이미지
akffkqlxmfehfkwl

작성한 질문수

PHP 7+ 프로그래밍: 객체지향

39 - 게시글 (Post)

csrfmiddelware 에러 질문입니다

해결된 질문

작성

·

259

0

Undefined property: stdClass::$csrfToken in /Users/ywkim/StudyPHP/php_blog/app/Middlewares/CsrfTokenMiddleware.php:12
Stack trace:
#0 /Users/ywkim/StudyPHP/php_blog/app/Middlewares/CsrfTokenMiddleware.php(12): App\Providers\ErrorServiceProvider::App\Providers\{closure}(8, 'Undefined prope...', '/Users/ywkim/St...', 12, Array)
#1 /Users/ywkim/StudyPHP/php_blog/vendor/heracles8562/eclair/src/Routing/RequestContext.php(82): App\Middlewares\CsrfTokenMiddleware::process()
#2 /Users/ywkim/StudyPHP/php_blog/vendor/heracles8562/eclair/src/Routing/Route.php(36): Eclair\Routing\RequestContext->runMiddlewares()
#3 /Users/ywkim/StudyPHP/php_blog/app/Providers/RouteServiceProvider.php(17): Eclair\Routing\Route::run()
#4 /Users/ywkim/StudyPHP/php_blog/vendor/heracles8562/eclair/src/Application.php(32): App\Providers\RouteServiceProvider::boot()
#5 [internal function]: Eclair\Application->Eclair\{closure}('App\\Providers\\R...', 4)
#6 /Users/ywkim/StudyPHP/php_blog/vendor/heracles8562/eclair/src/Application.php(32): array_walk(Array, Object(Closure))
#7 /Users/ywkim/StudyPHP/php_blog/public/index.php(7): Eclair\Application->boot()
#8 {main}
<script>
    const $delete = document.getElementById('delete')
    $delete.addEventListener('click', () => {
    alert('/posts/' + '<?=$post->id?>');
        fetch('/posts/' + '<?=$post->id?>', {
            method: 'delete',
            body: JSON.stringify({ _csrfToken: '<?=$_SESSION['CSRF_TOKEN']?>' })
        }).then(() => {
            window.location = '/'
        })
    })
</script>
//delete post
Route::add('delete', '/posts/{id}', '\App\Controllers\PostController::destroy', [
   AuthMiddleware::class,
   RequireMiddleware::class,
   CsrfTokenMiddleware::class
]);

 

script부분도 강사님꺼 복붙해서 똑같은데 라우터에CsrftokenMiddleware::class 만 추가하면 에러가 납니다.

csrf 미들웨어 들어가있는 다른 라우터는 문제가 안되는데 delete할 때만 저렇게 에러가 나고 삭제처리가 안되네요..

왜그런지 알 수 있을까요

답변 2

1

정상우님의 프로필 이미지
정상우
지식공유자

안녕하세요. 정상우입니다 :)

일단, 이 문제에 대한 원인이 그래서 뭐냐? 에 대한 해답을 명쾌하게 드리지 못합니다. 경우의 수가 많기 때문입니다. 따라서 여기서는 가장 가능성이 높을 수 있는 문제에 대해 얘기해드리겠습니다. delete 의 경우에는 json 으로 ajax 요청을 보내고 있는데, body 에 있는 Csrf Token 을 CsrfTokenMiddleware 에서 해석하지 못했다면 $csrfToken 변수를 얻어오지 못합니다.

예제코드: https://github.com/php-courses-inflearn/php7-oop/blob/main/ch6/app/Middlewares/CsrfTokenMiddleware.php#L12

$csrfToken = filter_input(INPUT_POST, '_csrfToken', FILTER_SANITIZE_STRING) ?: json_decode(file_get_contents('php://input'))->_csrfToken;

이 코드에서 ajax 요청에 담긴 body 를 파싱하여 Csrf Token 을 얻어오는 부분은 다음과 같습니다. 이 부분에서 토큰을 얻어오지 못하면 에러가 발생합니다.

json_decode(file_get_contents('php://input'))->_csrfToken;


프론트엔드에서 delete 요청을 보냈을 때 CsrfTokenMiddleware 에서 $csrfToken 에 값이 제대로 할당이 되고, body 를 파싱하는지 검토해보시기 바랍니다. ajax 요청에 담긴 body 값은 php://input 스트림으로 서버에 전달됩니다. :)

0

스크린샷 2022-11-18 오전 9.02.58.png해결했습니다 감사합니다..
값 전부 찍어보니 _csrfToken 이 아니라 csrfToken으로 입력했었네요

akffkqlxmfehfkwl님의 프로필 이미지
akffkqlxmfehfkwl

작성한 질문수

질문하기