CI 묻고 답하기

제목 Ajax 전송 시 csrf 설정 및 internal 500 error 관련 질문드립니다.
카테고리 CI 2, 3
글쓴이 bsc0227 작성시각 2018/03/06 17:26:07
댓글 : 5 추천 : 0 스크랩 : 0 조회수 : 19747   RSS

안녕하세요.

Codeigniter 공부중인 한 학생입니다.

제가 Ajax로 컨트롤러에 데이터를 전송하고싶어

config.php에서 csrf 설정을 하고

view 부분의 ajax코드에서 data 부분에 

<?php echo $this->security->get_csrf_token_name(); ?>: '<?php echo $this->security->get_csrf_hash(); ?>',를 추가해줬습니다.

하지만 Ajax 전송 시 500 에러가 발생하는데요, 

이게 왜 발생하는건가요? config.php와 view 그리고 controller 소스를 첨부하겠습니다.

<config.php>

....


$config['global_xss_filtering'] = TRUE;

/*
|--------------------------------------------------------------------------
| Cross Site Request Forgery
|--------------------------------------------------------------------------
| Enables a CSRF cookie token to be set. When set to TRUE, token will be
| checked on a submitted form. If you are accepting user data, it is strongly
| recommended CSRF protection be enabled.
|
| 'csrf_token_name' = The token name
| 'csrf_cookie_name' = The cookie name
| 'csrf_expire' = The number in seconds the token should expire.
| 'csrf_regenerate' = Regenerate token on every submission
| 'csrf_exclude_uris' = Array of URIs which ignore CSRF checks
*/
$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_token_ci';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = TRUE;
$config['csrf_exclude_uris'] = array();

....

 

<view>의 ajax 부분

....

    $('#comment_submit').click(function(){
        $.ajax({
            url: '/index.php/board_comment/ajax_comment_add',
            type: 'POST',
            data: {
                <?php echo $this->security->get_csrf_token_name(); ?>: '<?php echo $this->security->get_csrf_hash(); ?>',
                comment_contents: encodeURIComponent($('#input01').val()),
                board_id: '<?php echo $this->uri->segment(3); ?>'
            },
            dataType: 'html',
            complete: function(xhr, textStatus){
                if(textStatus == 'success'){
                    if(xhr.responseText == 1000){
                        alert('댓글 내용을 입력하세요.');
                    }else if(xhr.responseText == 2000){
                        alert('댓글을 다시 업력해주세요.');
                    }else if(xhr.responseText == 9000){
                        alert('댓글을 입력하시려면 로그인이 필요합니다.');
                    }else{
                        alert($('#comment_area').html());
                        $('#comment_area').html(xhr.responseText);
                        $('#input01').val('');
                    }
                }
            }
        })
    });

.....

 

 

<controller 부분>

    public function ajax_comment_add(){
        
        if(@$this->session->userdata('logged_in') == TRUE){
            // 로그인 되어있을 시 
            $table = 'board_comment';
            $board_id = $this->input->post('board_id',TRUE);
            $comment_contents = $this->input->post('comment_contents',TRUE);
            
            if($comment_contents != ''){

                //먼저 board_id로 달린 댓글이 있는지 체크
                //있다면 가장 최신의 댓글의 comment_id를 가져옴
                $arrays = array(
                    'table' => $table,
                    'board_id' => $board_id
                );            

                $latest_comment_id_result = $this->board_model->get_latest_comment_id($arrays);
                if($latest_comment_id_result){
                    $latest_comment_id = $latest_comment_id_result + 1;
                }else{
                    $latest_comment_id = 1;
                }


                $write_data = array(
                    'table' => $table,
                    'board_id' => $board_id,
                    'comment_id' => $latest_comment_id, //board_id + comment_id 카운트
                    'user_id' => $this->session->userdata('user_id'),
                    'comment_contents' => $comment_contents,
                    ;
                );

                $result = $this->board_model->insert_comment($write_data);

                if ($result) {
                    $sql = "SELECT * FROM ". $table ." WHERE board_id = '". $board_id . "' ORDER BY comment_id DESC";
                    $query = $this -> db -> query($sql);
                ?>
                <table cellspacing="0" cellpadding="0" class="table table-striped">
                    <tbody>
                    <?php
                    foreach ($query -> result() as $lt) {
                    ?>
                        <tr>
                            <th scope="row">
                                <?php echo $lt -> user_id;?>
                            </th>
                            <td><?php echo $lt -> contents;?></td>
                            <td>
                                <time datetime="<?php echo mdate("%Y-%M-%j", human_to_unix($lt->reg_date));?>">
                                    <?php echo $lt -> reg_date;?>
                                </time>
                            </td>
                        </tr>
                    <?php
                    }
                    ?>
                    </tbody>
                </table>
                <?php
                } else {
                    // 글 실패시
                    echo "2000";
                }
            } else {
                // 글 내용이 없을 경우
                echo "1000";
            }
        } else {
            // 로그인 필요 에러
            echo "9000";
        }

            }
        }
    }

.....

 

<오류 사진>

https://s3.ap-northeast-2.amazonaws.com/ohrora.com/%EC%A0%9C%EB%AA%A9+%EC%97%86%EC%9D%8C.png 

 

 

 

조언 부탁드립니다. 감사합니다.

태그 ajax,csrf
 다음글 코드이그나이터 db연결 부분에서 500 에러가 발생합니... (5)
 이전글 멀티도메인 관련 소스 입니다. 맞게 사용하고 있는지.. (2)

댓글

변종원(웅파) / 2018/03/06 17:33:00 / 추천 1

이런 상황에서 500 에러는 대부분 db관련 에러입니다.

ci log 확인해보시고 모델의 쿼리를 출력해서 콘솔에서 실행해보세요.

bsc0227 / 2018/03/06 17:36:05 / 추천 0

안녕하세요 웅파님. 조언 감사드립니다.

제가 많이 초보라서그런데 혹시 ci log를 어디에서 볼수 있는지 여쭤봐도 될까요..?

변종원(웅파) / 2018/03/06 17:44:21 / 추천 0

config.php 에서 log로 검색해서 0->4로 바꾸고 application/logs 디렉토리 확인하시면 됩니다.

매뉴얼 아래부분 읽어보세요. http://www.ciboard.co.kr/user_guide/kr/general/errors.html

bsc0227 / 2018/03/06 17:52:12 / 추천 0

감사합니다 웅파님! 해결했습니다 ㅎㅎ 

근데 추가적으로 더 여쭤봐도될까요? Ajax 전송 후 다시 F5를 눌러 브라우저 리프레시를 한 후 다시 시도했을때에는 또 500에러가 발생합니다. 이건 csrf 코드가 아직 안바뀌어서 그런건가요?

변종원(웅파) / 2018/03/06 22:07:06 / 추천 1
데이터가 없어서겠죠. 리프레시 한다고 원래 데이터가 가는게 아닐테니까요.