網站安全設置:會話cookie中缺少HttpOnly屬性的修復
缺少 HttpOnly 屬性的Cookie很容易被跨站腳本(XSS)攻擊竊取,從而導致用戶會話被劫持。
HttpOnly 屬性的核心作用是:阻止客戶端的JavaScript代碼通過 [xss_clean] API訪問被標記的Cookie。這樣,即使網站存在XSS漏洞,攻擊者也無法輕易竊取用戶的會話標識符。
在開始之前,請記住一個核心原則:HttpOnly 屬性應該在服務器端設置會話Cookie時直接添加到 Set-Cookie 響應頭中。 最佳實踐是在應用程序代碼或Web服務器配置中全局設置。
下面我們分別講解在IIS、Nginx和Apache下如何修復此漏洞。
Microsoft IIS 下的修復方法
方法一:在web.config文件中配置(推薦,適用于ASP.NET應用程序)
在網站的根目錄找到或創建 web.config 文件,并添加如下配置:
<configuration> <system.web> <!-- 為ASP.NET會話Cookie設置HttpOnly --> <sessionState cookieHttpOnly="true" /> <!-- 為所有ASP.NET創建的Cookie(如Forms Authentication cookie)設置HttpOnly --> <httpCookies httpOnlyCookies="true" /> </system.web> </configuration>
方法二:使用IIS的URL重寫模塊設置響應頭(通用方法)
如果上述方法不生效,或者你需要為非ASP.NET應用程序(如PHP)設置,可以使用強大的 IIS URL重寫模塊 作為出站規則來修改響應頭。
1 :安裝URL重寫模塊(如果尚未安裝)。
2 :在IIS管理器中選中網站,打開 “URL重寫” 功能。
3 :在右側 操作 面板中,點擊 “添加規則...”。
4 :選擇 “出站規則” 模板下的 “空白規則”。
5 :配置規則:
·名稱: Set HttpOnly Flag on Session Cookie
·匹配范圍: 選擇 響應 -> Set-Cookie 頭
·條件:添加一個條件,例如匹配包含會話Cookie名稱(如 ASP.NET_SessionId)的模式。
·操作:重寫
·操作屬性:
重寫值: {R:1}; HttpOnly (這需要在模式中捕獲Cookie原有的內容)
服務器變量: 不需要設置。
這種模式相對復雜,需要編寫正則表達式來匹配和重寫 Set-Cookie 頭。例如,一個簡單的規則可能是查找不以 HttpOnly 結尾的特定Cookie,然后為其追加 ; HttpOnly。
Nginx 下的修復方法
Nginx本身不直接生成會話Cookie,但它可以作為反向代理,在將響應發送給客戶端之前修改后端應用(如PHP、Python、Java等)返回的 Set-Cookie 頭。這是最推薦的Nginx配置方式。
在你的 server 或 location 配置塊中,使用 proxy_cookie_path 指令或 more_set_headers 指令。
方法一:使用 proxy_cookie_path(針對特定路徑的Cookie,推薦)
這個指令非常適合為代理的Cookie添加 HttpOnly 和 Secure 屬性。
server { listen 80; server_name your_domain.com; location / { proxy_pass http://your_backend_app_server; # 為所有從后端來的Cookie添加HttpOnly和Secure屬性 proxy_cookie_flags ~ secure httponly; # 如果你的應用在子路徑下,可能需要調整cookie路徑 # proxy_cookie_path / "/; secure; HttpOnly"; } }
方法二:使用 more_set_headers 指令(更強大靈活)
這需要先安裝 ngx_headers_more 模塊。它可以讓你直接操作HTTP頭。
server { listen 80; server_name your_domain.com; location / { proxy_pass http://your_backend_app_server; # 使用正則表達式匹配Set-Cookie頭,如果不存在HttpOnly則添加 more_set_headers ‘Set-Cookie: $http_set_cookie; HttpOnly’; } }
一個更安全的寫法是同時添加 HttpOnly 和 Secure(假設使用HTTPS):
more_set_headers ‘Set-Cookie: $http_set_cookie; HttpOnly; Secure’;
最重要的建議:最佳實踐是在你的應用程序框架(如Django, Spring, Express.js等)中直接設置 HttpOnly 屬性,因為這是最可靠的地方。Nginx的配置應作為一道額外的安全防線。
Apache HTTP Server 下的修復方法
Apache可以通過 mod_headers 模塊來修改HTTP響應頭。
1:確保 mod_headers 模塊已啟用。
在Ubuntu/Debian上,通常使用 sudo a2enmod headers 然后重啟Apache。
在CentOS/RHEL上,確認 httpd.conf 或模塊配置目錄中有 LoadModule headers_module modules/mod_headers.so。
2:在虛擬主機配置(<VirtualHost>)或目錄配置(<Directory>)或全局配置(httpd.conf)中,使用 Header 指令。
<VirtualHost *:80> ServerName your_domain.com DocumentRoot /var/www/html # 方法一:編輯已有的Set-Cookie頭,為其追加HttpOnly屬性 # 這個規則會查找所有Set-Cookie頭,如果值中不包含"HttpOnly",就為其加上 Header always edit Set-Cookie ^(.*)$ "$1; HttpOnly" # 方法二:直接設置或覆蓋(不夠靈活,可能會重復添加屬性,不推薦) # Header always set Set-Cookie HttpOnly # 強烈建議同時設置Secure屬性(如果使用HTTPS) # Header always edit Set-Cookie ^(.*)$ "$1; HttpOnly; Secure" </VirtualHost>
always 參數表示無論響應代碼是什么,都應用此頭設置。
edit 操作使用正則表達式來修改已存在的頭信息。^(.*)$ 匹配整個Cookie值,然后用 $1 引用它,并追加 ; HttpOnly。
重要提示:與方法二的Nginx配置一樣,這同樣是一道安全防線。最根本的解決方案仍然是在你的應用程序(如PHP、Python等)中正確設置Cookie屬性。
對于PHP:在 php.ini 中設置 session.cookie_httponly = 1,或者在代碼中使用 session_set_cookie_params 或 ini_set。
ini_set(‘session.cookie_httponly’, 1); session_start();
對于Java Servlet 3.0+: 在 web.xml 中配置:
<session-config> <cookie-config> <http-only>true</http-only> </cookie-config> </session-config>
修復后的驗證:
完成配置后,務必重啟相應的Web服務(IIS, Nginx, Apache),然后使用瀏覽器的開發者工具(F12)。
訪問你的網站并登錄。
打開 開發者工具 -> 網絡(Network) 標簽頁。
找到包含 Set-Cookie 頭的HTTP響應(通常是登錄請求或第一個頁面請求)。
檢查 Set-Cookie 頭,確認其中包含了 HttpOnly 標志。
通過以上步驟,你就可以有效地修復會話Cookie缺少 HttpOnly 屬性的安全漏洞。
上一篇:用ffmpeg修改MP4文件頭信息讓視頻邊加載邊播放
下一篇:Nginx配置:只允許本站調用站內的mp4視頻,禁止外部下載