nginx设置X-Frame-Options防止自己的网站被其他人iframe引入
本文介绍nginx设置X-Frame-Options属性,防止网站被别人用iframe嵌入使用。兼容大部分浏览器。
背景说明:在项目开发中,单独用了一台服务器进行图片保存,网站上所有的上传图片都放在了这台服务器上。基于这个需求我在这台服务器上开发了上传功能,图片上传成功后返回地址,然后把地址保存在数据库中。
使用方法:在需要上传图片的地方用iframe引入上传页面,进行上传。
出现问题:所有人都可以引入我这个iframe 页面把图片上传到我服务器。
解决方法:只允许我的域名或者网站才能引入iframe页面上传,有且只能是引入上传,不允许直接访问。这样就保证此iframe只有本服务器使用,其他人无权限。实现该功能需要在nginx配置中添加同源策略限制。
在nginx.conf配置的server中添加代码,可以在http中也可以在server中:
#设置iframe允许的域名访问,X-Frame-Options值有四种情况可以百度
add_header X-Frame-Options 'ALLOW-FROM www.baidu.com m.baidu.com';
#谷歌火狐浏览器识别不了上面的header,经过百度需要以下设置才可以
add_header Content-Security-Policy 'www.baidu.com m.baidu.com';
为了防止浏览器访问,并且必须是自己网站引入,在server中进行referer判断添加以下代码:
#防盗链判断,valid_referers 有多种判断,可以百度
valid_referers *.baidu.com;
if ($invalid_referer) {
return 403;
}
以上就是nginx设置网页只允许指定的页面使用iframe进行引入
上传图片页面html代码如下:
<html>
<head>
<title>上传</title>
<meta charset="utf-8">
<script>
document.domain="baidu.com";
</script>
</head>
<body>
<iframe name="myupiframe" id="myupiframe" style="display:none;"></iframe>
<form action="./sc.php" id="myform" method="post" enctype="multipart/form-data" target="myupiframe">
<input type="file" id="ycfile" name="ycfile" onchange="uploadimg(this)">
<input type="hidden" id="tupianlujing" name="tupianlujing" value="">
<div id="ycshowimg">
</div>
</form>
<script>
function opennewimg(img) {
window.top.open(img);
}
function showmsg(msg,type=0)
{
if (type==0) {
alert(msg);
return false;
} else {
var showimg = "<img οnclick='opennewimg(\""+msg+"\")' src='"+ msg +"' style='width:100px;height: 100px;'>";
document.getElementById('ycshowimg').innerHTML = showimg;
document.getElementById('tupianlujing').value = msg;
}
}
function uploadimg(obj) {
if (!obj) {
alert("请选择您要上传的图片");
return false;
}
var newfiles = new Array();
var files= document.getElementById('ycfile').files;
if (files.length>1) {
alert("每次可以上传一张图片");
return false;
}
let file = files[0];
var suffix = file.name.substr(file.name.lastIndexOf("."));
var fileTypes = '.png;.jpg;.jpeg;.gif;.bmp';
if(fileTypes.indexOf(suffix)==-1){
alert("只支持图片上传")
return;
}
if(file.size>2*1024*1024){
alert("图片大小限制为2M")
return;
}
document.getElementById("myform").submit();
}
</script>
</body>
</html>
php处理上传文件代码如下:
$file = isset($_FILES['ycfile']) ? $_FILES['ycfile'] : ''; //上传图片
if(empty($file))
{
exit("<script>document.domain='baidu.com';window.parent.showmsg('请选择上传的文件.',0);</script>");
}
exit("<script>document.domain='baidu.com';window.parent.showmsg('http://www.baidu.com/1.jpg',1);</script>");