如果对我的php页面的请求是ajax请求,我想检查服务器端。
我看到了两种方法:
第一种方式:在请求中发送GET
参数,告诉页面这是一个AJAX请求(= mypage.php?ajax
)
mypage.php:
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.php:
if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' ) {
//request is ajax
}
事实上,这两种方式很容易被黑客攻击,因此检查我是否收到这样的AJAX请求是不安全的。
如何检查我是否收到了AJAX请求?
答案 0 :(得分:51)
以下是实现结果的tutorial。
示例:
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')
{
exit;
}
continue;
这会检查
HTTP_X_REQUESTED_WITH
参数是否为空并且是否等于xmlhttprequest
,然后它将退出脚本。
答案 1 :(得分:28)
没有确定的方法可以通过Ajax了解请求。您永远不会信任来自客户端的数据。您可以使用几种不同的方法,但可以通过欺骗轻松克服它们。
答案 2 :(得分:7)
为您网站上的每个页面(实际页面不包含或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中你正在调用你通过的nonce,如果它是好的那么你的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;
?>
编辑:按照我的方式设置nonce仅适用于一小时并且更改,所以如果他们没有刷新在最后一小时或2中执行ajax调用的页面,则ajax请求将失败。
答案 3 :(得分:6)
此函数在yii框架中用于ajax调用检查。
public function isAjax() {
return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest';
}
答案 4 :(得分:4)
$headers = apache_request_headers();
$is_ajax = (isset($headers['X-Requested-With']) && $headers['X-Requested-With'] == 'XMLHttpRequest');
答案 5 :(得分:4)
从带有空合并运算符的PHP 7开始,它将更短:
var textboxObj = new fabric.Textbox(selectValue, {
fontSize: 24,
originX: 'center',
originY: 'center',
top: center.top,
left: center.left,
editable: false,
});
答案 6 :(得分:0)
尝试下面的代码段
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH'])
&& strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')
{
/* This is one ajax call */
}
答案 7 :(得分:-4)
您可以尝试使用$_SESSION
变量来确保从浏览器发出请求。否则,您可以通过数据库或文件[服务器端]发送请求。