다른url에서 폼 전송
본문
선생님들 안녕하세요!
다른url에서 임의폼생성하여 업데이트 페이지로 전송하여 공격하는 사안에대해서,
해당 기능을 막기위해서 알아본결과 CSRF 토큰을 적용하여야 한다는것을 알고,
예제를 확인해봐도 이해가 잘안되어 조언 요청드립니다.
example.php
session_start();
$_SESSION['my_token'] = bin2hex(random_bytes(32));
<form id='form'>
<input type="hidden" name="my_token" value="<?php echo $_SESSION['my_token']?>">
</form>
<script>
$.ajax({
url: 'update.php',
data: new Formdata($('#form')[0]),
success: function(data){
$('body').html(data);
}
});
</script>
이런식으로 토큰을 생성하고
넘겨진 값을 update 페이지에서
update.php
if($_SESSION['my_token'] != $_POST['my_token']){
alert('외부접근입니다.');
}
이렇게 체크하는줄 알았는데, 아닌것 같아서요 ㅠㅠ....
선생님들의 조언부탁드립니다.
!-->!-->
답변 4
ajax로 값을 넘기면 어차피 노출이 될 것이므로 완전하다고 할 수 없을 것입니다.
글작성 페이지에서 토큰을 생성하여 ip도 함께 디비에 저장하여 두었다가
업데이트 화면에서 불러오면 값이 있는지 없는지 확인 하여 외부에서 접속인지 알 수 있습니다.
$_SERVER['HTTP_HOST'] 등
다양한 변수를 같이 저장하면 절대로 외부에서 들어올 수 없을 것입니다.
혹시 오타가 있는 건가요?
if($_SERSSION['my_tokne'] != $_POST['my_token']){
if($_SERSSION['my_token'] != $_POST['my_token']){
csrf 방지 처리는 적용하신 방법이 맞는것 같습니다. POST로 받으시고, data를 formdata 객체로 주시는데 그거에 대한 설정이 없어서 못읽는게 아닌가 싶습니다.
$.ajax({
url: 'update.php',
type:'post',
contentType:false,
processData: false,
data: new Formdata($('#form')[0]),
success: function(data){
$('body').html(data);
}
});
저렇게 처리를 하더라도 대상자가 해당 구간에서 token값을 확인하여 전송할 경우 어차피 무력화 될꺼에요..
차라리 recaptcha를 연동하거나 ip 값을 구분해서 차단하는 수 밖에 없을 듯 하네요..
혹은 회원가입된 계정만 글을 받거나..물론 인증이 필수로 들어가야...
답변을 작성하시기 전에 로그인 해주세요.