CORS服务器端与客户端?为什么一个有效,另一个无效?

时间:2017-09-04 12:23:47

标签: javascript c# angularjs asp.net-mvc cors

我不确定我是否理解这一点。我可以编写一个简单的服务器端代码来获取任何网站HTML内容。在我的本地PC或任何主机上运行它,并从任何网站检索任何页面。但这不可能通过javaScript完成吗?

远程主机如何知道发出请求的应用程序类型?出于安全目的,不允许交叉原始请求?为什么我可以使用服务器端代码发出完全相同的请求?并在本地或远程任何地方运行此代码?下面是一个从Weather网站获取HTML页面内容的简单示例,该工作正常。但我不能在JavaScript代码中执行此操作?没有用。

public static class WeatherManager
{
    private static HtmlDocument document = new HtmlDocument();

    public static MyWeather GetWeather()
    {
        try
        {
            var web = new HtmlWeb();
            document = web.Load("http://www.weatheroffice.gc.ca/city/pages/on-143_metric_e.html");
        }
        catch (Exception ex)
        {
            throw new Exception("Weather is not loaded");
        }

        var mainContent = document.DocumentNode.SelectSingleNode("//*[@id='mainContent']");
        var nownode = mainContent.SelectSingleNode("//section[1]/details/div/div");
        var forecastnodes = mainContent.SelectNodes("//section[2]/details/table[1]/tr[2]/td");

        // Do some processing....
    }
}

但是当我尝试从Angular(或任何我认为JS lib)提出类似请求时

getWeatherForecast() {
    const url = 'https://weather.gc.ca/city/pages/on-143_metric_e.html';
    return this.$http.get(url);
}

我得到这样的东西

enter image description here

我知道...... CORS好,但是如果出于安全目的,为什么我还能做出我喜欢的CORS请求,例如上面的服务器端代码?

1 个答案:

答案 0 :(得分:3)

  

但这不能通过javaScript完成吗?

是的,它可以 - 只是不在浏览器上。您可以在Node中或在JVM中使用JavaScript(因为JVM通过javax.script支持JavaScript),或在Windows上的Metro应用程序等中发出请求。

  

远程主机如何知道提出请求的应用程序是什么类型?

没有。 浏览器强制执行同源策略,而不是服务器。

  

为什么我可以使用服务器端代码发出完全相同的请求?

     

...

     

...但是如果它是出于安全目的而做的,为什么我还能做出我喜欢的CORS请求,例如上面的服务器端代码?

因为您的服务器端代码无法访问潜在保密的客户端信息。来自the Wikipedia article on the SOP

  

同源策略有助于保护使用经过身份验证的会话的网站。以下示例说明了在没有同源策略的情况下可能出现的潜在安全风险。假设用户正在访问银行网站但未注销。然后,用户转到另一个站点,该站点在后台运行一些恶意JavaScript代码,该代码从银行站点请求数据。由于用户仍然登录银行站点,恶意代码可以执行用户可以在银行站点上执行的任何操作。例如,它可以获取用户上次交易的列表,创建新交易等。这是因为浏览器可以根据银行网站的域向银行网站发送和接收会话cookie。

     

访问恶意网站的用户希望他或她访问的网站无法访问银行会话Cookie。虽然JavaScript无法直接访问银行会话cookie,但它仍然可以通过银行网站的会话cookie向银行网站发送和接收请求。因为脚本基本上可以像用户那样做,所以银行网站的CSRF保护也不会有效。