Tôi đã đặt cookie .ASPXAUTH thành chỉ https nhưng tôi không chắc cách thực hiện hiệu quả điều tương tự với ASP.NET_SessionId.
Toàn bộ trang web sử dụng HTTPS nên không cần cookie hoạt động với cả http và https.
Tôi đã đặt cookie .ASPXAUTH thành chỉ https nhưng tôi không chắc cách thực hiện hiệu quả điều tương tự với ASP.NET_SessionId.
Toàn bộ trang web sử dụng HTTPS nên không cần cookie hoạt động với cả http và https.
Đây là đoạn mã được lấy từ một bài báo trên blog được viết bởi Anubhav Goyal :
// this code will mark the forms authentication cookie and the
// session cookie as Secure.
if (Response.Cookies.Count > 0)
{
foreach (string s in Response.Cookies.AllKeys)
{
if (s == FormsAuthentication.FormsCookieName || "asp.net_sessionid".Equals(s, StringComparison.InvariantCultureIgnoreCase))
{
Response.Cookies[s].Secure = true;
}
}
}
Thêm điều này vào trình xử lý sự kiện EndRequest trong global.asax sẽ làm cho điều này xảy ra cho tất cả các lệnh gọi trang.
Lưu ý: Một chỉnh sửa đã được đề xuất để thêm một break;
câu lệnh bên trong một nhiệm vụ "an toàn" thành công. Tôi đã từ chối chỉnh sửa này dựa trên ý tưởng rằng nó sẽ chỉ cho phép một trong các cookie được buộc phải bảo mật và chỉnh sửa thứ hai sẽ bị bỏ qua. Việc thêm một bộ đếm hoặc một số chỉ số khác để xác định rằng cả hai đã được bảo mật và phá vỡ tại điểm đó là điều không thể tưởng tượng được.
Để thêm ; secure
hậu tố vào Set-Cookie
tiêu đề http, tôi chỉ cần sử dụng <httpCookies>
phần tử trong web.config:
<system.web>
<httpCookies httpOnlyCookies="true" requireSSL="true" />
</system.web>
IMHO tiện dụng hơn nhiều so với việc viết mã như trong bài viết của Anubhav Goyal.
Xem: http://msdn.microsoft.com/en-us/library/ms228262(v=vs.100).aspx
Đi với giải pháp của Marcel ở trên để bảo mật cookie Xác thực Mẫu, bạn cũng nên cập nhật phần tử cấu hình "xác thực" để sử dụng SSL
<authentication mode="Forms">
<forms ... requireSSL="true" />
</authentication>
Cookie xác thực khôn ngoan khác sẽ không phải là https
Xem: http://msdn.microsoft.com/en-us/library/vstudio/1d3t3c61(v=vs.100).aspx
Nhận thấy rằng việc đặt thuộc tính bảo mật trong Session_Start là đủ, như được khuyến nghị trong blog MSDN " Bảo mật ID phiên: ASP / ASP.NET " với một số phần bổ sung.
protected void Session_Start(Object sender, EventArgs e)
{
SessionStateSection sessionState =
(SessionStateSection)ConfigurationManager.GetSection("system.web/sessionState");
string sidCookieName = sessionState.CookieName;
if (Request.Cookies[sidCookieName] != null)
{
HttpCookie sidCookie = Response.Cookies[sidCookieName];
sidCookie.Value = Session.SessionID;
sidCookie.HttpOnly = true;
sidCookie.Secure = true;
sidCookie.Path = "/";
}
}
Thêm vào giải pháp của @ JoelEtherton để sửa một lỗ hổng bảo mật mới được tìm thấy. Lỗ hổng này xảy ra nếu người dùng yêu cầu HTTP và được chuyển hướng đến HTTPS, nhưng cookie sessionid được đặt là an toàn trong yêu cầu đầu tiên tới HTTP. Đó hiện là một lỗ hổng bảo mật, theo McAfee Secure.
Mã này sẽ chỉ bảo mật cookie nếu yêu cầu sử dụng HTTPS. Nó sẽ hết hạn cookie sessionid, nếu không phải HTTPS.
// this code will mark the forms authentication cookie and the
// session cookie as Secure.
if (Request.IsSecureConnection)
{
if (Response.Cookies.Count > 0)
{
foreach (string s in Response.Cookies.AllKeys)
{
if (s == FormsAuthentication.FormsCookieName || s.ToLower() == "asp.net_sessionid")
{
Response.Cookies[s].Secure = true;
}
}
}
}
else
{
//if not secure, then don't set session cookie
Response.Cookies["asp.net_sessionid"].Value = string.Empty;
Response.Cookies["asp.net_sessionid"].Expires = new DateTime(2018, 01, 01);
}
Nó cũng đáng xem xét:
__Secure-, which signals to the browser that the Secure attribute is required.
__Host-, which signals to the browser that both the Path=/ and Secure attributes are required, and at the same time, that the Domain attribute must not be present.
Một bài báo hay về lý do tại sao điều này lại hữu ích
https://check-your-website.server-daten.de/prefix-cookies.html
Thay vì sử dụng những cái tên xác định rõ ràng ngôn ngữ lập trình.
ví dụ
ASP.NET_SessionId = __Secure-SID
sameSite="Lax"
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
requireSSL="true"
<sessionState cookieless="false" cookieName="__Secure-SID" cookieSameSite="Lax" />
<httpCookies httpOnlyCookies="true" sameSite="Lax" requireSSL="true" />
Nếu toàn bộ trang web sử dụng HTTPS, thì ít nhất cookie sessionId của bạn cũng an toàn như mã hóa HTTPS. Điều này là do cookie được gửi dưới dạng tiêu đề HTTP và khi sử dụng SSL, tiêu đề HTTP được mã hóa bằng SSL khi truyền.