2017-09-04 23 views
0

我不知道我明白這一點。我可以編寫一個簡單的服務器端代碼來獲取任何網站的HTML內容。在我的本地PC或任何主機上運行它,並從任何網站檢索任何頁面。但是這不能通過javaScript來完成?CORS服務器端與客戶端?爲什麼一個人工作,但另一個 - 不?

遠程主機怎麼可能知道哪種應用程序正在發出請求?出於安全目的,不允許跨站請求?我怎樣才能使用服務器端代碼完成相同的請求?並在本地或遠程任何地方運行此代碼?下面是一個簡單的例子,可以從天氣網站獲取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.... 
    } 
} 

但是,當我嘗試從角度作出類似的請求(或任何我認爲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請求,例如上面的服務器端代碼?

回答

3

但是這不能通過javaScript來完成?

是的,它可以  —只是不在瀏覽器上。你可以把請求使用JavaScript中的節點,或在JVM(因爲JVM通過javax.script支持JavaScript),或在Windows上的Metro應用等

怎麼可能爲遠程主機知道某種應用程序正在提出請求?

它沒有。 瀏覽器強制執行相同來源策略,而不是服務器。

我怎樣才能使用服務器端代碼完全相同的請求?

...

...但如果出於安全目的而進行的,怎麼來的,我可以讓這些CORS請求反正我喜歡,例如上述的服務器端代碼?

因爲您的服務器端代碼無法訪問潛在機密的客戶端信息。從:

同源策略有助於保護使用經過驗證的會話的站點。以下示例說明了沒有相同來源策略時可能出現的潛在安全風險。假設用戶正在訪問一個銀行網站並且沒有註銷。然後,用戶轉到另一個網站,該網站在後臺運行一些惡意JavaScript代碼,該代碼從銀行網站請求數據。由於用戶仍然登錄在銀行網站上,惡意代碼可以做任何用戶在銀行網站上可以做的事情。例如,它可以獲取用戶上次交易的列表,創建新交易等。這是因爲瀏覽器可以根據銀行網站的域名向銀行網站發送和接收會話cookie。

訪問惡意網站的用戶會期望他或她訪問的網站無法訪問銀行會話cookie。儘管JavaScript沒有直接訪問銀行會話cookie,但它仍然可以通過銀行網站的會話cookie向銀行網站發送和接收請求。由於腳本基本上可以和用戶做的一樣,所以銀行網站的CSRF保護也不會有效。

相關問題