基於iframe的CFS(Cross Frame Script)和Clickjacking(點選劫持)攻擊
阿新 • • 發佈:2019-02-13
防止被 FRAME 載入你的網站頁面
1. meta 標籤:很多時候沒有效果,無視
<meta http-equiv="Windows-Target" contect="_top">
2. js 判斷頂層視窗跳轉,可輕易破解,意義不大
function locationTop(){
if (top.location != self.location) {
top.location = self.location;
return false;
}
return true;
}
locationTop();
破解:
// 頂層視窗中放入程式碼var location = document.location; // 或者 var location = "";
【像淘寶前端頁面用的js:
if (top.location != self.location){
top.location = self.location;
}
】
3. header 控制,絕大部分瀏覽器支援
使用 X-Frame-Options 有三個可選的值:
DENY:瀏覽器拒絕當前頁面載入任何Frame頁面
SAMEORIGIN:frame頁面的地址只能為同源域名下的頁面
ALLOW-FROM:允許frame載入的頁面地址
PHP程式碼:
header('X-Frame-Options:Deny');
Nginx配置:
add_header X-Frame-Options SAMEORIGIN
Apache配置:
Header always append X-Frame-Options SAMEORIGIN
具體參見:https://developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options?redirectlocale=en-US&redirectslug=The_X-FRAME-OPTIONS_response_header
註明:
如果是針對 安全掃描 appscan 或者CFCA認證 用的webinspect 這些工具的話掃出來的 Cross_Frame SCRIPT之類的high級別的安全問題,用第三條解決是可以過掃描的。如果不是過工具掃描,上述三中方案都是可行的。
在java中加入header deny方法如下(spring mvc,其他框架大同小異)
@RequestMapping("/login")
public String login(HttpServletRequest request,HttpServletResponse response) {
HttpSession session = request.getSession();
session.invalidate();
response.addHeader("x-frame-options","DENY");
return "login";
}
之所以掃描工具不認前端js跳出frame也是有道理的,畢竟破前端js難度不大