요청이 PHP를 사용한 AJAX 요청인지 확인하는 방법
제 php 페이지에 대한 요청이 Ajax 요청인지 서버 측을 확인하고 싶습니다.
저는 두 가지 방법을 보았습니다.
첫 번째 방법: 송신GET페이지에 이것이 AJAX 요청임을 알려주는 요청의 매개 변수(=mypage.php?ajax)
mypage.mypage:
if(isset($_GET['ajax'])) {
//this is an ajax request, process data here.
}
두 번째 방법: 헤더를xmlHttpRequest:
클라이언트 측 js:
xmlHttpRequestObject.open(“GET”,url,true);
xmlHttpRequestObject.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
mypage.mypage:
if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' ) {
//request is ajax
}
사실 이 두 가지 방법은 해킹되기 쉽기 때문에 AJAX의 요청이 있는지 확인하는 것은 안전하지 않습니다.
AJAX 요청을 받고 있는지 확인하려면 어떻게 해야 하나요?
아카이브된 튜토리얼의 예:
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')
{
exit;
}
continue;
이것은, 다음의 경우에 체크됩니다.
HTTP_X_REQUESTED_WITH파라미터가 공백이 아닌 경우xmlhttprequest스크립트에서 종료됩니다.
요청이 Ajax를 통해 이루어졌다는 것을 알 수 있는 확실한 방법은 없습니다.클라이언트로부터의 데이터는 절대 신뢰할 수 없습니다.몇 가지 다른 방법을 사용할 수 있지만 스푸핑으로 쉽게 극복할 수 있습니다.
Null 병합 연산자를 사용하는 PHP 7부터는 더 짧아집니다.
$is_ajax = 'xmlhttprequest' == strtolower( $_SERVER['HTTP_X_REQUESTED_WITH'] ?? '' );
사이트의 모든 페이지(실제 페이지에는 현재 페이지명이 포함되어 있지 않거나 rpcs가 포함되지 않음)에 대해 세션 변수를 설정하고 Ajax 콜에서 다음과 같이 지정된 난스를 전달합니다.$_SERVER['SCRIPT_NAME'];
<?php
function create_nonce($optional_salt='')
{
return hash_hmac('sha256', session_id().$optional_salt, date("YmdG").'someSalt'.$_SERVER['REMOTE_ADDR']);
}
$_SESSION['current_page'] = $_SERVER['SCRIPT_NAME'];
?>
<form>
<input name="formNonce" id="formNonce" type="hidden" value="<?=create_nonce($_SERVER['SCRIPT_NAME']);?>">
<label class="form-group">
Login<br />
<input name="userName" id="userName" type="text" />
</label>
<label class="form-group">
Password<br />
<input name="userPassword" id="userPassword" type="password" />
</label>
<button type="button" class="btnLogin">Sign in</button>
</form>
<script type="text/javascript">
$("form.login button").on("click", function() {
authorize($("#userName").val(),$("#userPassword").val(),$("#formNonce").val());
});
function authorize (authUser, authPassword, authNonce) {
$.ajax({
type: "POST",
url: "/inc/rpc.php",
dataType: "json",
data: "userID="+authUser+"&password="+authPassword+"&nonce="+authNonce
})
.success(function( msg ) {
//some successful stuff
});
}
</script>
다음으로 RPC에서 합격 난스 테스트를 호출하고 있습니다.합격하면 RPC가 합법적으로 호출되었을 가능성이 매우 높아집니다.
<?php
function check_nonce($nonce, $optional_salt='')
{
$lasthour = date("G")-1<0 ? date('Ymd').'23' : date("YmdG")-1;
if (hash_hmac('sha256', session_id().$optional_salt, date("YmdG").'someSalt'.$_SERVER['REMOTE_ADDR']) == $nonce ||
hash_hmac('sha256', session_id().$optional_salt, $lasthour.'someSalt'.$_SERVER['REMOTE_ADDR']) == $nonce)
{
return true;
} else {
return false;
}
}
$ret = array();
header('Content-Type: application/json');
if (check_nonce($_POST['nonce'], $_SESSION['current_page']))
{
$ret['nonce_check'] = 'passed';
} else {
$ret['nonce_check'] = 'failed';
}
echo json_encode($ret);
exit;
?>
edit: 참고로 설정 방법은 난스는 1시간 동안만 유효하고 변경되기 때문에 마지막 1시간 또는 2시간 내에 Ajax 콜을 실행하면서 페이지를 갱신하지 않으면 Ajax 요구는 실패합니다.
이 함수는 Yii PHP 프레임워크에서 AJAX 호출을 확인하기 위해 사용됩니다.
public function isAjax() {
return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest';
}
$headers = apache_request_headers();
$is_ajax = (isset($headers['X-Requested-With']) && $headers['X-Requested-With'] == 'XMLHttpRequest');
아래 코드 스니펫을 사용해 보십시오.
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH'])
&& strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')
{
/* This is one ajax call */
}
HTTP_SEC 사용 시도
if (!array_key_exists("HTTP_SEC_FETCH_SITE",$_SERVER) || $_SERVER["HTTP_SEC_FETCH_SITE"] != "same-origin")
die(header("HTTP/1.1 404 Not Found"));
if (!array_key_exists("HTTP_SEC_FETCH_MODE",$_SERVER) || $_SERVER["HTTP_SEC_FETCH_MODE"] != "cors")
die(header("HTTP/1.1 404 Not Found"));
if (!array_key_exists("HTTP_SEC_FETCH_DEST",$_SERVER) || $_SERVER["HTTP_SEC_FETCH_DEST"] != "empty")
die(header("HTTP/1.1 404 Not Found"));
사용해보실 수 있습니다.$_SESSIONvariable을 지정하여 브라우저에서 요청이 이루어졌는지 확인합니다.그렇지 않으면 데이터베이스 또는 파일 [서버측]을 통해 요청을 전송할 수 있습니다.
언급URL : https://stackoverflow.com/questions/18260537/how-to-check-if-the-request-is-an-ajax-request-with-php
'source' 카테고리의 다른 글
| 치명적인 오류: mysqld를 루트로 실행하는 방법에 대해서는 매뉴얼의 "보안" 섹션을 참조하십시오. (0) | 2022.11.22 |
|---|---|
| python dict를 문자열로 변환한 후 되돌립니다. (0) | 2022.11.22 |
| Maven에서 "401 Unauthorized" 오류가 발생하는 이유는 무엇입니까? (0) | 2022.11.13 |
| 행을 복사하지만 새 ID를 사용합니다. (0) | 2022.11.13 |
| MySQL의 LIMIT 절 변수 사용 (0) | 2022.11.13 |