[原創(chuàng)]X-Frame-Options ALLOW-FROM 無效
這個特性主要是為了防止黑客對網(wǎng)站XSS攻擊,偽造一個假的iframe欺騙客戶點(diǎn)擊或提交數(shù)據(jù),從而獲得敏感數(shù)據(jù)的。但是搞不好,會將本網(wǎng)站的IFRAME也會屏蔽掉,非常討厭。如下的代碼就會出現(xiàn)這個問題。
context.HttpContext.Response.Headers.Add("X-Frame-Options", "allow-from http://zj.qhwins.com");
//同時,這種寫法在Edge瀏覽器中報(bào)如下錯誤
谷歌瀏覽器較新版不支持ALLOW-FROM,我們更好的寫法是將允許的站點(diǎn)添加進(jìn)去,如下所示
app.Use(async (context, next) =>
{
context.Response.Headers.Add("X-Frame-Options", "ALLOW-FROM http://localhost:8080 http://localhost:8088");
await next();
});
其實(shí)以上是老式淘汰的寫法,用以下新的方法代替
//解決iframe安全問題
app.Use(async (context, next) =>
{
string host= context.Request.Host.Host+context.Request.Host.Port;
context.Response.Headers.Add("Content-Security-Policy", "frame-ancestors *."+host+":80 "+host+":*;");
await next();
});
注意:如果只放新式的,可能安全掃描器依然會報(bào)警,如下圖:
可以將兩個同時放上,
//解決iframe安全問題 app.Use(async (context, next) => { try { string host = context.Request.Host.Host; var kv = new KeyValuePair<string,Microsoft.Extensions.Primitives.StringValues>("X-Frame-Options", "ALLOW-FROM http://"+host+":*"); if (context.Response.Headers.Contains(kv)==false) { context.Response.Headers.Add(kv); } kv = new KeyValuePair<string, Microsoft.Extensions.Primitives.StringValues>("Content-Security-Policy", "frame-ancestors *."+host+":* "+host+":*;"); if (context.Response.Headers.Contains(kv)==false) { context.Response.Headers.Add(kv); } } catch (Exception ex) { throw new Exception(ex.Message+ex.InnerException); } await next(); });
放上以后在瀏覽器中打開URL請求,查看報(bào)文,有以下返回
注意,Response Header中多了兩行:
Content-Security-Policy 和 X-Frame-Options
現(xiàn)在同域名下iframe已經(jīng)可以打開了,安全掃描器也不報(bào)警了,安全掃描結(jié)果如下:
另一個Session Cookie without Secure flag set 安全警告則是因?yàn)闆]有使用HTTPS協(xié)議引起的,那是另一個問題,與這個沒關(guān)系了。問題已完全解決。