如何允许只通过站点调用php文件,而不通过元素或url调用

ffscu2ro  于 2021-06-20  发布在  Mysql
关注(0)|答案(4)|浏览(385)

我有很多 php 文件更新我的数据库,但我希望这些只有在我的代码(通常由ajax)中调用时才能工作。
现在,如果我把 php 如果我将ajax代码放入inspect元素,数据库就会更新。
我不希望人们在不应该被他们改变的信息上乱搞。
我该怎么解决这个问题?
前任。
在其中一个文件中,我将db值加1。如果我把这个文件的链接放到浏览器中,它会添加一个。如果我把ajax放到这个链接上,它也会更新db。这对网站的安全非常不利。
编辑:我试图实现最高评级的答案,但我得到的错误:
意外的标记“.”。属性名“myreq”后应为“:”。
这是我的密码:

var myreq = new XMLHttpRequest();

$.ajax({
    headers: {
        myreq.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    }
    url: 'http://myurl.php',
    data: {},
    type: 'post',
    success: function(output) {
    }
});

我可能不得不把myreq部分放在beforesend下,而不是headers下,但是idk,我对这个不太熟悉。

zsohkypk

zsohkypk1#

如果要阻止直接访问php文件,并且只允许ajax调用,请参见阻止直接访问ajax函数调用的文件问题:
您可以在服务器端使用以下代码:

if( isset( $_SERVER['HTTP_X_REQUESTED_WITH'] ) && ( $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' ) )
{
    // allow access....
} else {
    // ignore....
}

并为客户端的ajax请求添加标头:

var myreq = new XMLHttpRequest();
myreq.setRequestHeader("X-Requested-With", "XMLHttpRequest");

使用此解决方案,您可以防止滥用在标准浏览器中打开该文件
但请记住:客户端的所有内容都可能被欺骗。因此,如果要防止滥用,就需要更改更新数据库值的方式。或者至少添加ip检查或会话检查或验证码,使黑客更难滥用。。。
在本例中,黑客可以欺骗ajax调用

php 7更新:

感谢stephen r(用于注解)从PHP7开始,您可以用以下代码替换if语句以获得更干净的代码:

if( ( $_SERVER['HTTP_X_REQUESTED_WITH'] ?? 0 ) === 'XMLHttpRequest' )
tez616oj

tez616oj2#

你需要加入 .htaccess 文件。

<Files ~ "^.*">
  Deny from all
</Files>

<Files ~ "^index\.php|css|js|.*\.png|.*\.jpg|.*\.gif">
  Allow from all
</Files>

这里只允许index.php和所有css/js/images允许从浏览器直接url或ajax或从代码调用。

nzkunb0c

nzkunb0c3#

如果您担心安全性,您应该要求某种帐户注册,以便可以随请求发送一些身份验证数据(最好是令牌)。任何类型的客户端身份验证(我能想到的唯一原因是要求调用源自您的站点)都是一个糟糕的想法

disbfnqx

disbfnqx4#

对于您编辑的代码,有几个问题。你不需要 XMLHttpRequest . 如果将头作为数组提供,jquery将添加头。
此外,在headers元素后面还需要一个逗号。注意,ajax函数的参数是一个数组,而headers只是该数组中的元素之一。
请尝试以下操作:

$.ajax({
    headers: {
        "X-Requested-With" : "XMLHttpRequest",
    },
    url: 'http://myurl.php',
    data: {},
    type: 'post',
    success: function(output) {
    }
});

相关问题