jQuery .ajax()에 CSRF 토큰이 필요합니까?
기본적인 .ajax() POST 메서드를 PHP 파일로 만들었습니다.
어떤 보안 대책이 필요합니까?
AJAX를 통해 전송하여 PHP 파일에서 검증하는 숨겨진 MD5 입력 필드를 사용하는 것을 언급하는 게시물이 몇 개 있었습니다.이 정도면 좋은 방법일까요?
CSRF에 의한 리스크는 외부 사이트가 사용자에게 데이터를 전송하고 사용자 브라우저가 인증 쿠키를 자동으로 전송할 수 있다는 것입니다.
필요한 것은 수신 액션을 위한 몇 가지 방법입니다.$.ajax()
이 방법은 POST 데이터를 전송하여 요청이 외부 사이트가 아닌 사이트 상의 다른 페이지에서 전송되었는지 확인할 수 있도록 합니다.
몇 가지 방법이 있지만 사용자가 확인할 수 있는 요청과 해커가 접근할 수 없는 요청에 토큰을 추가하는 것이 좋습니다.
간단히 말하면 다음과 같습니다.
- 로그온 시 긴 랜덤 문자열 토큰을 생성하여 사용자에 대해 저장합니다.
- 에 파라미터를 추가합니다.
$.ajax()
토큰을 포함하는 요구. - 요청 시 토큰이 사용자를 위해 저장한 토큰과 일치하는지 확인합니다.
- 토큰이 일치하지 않으면 CSRF 해킹이 있습니다.
해커는 사용자의 DB에 액세스할 수 없으며 사용자가 사용자에게 보낸 페이지를 실제로 읽을 수 없습니다(XSS 공격이 발생하지 않는 한, 이는 다른 문제입니다). 따라서 토큰을 스푸핑할 수 없습니다.
토큰에서 중요한 것은 사용자가 토큰을 예측(및 검증)할 수 있고 해커가 할 수 없다는 것입니다.
따라서 길고 랜덤한 것을 생성하여 DB에 저장하는 것이 가장 쉬우나 암호화된 것을 대신 구축할 수 있습니다.다만, 유저명 MD5 뿐만이 아닙니다.CSRF 공격자가 토큰을 생성하는 방법을 알아내면 해킹당할 것입니다.
또 다른 방법은 토큰을 (데이터베이스가 아닌) 쿠키에 저장하는 것입니다. 공격자가 쿠키를 읽거나 변경할 수 없으므로 토큰을 재발송하도록 합니다.HTTP POST 데이터의 토큰이 쿠키의 토큰과 일치합니다.
예를 들어 성공적으로 사용될 때마다 변경되는 토큰(재전송 방지)이나 사용자 및 액션에 고유한 토큰 등 훨씬 더 정교하게 만들 수 있지만, 이것이 기본 패턴입니다.
엄밀하게는 토큰은 필요하지 않지만 CSRF에 대해 상태를 변경하는 기능은 보호해야 합니다.
요청은 AJAX를 통해 이루어지지만 CRSF는 매우 위험합니다.이는 AJAX 요청이 도메인 간에 전달될 수 있기 때문입니다. 동일한 오리진 정책은 읽기만 보호하며 쓰기는 보호하지 않습니다.또, 종래의 형식에서는, AJAX 와 같은 POST 요구를 송신할 수 있어 현재의 서버측 코드로서는 이것을 검출할 수 없는 경우가 있습니다.
서버측 코드로 요구가 자신의 사이트에서 송신되고 있는지를 검출할 수 있는 간단한 방법의 하나는, AJAX 요구와 함께 송신되는 헤더를 추가하는 것입니다.서버측 코드에서 이 헤더의 존재를 확인하는 것이 중요합니다.랜덤 토큰은 필요 없습니다.
이는 다음과 같은 이유로 동작합니다.
- HTML 양식에는 공격자가 사용자 지정 헤더를 추가할 수 없습니다.
- 커스텀 헤더는, CORS 를 netable로 하지 않으면 크로스 도메인을 통과할 수 없습니다.
웹에서의 향후 전개에 대한 방어를 위해 랜덤 토큰을 구현하는 것도 좋은 생각일 수 있습니다.이것은 어떤 식으로든 현재 사용자 세션과 관련지을 필요가 있습니다.토큰이 구현되지 않은 경우 현재 악용할 수 없지만 웹의 길고 왜곡된 역사에서는 토큰 부족이 플래시 및 기타 브라우저 플러그인에 의해 악용될 수 있습니다.완벽한 세상에서 HTML5와 생활표준은 이러한 플러그인이 과거의 것이라는 것을 의미해야 하지만, 심층방어를 추가하고 미래의 증거를 위해 토큰도 권장합니다.
상세 정보:X-Requested-With 헤더의 요점은 무엇입니까?
의뢰 위조에 관해서는 의뢰인이 의뢰를 어떻게 보내느냐가 아니라 의뢰인이 의뢰를 어떻게 받았느냐가 중요합니다.다른 유형의 게시물과 동일한 CSRF 규칙이 Ajax 게시물에 적용됩니다.
CSRF 예방 치트 시트를 읽는 것을 추천합니다.사용자별 비밀 토큰을 사용하는 것이 가장 일반적인 보호 형식입니다.
다음은 django에서 사용할 수 있는 간단한 데모입니다.
HTML 페이지
{%block content%}
<form id="userForm">
{%csrf_token%}
<input type="text" id="username" placeholder="User Name">
<input type="password" id="password" placeholder="Password">
</form>
{%endblock%}
자바 스크립트 코드
%(document).on('submit','#userForm',function(e){
e.preventDefault();
$.ajax({
type = 'POST',
url:'path/to/url',
data:{
username:$('#username').val(),
password:$('#password').val(),
csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken').val()
},
success:function(data){
alert('Successfull');
}
});
});
언급URL : https://stackoverflow.com/questions/9089909/do-i-need-a-csrf-token-for-jquery-ajax
'it-source' 카테고리의 다른 글
반응에서 url의 이미지를 표시합니다.JS (0) | 2023.04.01 |
---|---|
각도 JS - 자동으로 입력에 초점을 맞추고 자동 검색 드롭다운을 표시합니다 - ui.bootstrap.autoahead (0) | 2023.03.27 |
워드프레스 $wpdb->get_results 및 num_rows (0) | 2023.03.27 |
.docx, .pptx 등의 올바른 MIME 유형은 무엇입니까? (0) | 2023.03.27 |
새 사용자 지정 테마에 Woocommerce 등급이 표시되지 않음 (0) | 2023.03.27 |