什么是反向代理?如何预防被反向代理?
转自:https://blog.csdn.net/star_yt/article/details/52982407
什么是反向代理?
什么是反向代理?
先说说正向代理的概念:
正向代理,也就是传说中的代理,他的工作原理就像一个跳板。简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器。这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。
结论就是,正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
那么反向代理的概念呢?
比如用户访问 http://www.xxx.com/books/list这个页面,但www.xxx.com实际上并不存在这个页面,他是偷偷从另外一台服务器上取回来,然后作为自己的内容吐给用户。
但用户并不知情,这很正常,用户一般都很笨。这里所提到的 www.xxx.com 这个域名对应的服务器就设置了反向代理功能。
结论就是反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理 的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。
区别 / 总结:
正向代理:客户端知道服务端,通过代理端连接服务端。代理端代理的是客户端。
反向代理:所谓反向,是对正向而言的。服务端知道客户端,客户端不知道服务端,通过代理端连接服务端。代理端代理的是服务端。代理对象恰好相反,故名反向代理
恶意反向代理的危害
网站被恶意反向代理有什么危害呢?这里列举一下:
•首先肯定会占用服务器资源,网站打开速度受影响。
•其次,别人通过代理盗用你的网站数据,对用户与不是那么智能的搜索引擎而言,相当于建了一个与你一模一样的站点,那么很有可能你的站点会进搜索引擎沙箱,甚至被降权。
•如果被恶意代理的页面,还挂有你的联盟广告(比如Adsense),这就十分危险了,如果有人点击了上面的广告,很容易被Adsense封号。
如何预防网站被反向代理?
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
正向代理,也就是传说中的代理,他的工作原理就像一个跳板。简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器。这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。
结论就是,正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
那么反向代理的概念呢?
比如用户访问 http://www.xxx.com/books/list这个页面,但www.xxx.com实际上并不存在这个页面,他是偷偷从另外一台服务器上取回来,然后作为自己的内容吐给用户。
但用户并不知情,这很正常,用户一般都很笨。这里所提到的 www.xxx.com 这个域名对应的服务器就设置了反向代理功能。
结论就是反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理 的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。
区别 / 总结:
正向代理:客户端知道服务端,通过代理端连接服务端。代理端代理的是客户端。
反向代理:所谓反向,是对正向而言的。服务端知道客户端,客户端不知道服务端,通过代理端连接服务端。代理端代理的是服务端。代理对象恰好相反,故名反向代理
恶意反向代理的危害
网站被恶意反向代理有什么危害呢?这里列举一下:
•首先肯定会占用服务器资源,网站打开速度受影响。
•其次,别人通过代理盗用你的网站数据,对用户与不是那么智能的搜索引擎而言,相当于建了一个与你一模一样的站点,那么很有可能你的站点会进搜索引擎沙箱,甚至被降权。
•如果被恶意代理的页面,还挂有你的联盟广告(比如Adsense),这就十分危险了,如果有人点击了上面的广告,很容易被Adsense封号。
如何预防网站被反向代理?
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
禁止网站被别人通过iframe引用嵌套套入
转自:https://aisoa.cn/post-2117.html
由于嵌入iframe的嵌入 使得网站变的更不安全, 如何能防止网页禁止被iframe嵌入呢?
首先看下知名网站使用的方法
<script type="text/javascript">
document.domain="qq.com";var _s_=new Date(),g_T={},siDomain="ctc.qzonestyle.gtimg.cn",g_iUin=499469859,g_iLoginUin=499469859;g_T.fwp=[_s_];document.namespaces&&document.namespaces.add&&(document.namespaces.add('qz', 'http://qzone.qq.com/'),document.namespaces.add('x', 'http://qzone.qq.com/'));var QZFL={};QZFL.event={};QZFL.event.getEvent=function(evt){var evt=window.event||evt,c,cnt;if(!evt&&window.Event){c=arguments.callee;cnt=0;while(c){if((evt=c.arguments[0])&&typeof(evt.srcElement)!="undefined"){break;}else if(cnt>9){break;}c=c.caller;++cnt;}}return evt;};QZFL.event.getTarget=function(evt){var e=QZFL.event.getEvent(evt);if(e){return e.srcElement||e.target;}else{return null;}};var QZFF_M_img_ribr=[];QZFL.media={reduceImgByRule:function(ew,eh,opts,cb){QZFF_M_img_ribr.push(QZFL.event.getTarget());},adjustImageSize:function(w,h,trueSrc,cb,errCallback){QZFF_M_img_ribr.push(QZFL.event.getTarget());},reduceImage:function(){QZFF_M_img_ribr.push(QZFL.event.getTarget());},getImageInfo:function(){QZFF_M_img_ribr.push(QZFL.event.getTarget());}};g_T.fwp[1] = new Date();</script>这个是腾讯QQ空间使用的防嵌套方法
if(window.top !== window.self){ window.top.location = window.location;}这个是淘宝使用的方法
这个要说下,其实今天要介绍,四种防iframe的方法
第一种要说的就是淘宝使用的办法
解决方案一:js方法
<script type="text/javascript">
if(self != top) { top.location = self.location; }
</script>if (self == top) {
    var theBody = document.getElementsByTagName('body')[0];
    theBody.style.display = "block";
} else {
    top.location = self.location;
}上面两种方法都是可以的
把上面的JS代码片段放到你页面的 head 中即可。
要特别说明下这种方法不是很靠谱,可以很轻松使这种方法失效。
只需要添加下面代码使JS代码失效,这种方法就没用了。
<script type="text/javascript" charset="utf-8">
document.write('<iframe seamless sandbox security="restricted" id="url_mainframe" frameborder="0" scrolling="yes" name="main" src="http://aisoa.cn" style="height:100%; visibility: inherit; width: 100%; z-index: 1;overflow: visible;"></iframe>');
</script>//把里面的http://aisoa.cn换成要嵌套的网址解决方案二:Meta标签方法
在需要禁用iframe嵌套的网页head中添加下面代码
<meta http-equiv="X-FRAME-OPTIONS" content="DENY">
以上两种为前端处理方法,就我个人来说不推荐使用,不过这个也是因人而异的,没有绝对的好与差。
解决方案三:PHP方法
<?php header('X-Frame-Options:Deny'); ?>在需要禁用iframe嵌套的PHP网页中添加上面代码
上面这种是后端程序处理方法。
解决方案四:Apache主机方法
配置 Apache 在所有页面上发送 X-Frame-Options 响应头,需要把下面这行添加到 'site' 的配置中:
Header always append X-Frame-Options SAMEORIGIN
解决方案五:Nginx主机方法
配置 nginx 发送 X-Frame-Options 响应头,把下面这行添加到 'http', 'server' 或者 'location' 的配置中:
add_header X-Frame-Options "SAMEORIGIN";
配置 IIS 发送 X-Frame-Options 响应头
添加下面的配置到 Web.config 文件中:
<system.webServer> ... <httpProtocol> <customHeaders> <add name="X-Frame-Options" value="SAMEORIGIN" /> </customHeaders> </httpProtocol> ... </system.webServer>
解决方案六:.htaccess方法
在网站根目录下的.htaccess文件中中加一句
Header append X-FRAME-OPTIONS "SAMEORIGIN"
以上几种解决方案为服务器端解决方案。
使用原生JS修改css属性
修改style样式:
1. 通过document.styleSheets[n] // n表示期望修改的样式表序号,从0开始计数来获取到期望修改的样式表,通过cssRules[0]获取到该样式表的css内容,通过style修改特定样式;
2. 修改特定元素节点的style内容cssText可以一次性修改多个css属性style.attrName 修改单个属性 attrName的值
3. 通过setAttribute 修改style属性值
<style>
.test {font-size: 30px;color: blue;background-color: blueviolet}
</style>
// html
<div class="test" style="height: 100px;">TEST</div>
<button class="cssText">cssText</button>
<button class="setAttribute">setAttribute</button>
<button class="stylesheet ">stylesheet </button>
// js
var testNode = document.getElementsByClassName("test")[0];
var cssTextBtn = document.getElementsByClassName("cssText")[0];
var attributeBtn = document.getElementsByClassName("setAttribute")[0];
var stylesheetBtn = document.getElementsByClassName("stylesheet")[0];
// 1. 修改style样式: 
stylesheetBtn.addEventListener('click', function(e) {
    var stylesheet = document.styleSheets[0];
    stylesheet.cssRules[0].style.backgroundColor = "green";
}, false);
// 2. 修改特定元素节点的style内容
cssTextBtn.addEventListener('click', function(e) {
    testNode.style.cssText = "width: 300px; background-color: red; height: 200px;"
    testNode.style.border = "1px solid black"
}, true);
// 3. 通过setAttribute 修改style属性值
attributeBtn.addEventListener('click', function(e) {
    testNode.setAttribute('style', 'width: 400px; background-color: yellow; height: 300px;')
}, false);
ajax上传-基于html5 FormData的批量文件上传
参考:https://www.cnblogs.com/imwtr/p/5924042.html
转自:https://blog.csdn.net/sinat_34492035/article/details/80477858
不使用FormData,直接用 <input type="file" name="file" multiple> 也可以实现批量上传。本例是ajax方式多个文件同时上传,也可以基于FormData采用ajax循环上传多个文件。更多功能可通过理解下面的原理自行扩展。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        *{margin:0;padding:0;}
        ul{
            list-style:none;
        }
        ul{
            width:700px;
            border:2px solid red;
            padding:10px;
        }
        .clearfix:after{
            display: block;
            content:'';
            overflow: hidden;
            visibility: hidden;
            clear: both;
            height:0;
        }
        .content ul li{
            float:left;
            width:100px;
            height:100px;
            margin:0 10px;
            border:1px solid #ccc;
        }
        .addFile{
            background:url("../img/icon12.png") no-repeat;
            background-position: center center;
        }
        #attach{
            width:100%;
            height:100%;
            opacity:0;
        }
    </style>
