2013-03-15 89 views
13

我有一个网站需要根据用户交互增加数据库中的值。当用户点击一个按钮时,会调用一个php脚本来增加该值。我想保护这个脚本不被外部脚本访问。目前,用户可以使用JavaScript函数编写他们自己的网页,该函数重复地点击相同的php文件以炸毁数据库中的值。只允许通过本地服务器上的ajax访问PHP文件

这里是我的jQuery代码,不会递增:

jQuery(function(){ 
$('.votebtn').click(function(e){ 
    var mynum = $(this).attr('id').substring(0,5); 
    $.ajax({ 
      url:"countvote.php", 
      type:"GET", 
      data: { 
       thenum:mynum 
      }, 
      cache: false, 
      success:function(data) { 
       alert('Success!'); 
       } 
      } 
     }); 
}); 
}); 

我怎么会去使它所以只有本地服务器上的从阿贾克斯/ jQuery的调用可以访问“countvote.php”?如果这不是正确的方法,我会接受任何建议,以防止我的php脚本被外部脚本滥用。

+0

你能限制可以访问countvote.php,只有那些在您的域名网站? – user829323 2013-03-15 16:05:46

+0

@ user829323使用'wget'在浏览器之外伪造这个很简单。 – 2013-03-15 16:11:24

回答

3

您可以检查$_SERVER['HTTP_X_REQUESTED_WITH']是否等于xmlhttprequest,但它不是一个可靠的方法来确定请求是否是AJAX请求,总是有办法解决这个问题。但它可以保护您免受随机匹配,如错误输入的网址,爬虫等。

2

这不是真正的100%这样做。 AJAX请求总是来自客户端。使用POST请求而不是GET,这将有助于阻止任何问题,但不能完全阻止它们,并在您的PHP中,只是放弃所有的请求。

+2

不幸的是,这不是一个选项。我发现了iOS 6缓存来自JQuery/AJAX的POST请求结果的难题。因此,在移动设备上,响应信息不准确。 – LoneWolfPR 2013-03-15 16:13:13

+0

检查此答案以解决该问题。 http://stackoverflow.com/questions/12506897/is-safari-on-ios-6-caching-ajax-results – castis 2013-03-15 16:16:23

+1

除非我错了,我认为你需要使用JQuery 1.5或更高版本才能使用标题控件。不幸的是我使用1.3不支持这个。它是CMS的一部分,我目前无法进行更新。不过谢谢。 – LoneWolfPR 2013-03-15 16:21:52

33

该解决方案需要两个步骤。

首先,ajax文件必须只允许在此代码中的ajax请求中进行访问。

define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&  strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'); 
if(!IS_AJAX) {die('Restricted access');} 

其次,AJAX文件在文件与命令$ _ SERVER [“HTTP_REFERER”]叫它的名字访问。 因此,您只能在主机服务器中限制访问。

$pos = strpos($_SERVER['HTTP_REFERER'],getenv('HTTP_HOST')); 
if($pos===false) 
    die('Restricted access'); 

也许代码可以与第二部分只工作

+1

这是一个非常好的主意。它的工作原理。 – Kiwy 2014-01-17 11:06:54

+3

这不起作用。任何人都可以用他们喜欢的任何值发送X-Requested-With和Referer头文件。 – Quentin 2016-02-21 20:54:31

+0

@Quentin,那么您的解决方案是如何解决这些要求?提供的秘密? – 2017-03-13 10:49:41

相关问题