拒绝直接访问ajax上调用的php文件的URL

问题描述 投票:2回答:2

我正在尝试拒绝对通过ajax进行表单验证而调用的php文件的直接url访问。我当前拥有的代码会一直工作到表单验证通过,然后才起作用。我不想使用.htaccess。

当前代码:

<?php

$url = strtolower(basename($_SERVER['PHP_SELF'])); // Gets url (parent that uses the include)
$fil = strtolower(basename(__FILE__)); // gets filename (the included file)
if ($url == $fil){
    // if they are the same (file is accessed through url
    // redirect to forbidden page
    header("HTTP/1.0 403 Forbidden");
    exit;
}
// require my configuration
require_once("config.php");
// code to be executed for ajax validation
$username = $_POST['username'];
$conn = mysql_connect(DB_HOST,DB_USER,DB_PASS) or die(mysql_error());
mysql_select_db(DB_NAME,$conn) or die(mysql_error());

$query = mysql_query("SELECT * FROM " . TB_USER . " WHERE username = '{$username}'",$conn) or die(mysql_error());
$result = mysql_num_rows($query);

mysql_close($conn);

if ($result == 0){
    echo "true";
}else{
    echo "false";
}
?>

如果我直接从url访问文件,它将按计划进行重定向,但是当通过ajax验证表单时,如果用户名不可用,它将不执行任何操作。取出前两行代码($ url,$ fil)以及if语句可以使ajax验证正常工作,但是在访问URL时不会拒绝该页面。关于从这里做什么的任何建议?

php ajax url
2个回答
6
投票

使用此:

if(!$_SERVER['HTTP_X_REQUESTED_WITH'])
{
   header("HTTP/1.0 403 Forbidden");
   exit;
}

[在所有现代浏览器中,如果使用AJAX访问页面,PHP都会将此标头添加到请求中。如果正在调用您的页面而该标头不存在,则很有可能直接调用它(或被另一个通过超链接重定向到该页面的页面)调用。基本上,除非使用AJAX调用此页面,否则始终显示禁止页面。


2
投票

没有意义。它没有增加任何实际的安全性。

指示请求正在通过Ajax发出的所有标头(例如HTTP_X_REQUESTED_WITH)可以在客户端伪造。

如果您的Ajax正在提供敏感数据或允许访问敏感操作,则需要添加适当的安全性,例如登录系统。

© www.soinside.com 2019 - 2024. All rights reserved.