내 경우 jquery를 통해 아약스를 호출하여 문제는 대상이 측면 소스에서 볼 수 있다는 것입니다. 남용을 방지하기위한 해결책을 모색하고 저의 겸손한 접근 방식에 대해 어떻게 생각하는지 묻고 싶습니다. PHP/ajaxcall - 악용 또는 직접 액세스를 막기위한 접근법
아약스 호출 (만약 내가 잘못 날 수정)에 대해 알아야 할 사항 : 당신이 정규 HTML 렌더링처럼 접근이 필요하기 때문에 사용자에게 직접 액세스를 허용해야.
개의 세션을 사용할 수 있습니다. ,
이 중 내가 먼저 ajaxscript에 액세스하는 스크립트를 생성 추적은 사용자 이후 사용할 수
IP가 파일에 액세스하지 내 스크립트 (이것은 다른 보호 방법에 대한 보유 것) 시간을 얻거나 해시하거나 소금과 암호로 같은 시간을 암호화하여이 두 값을 사용자에게 전달합니다. 성공 함수에서 나는이 2 개의 값을 취하여 다음 ajaxcall을 사용하여 메인 스크립트에 액세스합니다. 이 난이 값 확인 :
이시간과 동일하게 암호화 된 시간인가를
두 아약스 후에 실행 x 초 내가 또한 쉽게 포함
호출 이하나요 추가 보안을 위해 $ _SERVER [ 'HTTP_X_REQUESTED_WITH'를 위조하려면 위조되거나 위조 될 수 있습니다. GET을 통해 2 개의 값을 전달하는 대신 Session을 사용하여 전송할 수 있습니다 :).
index.html을
<script>
$(document).ready(function() {
$("#ajaxloadlink").click(function(){
$("#ajaxcontent").load("ajax.php",function(responseText, textStatus, XMLHttpRequest){
// alert(responseText);
var pruf = responseText; // $("#ajaxcontent").html();
var arr = pruf.split('|');
var geturl = "ajax.php?verifyvar="+ arr[1] +"&timedone="+ arr[0];
$("#ajaxcontent").load(geturl);
});
});
});
</script>
<button id="ajaxloadlink">Lade ajax.php mit load()</button>
에는 processFile의 ajax.php : 나 당신이 내 방식의 생각을 듣고 당신이 경우 코드를 수정하는 것은이 영광을 것
<?php
// the function to use for encryption
define('SALT', 'whateveryouwant');
function encrypt($text)
{
return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SALT, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))));
}
function decrypt($text)
{
return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, SALT, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));
}
if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'))
{
//only internal scripts can be used, fakeable
if(empty($_GET))
{
$time = time();
$verifvar_created = encrypt($time);
echo $time."|".$verifvar_created;
}
else
{
//zweiter Durchlauf
$verifvar = $_GET['verifyvar'];
$timedone = $_GET['timedone'];
//VERIFY
$curtime = time(); //holds also timemax
$timemin = $curtime - 2;
if($timedone <= $curtime && $timedone >= $timemin)
{
echo "COOOL";
//now its an actual request
$verifvar_checked = decrypt($timedone);
if ($verifvar == $verifvar_checked)
{
echo "VERIFIED";
// now process the actual script
// :)
}
}
}
} else
{
echo "no direct access allowed";
}
?>
그것이라고 생각한다. 나에게 그것은 작동하는데, 나는 ajax 호출 사이에 2 초를 허용했다. (이것은 단지 2 단어이기 때문에 렌더링하기 쉽다).
일반적으로 접근 가능한 모든 콘텐츠는 일반적인 사용자처럼 index.html을 통해 올바른 머리글을 사용하여 말아서 액세스 할 수 있습니다. 왜냐하면 대부분의 환경 (php 같은)에서는이 스크립트에서 필요한 버튼을 "클릭"할 수 없으므로 curl은 쉽게 ajax 호출을 사용할 수 없기 때문입니다. watir, 셀레늄과 같은 다른 환경에서도 쉽게 위조 할 수 있습니다.
그렇다면 추가적인 보안 계층이 필요합니까? 나를 도와 주신 귀하의 의견에 감사드립니다. 나의 잘못을 고쳐 주셔서 감사합니다.
SOF 2012에서 멋진 하루 되세요 !!
이것은 codereview에서 더 좋을지 모르지만 내가 본 것처럼 이미 코드에 약간의 문제가 있습니다. 사용자의 연결 속도, 1 초 안에로드 할 항목, 다른 사용자가로드 할 항목을 알 수 없습니다. 5. 그래서 어쩌면 당신은 한도를 올려야합니다. 그런 다음에 어떤 종류의 학대를 예방하려고합니까? –
왜 클라이언트 쪽에서 URL을 숨기려고하는지 이해가 안됩니다. 그리고 나는 컬이 아약스 콜에 쉽게 접근 할 수 없다는 것을 무슨 뜻인지 이해하지 못합니까? 이 코드의 목표를 설명 할 수 있습니까? –
@egor 나는 클라이언트 측 URL을 숨기지 않습니다.이 작업은 수행 할 수 없습니다. curl은 ajax-target-script를 잡고 스크립트에 직접 액세스 할 수 있습니다. curl (php 환경에서)은 index.html에 액세스 할 수 없으며 Ajax-target-script로 이동합니다. 먼저 2 개의 필요한 값을 얻으려면 index.html을 통해 스크립트를 호출해야합니다. – Email