2017-05-13 55 views
1

我們正在創建一個嚴格的內容安全策略(https://csp.withgoogle.com/docs/strict-csp.html),這需要Apache在每次請求資源時創建一個隨機數,以便我們可以插入nonce放入http頭中。使用Apache 2.4生成隨機數(適用於內容安全策略標頭)

我們如何使用Apache 2.4創建一個隨機數?

我讀過的所有與CSP相關的文檔都說明了「一個隨機數就是服務器上生成的一個隨機字符串,包含在CSP頭中......」,但沒有找到任何信息關於如何用Apache做到這一點。我們當然可以使用應用程序代碼來做到這一點,但通過Apache來做這件事似乎是一個更清晰的解決方案/將確保每一個頁面獲得CSP標題。

回答

0

必須將隨機數插入具有內聯CSS和/或Javascript處理程序的任何元素,因此必須將其插入應用程序層。

解析輸出HTML並插入nonces會打敗CSP隨機數的整個目的 - Web服務器無法知道內聯CSS/JS應該存在,還是被攻擊者插入。

+0

在Apache中,您可以通過SetEnv VARIABLE_NAME variable_value來定義可以在應用程序層使用的服務器變量。同樣,Nginx中的隨機數:https://scotthelme.co.uk/csp-nonce-support-in-nginx/ – KayakinKoder

+0

如果我理解你關於解析HTML的觀點,我不是100%確定的,但mod_unique_id看起來好像可能會訣竅? 1.)apache通過mod_unique_id生成一個隨機字符串,並創建一個名爲UNIQUE_ID的環境變量2.)我們將它插入我們的CSP頭(不確定如何實際執行)3.)在我們的應用程序代碼中,在需要的地方添加nonce,在PHP中,這將通過$ _SERVER ['UNIQUE_ID'] 這似乎是安全的嗎?我不確定我是否完全理解你關於解析html /插入隨機數的觀點。謝謝 – KayakinKoder

+0

@KayakinKoder這似乎過於複雜。在應用程序中生成隨機數會更容易,並且可以自己將其插入到標題中。不需要涉及Web服務器。 – duskwuff

2

找到mod_unique_id後,這很容易(http://httpd.apache.org/docs/current/mod/mod_unique_id.html)。

1.)啓用mod_unique_id。這通常是在httpd.conf一行: 的LoadModule unique_id_module模塊/ mod_unique_id.so

2)mod_unique_id生成一個唯一的字符串(見user3526609的答案,這可能會或可能不會給你足夠的隨機)和服務器變量UNIQUE_ID設置爲與每個頁面請求中的隨機字符串相同,然後您可以將其注入到您的CSP和您需要列入白名單的任何內嵌代碼中。如果你碰巧使用Php,$ _SERVER ['UNIQUE_ID'];

3

我寧願只是簡單地將此添加爲評論,但我的名譽< 50不允許它,所以我發佈此作爲一個答案,而不是。

迴應:

1)阿帕奇產生通過mod_unique_id一個隨機字符串

這是一個「獨一無二」的值不是「隨機」的價值,所以你可能想謹慎使用它作爲CSP隨機數。

2)我們這個插入到我們的CSP頭(不知道如何做到這一點其實)

<IfModule mod_headers.c> 
    <FilesMatch "\.(htm|html|php)$"> 
     Content-Security-Policy: script-src 'strict-dynamic' 'nonce-%{UNIQUE_ID}e' 'unsafe-inline' ' https:; 
    </FilesMatch> 
</IfModule> 

我希望這有助於。

+1

謝謝是的「隨機」是一個非常強大的詞應該很少使用,我編輯了我的答案。感謝這個例子,這是完全正確的。 – KayakinKoder