</head>
<body>
    <form action="formData_test.php" id="form">
        <div class="content">
            <ul class="clearfix ul-box">
                <li class="addFile">
                    <input type="file" id="attach"  multiple require />
                </li>
            </ul>
        </div>
        <input type="text" name="name"/>
        <input type="text" name="age"/>
        <input type="text" name="sex"/>
        <input type="button" value="上传" class="subBtn"/>
    </form>
</body>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script>
    //定义一个数组 把文件数组的值给新数组  对新数组进行操作  然后把新数组传递给后台
    var curFiles = [];
    $("#attach").change(function(){
        var fileArr = $(this)[0].files;
        Array.prototype.push.apply(curFiles, fileArr);
//      var fileArr = this.files;
        console.log(fileArr);
        //这里展示的话  还是用fileArr
        for(var i=0;i<fileArr.length;i++){
            console.log(fileArr[i]);
            var item = fileArr[i];
            var abc=$("<li class='showf'><p style='overflow:hidden;text-overflow:ellipsis; '>文件名:"+item.name+"</p>"+
                    "<p>大小:"+(item.size/1024).toFixed(2)+"KB</p></li>");
            $(".ul-box").prepend(abc);
        }
//      fileArr.map(function(item,index,arr){
//          var abc=$("<li><p>文件名:"+item.name+"</p>"+
//                  "<p>大小:"+parseInt(item.size/1024)+"KB</p></li>");
//          $(".ul-box").prepend(abc);
//      })
})  
$(".ul-box").on("click",".showf",function(){
    var index = $(".showf").index($(this));
    alert(index);
    var name = $(this).find("p").eq(0).html();
    console.log(curFiles);
//  curFiles = curFiles.filter(function(file) {
//      return file.name != name;
//  });
    curFiles.splice(index,1)
    console.log(curFiles);
    $(this).remove();
})
$(".subBtn").click(function(){
    // 构建FormData对象
    var fd = new FormData($('#form')[0]);
    for (var i = 0, j = curFiles.length; i < j; ++i) {
        fd.append('attach[]', curFiles[i]);
    }
    for(var pair of fd.entries()) {
       console.log(pair[0]+ ', '+ pair[1]); 
    }
    $.ajax({
        url: 'formData_test.php',
        type: 'post',
        data: fd,
        processData: false,
        contentType: false,
        success: function(rs) {
            console.log(rs);
        },
        error: function(err) {
        }
    });
})
</script>
</html>
formData_test.php源码:
<?php $files = $_FILES['attach']; var_dump($files); ?>
上传前图片预览
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<input type="file">
<script>
$('input[type=file]').change(function(){
    var file=this.files[0];
    var reader=new FileReader();
    reader.onload=function(){
        // 通过 reader.result 来访问生成的 DataURL
        var url=reader.result;
        setImageURL(url);
    };
    reader.readAsDataURL(file);
});
var image=new Image();
function setImageURL(url){
    image.src=url;
}
$(image).appendTo($('body'));
</script>
vue学习路线
新手:Vue 2.0 的建议学习顺序 https://zhuanlan.zhihu.com/p/23134551
Vue技术内幕 http://hcysun.me/vue-design/
Vue.js技术揭秘 https://ustbhuangyi.github.io/vue-analysis/
Vue 3.0 动态核心概述 https://msd.misuland.com/pd/3255817963235705746
电子相册
电子书、电子杂志参考 官网 https://www.fliphtml5.com/ 云展网企业宣传册制作:https://www.yunzhan365.com/ https://book.yunzhan365.com/pteyi/dckd/mobile/index.html https://book.yunzhan365.com/rvdk/vggc/mobile/index.html
photoswipe兼容手机版,支持拖动、缩放
https://github.com/dimsemenov/photoswipe
fancybox 不支持拖动、缩放





