Ajax 링크 요청을 보호하는 방법
다음 시나리오를 상상해보세요.사용자가 웹페이지에 등록하고 싶어하고 폼에 기입합니다.jQuery는 폼을 작성하는 동안 필드가 유효한지 등을 정규식으로 계속 확인합니다.
E-메일을 로그인 등록 후 사용자가 사용하는 기본 키로 간주하여 Ajax에서 E-메일 필드를 확인하여 해당 E-메일이 등록되어 있는지 여부를 사용자에게 알려야 합니다.Ajax에 확인해서 폼을 비우고 페이지를 새로 고치는 것을 피하고 싶습니다.
따라서 사용자가 전자 메일 필드 입력을 마치면 다음 링크와 같은 Ajax 요청이 서버로 전송됩니다.
example.com/check.php?email=abcdefg@gmail.com
check메일을 메일이 같은 합니다.php는 전자 메일을 수신하면 데이터베이스에 전자 메일이 존재하는지 여부를 묻고 다음과 같은 메시지를 반환합니다.User already exists
가 존재하는 경우 또는 가 존재하는 경우null
사용자가 존재하지 않는 경우.
문제는 누군가가 내 .js를 파헤쳐 이와 유사한 링크를 발견하면 해당 링크를 사용하여 랜덤 이메일이 존재하는지 여부를 확인하는 다수의 요청을 보낼 수 있다는 것입니다.이로 인해 데이터베이스가 과도하게 사용되거나 최악의 경우 크래시되거나 개인 정보가 유출될 수 있습니다.
누군가가 다음과 같은 이메일을 확인하기 위해 대규모 루프를 수행할 수 있습니다.
//Getting the response of the next links
example.com/check.php?email=aaaaaaa@gmail.com // Returns null
example.com/check.php?email=aaaaaab@gmail.com // Returns null
example.com/check.php?email=aaaaaac@gmail.com // Returns null
example.com/check.php?email=aaaaaad@gmail.com // Returns User already exists
------------------------------------------------------------------------------------------------------------------------------------
마지막으로 답변을 수락한 이후 계속 조사하여 이러한 행동을 피하기 위한 해결책을 찾았습니다.다음 코드는 JAVA용이지만 로직은 다른 서버 측 언어에 적용할 수 있습니다.
서버에 AJAX 요청을 하기 전에 서버에 토큰을 요청합니다.은 이렇게 .fmf5p81m6e56n4va3nkfu2ns8n
간단한 방법으로 만들 수 있지만, 더 복잡할 수 있지만, 이것은 좋은 방법입니다.
public String getToken() throws UnsupportedEncodingException {
return new BigInteger(130, new SecureRandom()).toString(32);
}
토큰을 요구할 때 서버는 토큰을 반환할 뿐만 아니라 브라우저를 사용하여 요소(및 브라우저 탐색바)를 검사하는 경우 이러한 스크립트가 실행되고 토큰이 클리어되는 작은 스크립트도 반환합니다.Servlet은 다음과 같은 것을 반환합니다.
_html += "<head>"
+ "<script> "
+ "window.onload=function(){\n"
+ " document.body.innerHTML = \"\";\n"
+ " }"
+ "window.location.href='http://mywebsite.com' "
+ "</script>"
+ "</head>"
+ "<body>"
+ "[" + token+ "]"
+ "</body>"
+ "</html>";
먼저 본문을 비우고 원하는 곳으로 이동합니다. 그러나 javascript/jquery는 전체 콘텐츠를 문자열로 캡처하고 [와 ] 사이의 문자열을 추출합니다.이 토큰은 다음 요청에서만 사용할 수 있으므로 모든 AJAX 요청에는 고유한 토큰이 있습니다.두 번째 요청에서는 방금 사용한 토큰이 삭제됩니다.
토큰을 받으면 다음과 같이 요청 링크에 토큰을 파라미터로 추가합니다.
ajaxRequestObjet = $.ajax({
url: "http://localhost:8084/mywebsite.com/servlet", //<-- local tomcat server
method: "POST",
data: "type=AJAX&page=some-article&token=fmf5p81m6e56n4va3nkfu2ns8n"
});
이 방법은 웹 사이트를 수동으로 검사하고 링크를 사용하려고 하는 사람에 대해 잘 작동하지만, 이를 자동으로 실행하는 Java/php/IIS 서버는 어떻습니까?
이걸 위해 헤더를 요청해!다음과 같은 경우:
boolean isAjax = "XMLHttpRequest".equals(request.getHeader("X-Requested-With"));
이는 XMLHttpRequest가 존재하는 경우에만 해당됩니다.
이치노 확인하세요'Access-Control-Allow-Origin' header is NOT present in your app
자바스크립트하지 않으면 은 이를 반환합니다.Chrome은 Chrome을 반환한다.
XMLHttpRequest cannot load http://localhost:8084/mywebsite.com/servlet. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access.
Java 서버가 Tomcat에 있고 이 테스트를 위해 다른 apache가 있습니다.이것이 apache에 있는 작은 html입니다.이 html은 위의 에러를 나타내고 있습니다.
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
<script>
ajaxRequestObjet = $.ajax({
url: "http://localhost:8084/mywebsite.com/servlet",
method: "POST",
data: "type=AJAX&page=Token"
});
ajaxRequestObjet.done(function (msg) {
alert(msg);
});
</script>
</head>
<body>
</body>
</html>
100% 제어할 수는 없지만...몇 가지 옵션이 있습니다.
Captcha 스크립트에서 사용하는 것과 동일한 방법을 사용해 보십시오.
기본적으로 사용자가 폼/페이지를 로드할 때..PHP 세션에서 임의의 문자열/ID를 생성하여 저장합니다.그들이 ajax 요구를 송신할 때, 당신의 ajax 체크에 문자열/id도 추가하도록 하고, 그렇지 않으면 500의 헤더를 반환하도록 허용하기 전에 그것을 요구합니다.
세션에서 이 방법을 사용하면 체크의 허용 제한을 설정할 수 있습니다(예를 들어 5개). 사용자가 5개 이상의 체크를 시도하면 페이지를 새로고침하거나 인적 체크(Captcha)를 수행해야 합니다.그럼 카운트가 리셋되고..심지어 IP당 1시간 이내에 총 30개의 단어를 허용합니다.
또한 스마트 이벤트를 사용하여 필드/탭 변경 또는 버튼 누름 등과 같이 Ajax 검사가 수행될 때 트리거합니다.또는 유효한 이메일이 검출되었을 때...com.au이 두 번 트리거된다고 합니다.
기본적으로 이렇게 하면 누군가가 JS 파일을 스니핑하여 이메일 체커를 자동화하려고 해도..사용자가 생성한 문자열/ID를 추가할 방법을 찾고 실행되는 요청 양을 제한해야 합니다.
이것 말고는 당신이 쉽게 할 수 있는 일이 별로 없어요.하지만 아직 몇 가지 다른 아이디어가 있습니다.
대부분은 PHP 세션/쿠키를 사용하여 작업합니다.예를 들어, 3개의 이메일 주소를 확인하고 찾아냈다고 합시다.다시 한 번 제한으로 설정하고 수동 제출 같은 것을 요구하도록 강요합니다.
위의 제안이 어떻게 진행되는지 확인해 보십시오. 질문이 있으시면 언제든지 질문해 주십시오.하지만 주말 답장은 하루이틀 걸릴 것 같아..또한 Captcha 스크립트가 풍부한 소스 코드로서 어떻게 기능하는지도 조사합니다.그들은 같은 생각을 하고 있기 때문에.
시간 지연은 단순히 불량하게 표시되거나 사이트가 느려지거나 사용자가 응답을 기다리는 것을 방해합니다.
세션/IP 주소당 조회 수를 제한해야 합니다.그렇지 않으면 항상 이 검사들을 통과시킬 방법이 있습니다.일단 한계에 다다르면..사용자/ip/session을 강제로 몇 분/시간 동안 기다린 후 스크립트로 작성할 수 없도록 Captcha 스크립트를 사용하여 확인합니다.
Javascript 보안 / 소스 숨기기
JS, JS, PHP, JS, JS, JS, JS, JS, JS, 즉 JS입니다.<script src='myjscode.php'></script>
이를 통해 PHP는 유효한 세션을 확인할 수 있습니다.이치그러나 이것은 멤버십/로그인 뒤에서만 JS를 사용할 수 있도록 하는 데 대부분 유용합니다.
여러 개의 체크/이 경우 가능한 경우
어프로치에 따라서는, 유저가 어카운트를 이미 가지고 있는지를 확인하는 것입니까.그렇다면..이메일 체크를 이름/국가/나이/도브와 조합할 수 있습니다.따라서 Ajax 콜에서 체크/응답 정보를 얻기 전에 두세 개의 올바른 일치 값을 선택해야 합니다.
당신 경우는 아닐지 몰라도, 이것 또한 추가될 거라고 생각했어요.
웹 사이트의 JavaScript 코드는 사용자의 컴퓨터에서 실행되므로 사용자가 코드를 검색하는 것을 막을 수 없습니다.코드 난독화(https://www.javascriptobfuscator.com/), 등)를 사용하는 경우에도 해커는 응용 프로그램을 디버깅하여 서버로 전송되는 모든 요청을 기록할 수 있습니다.
보안과 관련된 모든 것이 서버에서 이루어져야 합니다.특정 IP 주소로부터의 요구량을 제한할 수 있습니다.
CSRF 토큰과 유사한 것을 사용하여 브루트 포스 공격으로부터 보호할 수 있습니다.
모든 클라이언트 세션에 서버 생성 ID를 할당합니다.에 대한 각 check.php
아이디입니다.
check.php
는 ID를 포함하지 않는 요구 또는 서버가 생성하지 않은 ID를 포함하는 요구를 거부해야 합니다(스푸핑된 ID를 사용한 공격을 방지하기 위해). - 특정 동안 했거나 가 "ID"를 . 특정 ID가 최근 1초 동안 요청을 했거나(예를 들어), 특정 ID가 다음을 초과한 경우n
에러 응답을 반환합니다.이것에 의해, 1 개의 세션으로부터의 요구가 복수의 IP 주소로부터 착신하는 것으로부터 보호됩니다.
또, 다수의 Web 애플리케이션세션을 열어, 브루트 포스를 방지하려면 , IP 주소에 의한 레이트 제한도 실시할 필요가 있습니다.
공격자가 특정 전자 메일 주소의 단일 또는 소수의 전자 메일 주소를 검색하는 것을 방지하기 위해 할 수 있는 일은 많지 않습니다. 이러한 유형의 검증에는 본질적으로 위험이 따릅니다.
이 문제를 해결하기 위한 한 가지 방법은 다음과 같습니다.
특정 사용자 또는 클라이언트로부터 응답을 받기 위해 서버를 호출하는 Ajax 요청이 있다고 가정합니다.데이터베이스에는 사용자가 서버에 Ajax 요청을 할 때마다 확인할 수 있는 모든 사용자 또는 해시 값에 대해 원하는 토큰을 제공하는 테이블을 만들 수 있습니다.토큰 값이 사용자 요청 값과 일치할 경우 해당 토큰 값은 정품 사용자입니다.또한 테이블에 요청 수를 기록하여 그가 정당한 요청을 수행하는지 확인할 수 있습니다.앱 성능이 저하될 수 있다는 점은 인정하지만 고려해 보는 것이 안전할 것입니다.참고: HTML 페이지에서 토큰을 가져와 Ajax와 함께 전송해야 합니다.
자세한 내용은 코멘트를 부탁드립니다.저는 이 방법을 사용해 왔고, 지금까지는 문제가 없습니다.
예:
이런 유형의 공격은 다른 무차별 공격과 동일하게 취급할 수 있습니다.이 공격에서는 Captcha를 사용하는 것이 유일한 효과적인 해결책입니다.그러나 물론 Captchas는 UX에 해가 되기 때문에 추가 보안의 가치가 있는지, 특히 발생할 가능성이 매우 낮은 공격에 대해 고려해야 합니다.단, 등록 양식에 Captcha를 사용하여 봇이 계정을 만들지 못하도록 할 수도 있습니다.
이런 종류의 공격은 공격자에 대한 보상이 거의 없기 때문에 막대한 비용이 듭니다.테스트할 수 있는 이메일 주소는 수십억 개입니다.공격자가 발견한 사용자를 협박하려는 성인 사이트와 같이 문제가 되는 사이트가 특히 민감한 경우 이와 같은 방법을 사용할 가치가 있을 수 있습니다.
클라우드 플레어
Captcha 솔루션만큼은 아니지만 CloudFlare의 DDoS 시스템에 의해 무차별 공격(bruit force)이 탐지되고 방지될 수 있습니다.또한 CF는 Tor 사용자가 사이트에 접속하기 전에 Captcha를 풀도록 할 수 있으므로 공격자가 Tor를 공격 수단으로 사용하는 것을 방지할 수 있습니다.
IP 환율 제한
IP 기반의 환율 제한에는 문제가 있습니다.이는 공격자가 이와 같은 대규모 작업을 수행하기로 결정했을 경우 공격을 개시하기 위해 Botnet 또는 여러 머신의 다른 시스템을 사용할 가능성이 높기 때문입니다.
모든 사용자가 공용 IP를 공유하는 대학과 같은 대규모 조직을 고려해 보십시오.사용자 중 한 명이 사이트를 공격하면 해당 사용자의 IP를 차단하고 다른 모든 사용자를 차단합니다.이 대책은 실제로 DoS 공격을 시작할 때 사용할 수 있습니다.
세션 ID/CRSF 토큰
공격자는 먼저 페이지에 요청을 해야 토큰을 얻을 수 있으므로 결코 해결책이 아닙니다.추가 요청이지만 공격자에게 불편을 줄 뿐입니다.
우선 메일 주소를 URL로 인코딩합니다. 'example.com/check.php?email=' . urlencode(abcdefg@gmail.com)
질문 추가: 확인 시.php가 호출됩니다.
- 사용자의 세션과 해당 IP가 최근 몇 초 동안 요청을 전송했는지 확인합니다.
- 그렇지 않은 경우 사용자의 세션, 사용자의 IP 및 현재 타임스탬프를 도우미 테이블과 쿠키에 쓰고 DB를 누릅니다.
- 있을 경우 요청을 차단합니다.
하지만 모든 사람이 당신의 JavaScript를 확인할 수 있고 누군가 이것을 이용하려고 한다면, 그는 방법을 찾을 것이기 때문에 이것이 당신에게 사기로부터 도움이 되지 않을 것 같습니다.
설정에 따라서는, 내부에서만 액세스 할 수 있거나, 접속처로부터 확인할 수 있습니다.이 이전 질문을 보세요. 당신이 찾고 있는 질문일 수도 있습니다.요청 서버를 php로 확인하는 방법
를 사용할 수 있습니다.CSRF token
no 또는 무효가 검출되면 스크립트를 조기에 종료합니다.CSRF token
(전부는 아니지만) 거의 모든 PHP 프레임워크가 이를 지원합니다.
또, 시큐러티 커뮤니티의 다음의 질문도 확인해 주세요.https://security.stackexchange.com/questions/23371/csrf-protection-with-custom-headers-and-without-validating-token
언급URL : https://stackoverflow.com/questions/29842122/how-to-secure-ajax-link-requests
'programing' 카테고리의 다른 글
하나의 파일에서 여러 JSON 개체를 추출하려면 어떻게 해야 합니까? (0) | 2023.03.12 |
---|---|
JSON 시리얼화 불가 (0) | 2023.03.12 |
유형에서 속성 제외 (0) | 2023.03.12 |
어레이의 첫 번째 항목을 새 필드에 투영(MongoDB 집약) (0) | 2023.03.12 |
angularjs에서 폼의 유효성을 확인하려면 어떻게 해야 합니까? (0) | 2023.03.12 |