允许跨域ajax请求

时间:2012-11-14 23:06:48

标签: php ajax cross-domain

在我的项目中,我需要允许其他人向我的脚本发送ajax请求。因此,外部请求可能来自其他网站和域,也可能来自浏览器扩展 我在脚本的顶部添加了这两行,让他们这样做:

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST');  

现在我的问题是:这里有任何我错过的安全考虑吗?这个简单的解决方案会产生严重问题吗? 如果是这样,什么是更好的解决方案?

感谢您的回复。

4 个答案:

答案 0 :(得分:19)

如上所述,任何人都可以随时向您的页面发送请求:因此您需要的主要安全问题是验证用户输入并仅显示可供公众使用的信息。但这适用于所有脚本。

您需要关注的两个主要问题(在验证用户输入之后)是:

  1. 您可能遇到的问题是用户将信息接收到他们的脚本中。根据浏览器(甚至是同一浏览器的风格),有不同的安全规则可以阻止它们获取信息。对此的一个常见解决方案是将信息提供为“JSONP”,将您的返回值包装为可由客户端执行的函数调用。这是一个简单的例子(取自http://www.geekality.net/2010/06/27/php-how-to-easily-provide-json-and-jsonp/)。要进一步锁定它,您可以坚持所有查询都是JSONP并拒绝任何不发送回调函数的人。
  2. <?php
    
    header('content-type: application/json; charset=utf-8');
    $data = array(1, 2, 3, 4, 5, 6, 7, 8, 9);
    echo $_GET['callback'] . '('.json_encode($data).')';
    
    ?>
    
    1. 有人经常打电话来滥用你的服务。解决方案是捕获IP地址并拒绝来自IP地址的过多呼叫。不是万无一失,但这是一个开始。
    2. 要记住的其他因素:

      • 您的脚本设置的Cookie和其他标头可能会被忽略
      • 同样适用于会话

答案 1 :(得分:1)

像zerkms所说,如果他们只是“去”你的php页面,他们将能够看到它回声的任何东西。 如果可能(不确定),它也会允许不受欢迎的人甚至在本地主机上创建自己的表单,并通过AJAX提交它们以获得他们想要的响应。如果你没关系,信息含糊不清......然后我认为它是“安全的”。这不是获取/传输敏感信息的方法

答案 2 :(得分:0)

private function set_headers() {
    header("HTTP/1.1 ".$this->_code." ".$this->get_status_message());
    header("Content-Type:".$this->_content_type);           
    header("Access-Control-Allow-Origin: *");
}

答案 3 :(得分:0)

这对我来说很完美。

    WeekFields wf = WeekFields.of(Locale.forLanguageTag("ar-TN"));
    int weekYear = 2020;
    // The number of weeks is the same as the week number of the last week in the week year.
    // So find a date in that last week and query its week number.
    // The way to find a date in the last week is:
    // find a date in week 1 of the following year and subtract 1 week.
    LocalDate aDateInWeek1OfTheFollowingYear = LocalDate.of(weekYear + 1, Month.FEBRUARY, 1)
            .with(wf.weekOfYear(), 1);
    LocalDate aDateInLastWeek = aDateInWeek1OfTheFollowingYear.minusWeeks(1);
    int lastWeekNumber = aDateInLastWeek.get(wf.weekOfYear());

    System.out.format("Week year %d has %d weeks.%n", weekYear, lastWeekNumber);