【问题标题】:How have safe HTTP Request Method如何拥有安全的 HTTP 请求方法
【发布时间】:2014-06-08 11:38:50
【问题描述】:

当使用 GET 方法接收 JSON 数据时,我们可以直接从 Web 浏览器访问结果,例如,我将 mydata 值从 ajax 发送到 main.php 文件,它会处理并获得答案,显示结果如下所示:

<?php 

if (isset($_GET["mydata"])) {
if ($_GET["mydata"]=="hello"){
echo "hello world";

} 
}

?>

但是当用户直接在浏览器中调用它时,比如http:mysite.com/mydata.php?mydata=hellorecive answer。我不想让用户直接得到http请求的答案,而只能从主页的ajax结果中显示出来,可以吗?

【问题讨论】:

  • 我认为不可能完全阻止用户直接访问该页面 - 例如,您可以检查是否已发送 Referer 标头(如果页面被访问为AJAX 调用的结果),但高级用户可以轻松绕过它。
  • 如何安全地从我的 Web 部件发送数据?
  • 定义什么是“用户”。对于您的服务器,“用户”是发送 HTTP 请求的任何东西。任何东西都可以发送 HTTP 请求。作为 AJAX 或手动发送的 HTTP 请求没有区别。您无法隐藏对公共 API 的 HTTP 请求的详细信息。你为什么首先要这样做?你要保护什么?

标签: php ajax httprequest


【解决方案1】:

您在询问如何通过将 URL 复制粘贴到网络浏览器中来防止直接访问仅 ajax 请求;也就是说,只允许通过主网页上的 ajax 访问 URL。

嗯,你可以尝试一些事情:

  1. $_SERVER['HTTP_REFERER']检查主页URL的Referrer
  2. 在 Javascript 中使用 xhr.setRequestHeader() 设置标题,然后通过在 PHP 中检查 $_SERVER['HTTP_X_....'] 来确保它的值
  3. 像 Jay Bhatt 建议的那样,检查 X_REQUESTED_WITH 标头,但请注意,这可能并不总是设置(请参阅:X-Requested-With header not set in jquery ajaxForm plugin

但是,在任何这些情况下,您都应该知道,任何知道自己在做什么的人都可以轻松设置任何 HTTP 标头、变量,甚至修改发送到服务器的引荐来源网址。因此,不能 100% 保证您的资源可以通过主网页上的 AJAX 访问。互联网中没有内置控件来验证请求来自何处,因此任何人都可以轻松欺骗或伪造它。

【讨论】:

    猜你喜欢
    • 2018-12-19
    • 2017-09-17
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多