使用jquery.qrcode.js生成二维码-支持中英文混合输入
官网:https://larsjung.de/jquery-qrcode/
github:https://github.com/lrsjng/jquery-qrcode
演示:https://larsjung.de/jquery-qrcode/latest/demo/
<div id="qrcodeTable"></div>
<img id="logoimg" src="logo.png">
<script>
$('#qrcodeTable').qrcode({
    // render method: 'canvas', 'image' or 'div'
    render: 'image',
    // version range somewhere in 1 .. 40
    minVersion: 1,
    maxVersion: 40,
    // error correction level: 'L', 'M', 'Q' or 'H'
    ecLevel: 'L',
    // offset in pixel if drawn onto existing canvas
    left: 0,
    top: 0,
    // size in pixel
    size: 200, //二维码尺寸
    // code color or image element
    fill: '#000', //二维码颜色
    // background color or image element, null for transparent background
    background: '#fff', //背景色
    // content
    text: '汉a字',
    // corner radius relative to module width: 0.0 .. 0.5
    radius: 0,
    // quiet zone in modules
    quiet: 2, //可理解为css的padding,大小为quiet*6像素
    // modes
    // 0: normal 无文字、无logo
    // 1: label strip
    // 2: label box 显示文字
    // 3: image strip
    // 4: image box 显示logo
    mode: 4,
    mSize: 0.1, //logo尺寸
    mPosX: 0.5, //logo位置
    mPosY: 0.5,
    label: 'hello', //使用文字代替logo
    fontname: 'sans',
    fontcolor: '#000',
    image: null, //$('#logoimg')[0]
});
</script>
<script>
$('#qrcodeTable').qrcode({
    render: 'image', //canvas|image|div
    size: 200, //二维码尺寸
    text: '汉a字',
    quiet: 2, //可理解为css的padding,大小为quiet*6像素
});
</script>
encodeURI、encodeURIComponent、escape
decodeURI() 函数可对 encodeURI() 函数编码过的 URI 进行解码
<script>
var s = encodeURI('http://www.baidu.com/s?wd=你好');
document.write(s+'<br>');  //http://www.baidu.com/s?wd=%E4%BD%A0%E5%A5%BD
s = 'http://www.baidu.com/s?wd='+encodeURI('你好');
document.write(s+'<br>');  //http://www.baidu.com/s?wd=%E4%BD%A0%E5%A5%BD
document.write(decodeURI('http://www.baidu.com/s?wd=%E4%BD%A0%E5%A5%BD'));  //http://www.baidu.com/s?wd=你好
</script>
在使用url进行参数传递时,经常会传递一些中文名的参数或URL地址,在后台处理时会发生转换错误。在有些传递页面使用GB2312,而在接收页面使用UTF8,这样接收到的参数就可能会与原来发生不一致。使用服务器端的urlEncode函数编码的URL,与使用客户端javascript的encodeURI函数编码的URL,结果就不一样。
javaScript中的编码方法:
escape() 方法:采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。比如,空格符对应的编码是%20。unescape方法与此相反。不会被此方法编码的字符: @ * / +
encodeURI() 方法:
把URI字符串采用UTF-8编码格式转化成escape格式的字符串。不会被此方法编码的字符:! @ # $& * ( ) = : / ; ? + '
encodeURIComponent() 方法:
把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码,比如 / 等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编码之后URL将显示错误。不会被此方法编码的字符:! * ( )
因此,对于中文字符串来说,如果不希望把字符串编码格式转化成UTF-8格式的(比如原页面和目标页面的charset是一致的时候),只需要使用escape。如果你的页面是GB2312或者其他的编码,而接受参数的页面是UTF-8编码的,就要采用encodeURI或者encodeURIComponent。
另外,encodeURI/encodeURIComponent是在javascript1.5之后引进的,escape则在javascript1.0版本就有。
decodeURIComponent -- 解码encodeURIComponent函数编码的字符串
iscroll仿系统滚动插件
http://caibaojian.com/iscroll-5/
https://segmentfault.com/a/1190000003113280
https://blog.csdn.net/amyloverice/article/details/79383712
http://www.jq22.com/jquery-info13446
CDN https://www.bootcdn.cn/iScroll/
 
			
		