2017-06-01 89 views
0

我解析一個網頁,並根據內容,我需要一個ajax調用我的本地主機。 在本地主機上將是一個PHP腳本,它將通過AJAX交換數據,可能是JSON格式(我還不確定,仍在閱讀和測試)。Javascript,ajax,跨域調用,覆蓋內容安全策略

這是一個插件,我嘗試谷歌網頁測試過

https://www.google.de

我按照這個簡單的Ajax例子:

https://www.w3schools.com/xml/ajax_xmlhttprequest_response.asp

我成功撥打了電話本身

//loadDoc("http://localhost/index.php", myCallback); <-- this NOT 
//loadDoc("https://www.google.de", myCallback); <-- this WORKS 

/* 
Content Security Policy: Ignoring 「'unsafe-inline'」 within script-src: ‘strict-dynamic’ specified (unknown) 
Content Security Policy: Ignoring 「https:」 within script-src: ‘strict-dynamic’ specified (unknown) 
Content Security Policy: Ignoring 「http:」 within script-src: ‘strict-dynamic’ specified 
*/ 

function loadDoc(url, cFunction) { 
    var xhttp; 
    xhttp=new XMLHttpRequest(); 
    xhttp.onreadystatechange = function() { 
    if (this.readyState == 4 && this.status == 200) { 
     cFunction(this); 
    } 
}; 
    xhttp.open("GET", url, true); 
    xhttp.send(); 
} 


function myCallback(xhttp) { 

    alert("I'm alive from my local server"); 

} 

(BIG)問題是我發現「內容安全策略」不允許我打電話給其他域,即使我在我自己的環境中(我的瀏覽器,FF 53)。

現在看來,這至少可以很容易地欺騙GET請求,正如我需要,通過在DOM中插入腳本,這樣

AJAX cross domain call

和Rob特別是這個偉大的職位W¯¯

Insert code into the page context using a content script

所以我嘗試這樣,但仍然不工作。

// var actualCode = ['/* Code here. Example: */' + 'alert(0);', 
        // '// Beware! This array have to be joined', 
        // '// using a newline. Otherwise, missing semicolons', 
        // '// or single-line comments (//) will mess up your', 
        // '// code ----->'].join('\n'); 

var script = document.createElement('script'); 
script.src = "http://localhost/index.php"; 
script.type = "text/javascript"; 
document.appendChild(script); 
// script.textContent = actualCode; 
// (document.head||document.documentElement).appendChild(script); 
// script.remove(); 

安全性不是問題,因爲我只使用我的本地主機。 我在這裏想念什麼?

EDITED

這些是由火狐調試器顯示誤差

Blocked loading mixed active content 「http://localhost/index.php」[Learn More] axtest.js:16 
Content Security Policy: Ignoring 「'unsafe-inline'」 within script-src: ‘strict-dynamic’ specified (unknown) 
Content Security Policy: Ignoring 「https:」 within script-src: ‘strict-dynamic’ specified (unknown) 
Content Security Policy: Ignoring 「http:」 within script-src: ‘strict-dynamic’ specified 
+1

如果您的CSP不允許您訪問遠程腳本,但您想訪問遠程腳本......爲什麼不改變您的CSP? – Quentin

+0

@Silly - 這是CSP而不是CORS。 – Quentin

+0

感謝您的澄清,因此我添加了PHP專有技術。我被跨域ajax調用鏈接弄糊塗了。因此,請使用正確的CSP標題,而不是添加正確的CORS標題。 – Shilly

回答

1

它附加到身體或頭部元件,不是根document

document.body.appendChild(script); 

混合活性含量誤差是由於通過https(SSL)加載初始頁面,然後嘗試加載http(不安全)URL。您可以在沒有https的情況下加載網頁,或者在您要撥打的網址上設置https。

+0

同樣,谷歌工作,本地主機不:(看編輯的錯誤 – user1797147

+0

謝謝,因爲混合協議接受,現在工作 – user1797147

0

儘管我已經接受了答案,但我發現了一個非常簡單的解決方案,適用於我的案例。 這是關於本地瀏覽器安全策略,不需要注入任何JS代碼

首先,插件的manifest.json中必須與此

"permissions": [ 
     "history", 
     "browsingData", 
     "tabs", 
     "<all_urls>", 
     "http://localhost/*", 
     "storage" 
    ] 

二(感謝@Quentin)本地瀏覽器的政策進行更新需要重新配置。通過在about:config菜單中禁用security.csp.enable來關閉整個瀏覽器的CSP。

+0

不知道告訴用戶關閉重要的瀏覽器安全功能是一個「解決方案」 –