王新阳

wangxinyang

什么是反向代理?如何预防被反向代理?

转自: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封号。

如何预防网站被反向代理?

JS 代码预防
<script type="text/javascript">
if (document.domain != 'xxx.com' && document.domain != 'www.xxx.com'){
 window.location.href='http://www.xxx.com/';
}
</script>


PHP 代码预防
$url = $_SERVER['SERVER_NAME'];
if( $url!= 'xxx.com' || $url!= 'www.xxx.com' ) 
{
 echo '非法反向代理访问';
 //header('Location: http://www.xxx.com/');
 exit;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
    , Roboto, Noto, Arial, , sans-serif; font-size: 16px; color: rgb(77, 77, 77); line-height: 26px; overflow-wrap: break-word;">先说说正向代理的概念:

    正向代理,也就是传说中的代理,他的工作原理就像一个跳板。简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器。这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。

    结论就是,正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

    那么反向代理的概念呢?

    比如用户访问 http://www.xxx.com/books/list这个页面,但www.xxx.com实际上并不存在这个页面,他是偷偷从另外一台服务器上取回来,然后作为自己的内容吐给用户。

    但用户并不知情,这很正常,用户一般都很笨。这里所提到的 www.xxx.com 这个域名对应的服务器就设置了反向代理功能。

    结论就是反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理 的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。

    区别 / 总结:

    正向代理:客户端知道服务端,通过代理端连接服务端。代理端代理的是客户端。
    反向代理:所谓反向,是对正向而言的。服务端知道客户端,客户端不知道服务端,通过代理端连接服务端。代理端代理的是服务端。代理对象恰好相反,故名反向代理

    恶意反向代理的危害

    网站被恶意反向代理有什么危害呢?这里列举一下:

    •首先肯定会占用服务器资源,网站打开速度受影响。
    •其次,别人通过代理盗用你的网站数据,对用户与不是那么智能的搜索引擎而言,相当于建了一个与你一模一样的站点,那么很有可能你的站点会进搜索引擎沙箱,甚至被降权。
    •如果被恶意代理的页面,还挂有你的联盟广告(比如Adsense),这就十分危险了,如果有人点击了上面的广告,很容易被Adsense封号。

    如何预防网站被反向代理?

    JS 代码预防
    <script type="text/javascript">
    if (document.domain != 'xxx.com' && document.domain != 'www.xxx.com'){
     window.location.href='http://www.xxx.com/';
    }
    </script>
    
    
    PHP 代码预防
    $url = $_SERVER['SERVER_NAME'];
    if( $url!= 'xxx.com' || $url!= 'www.xxx.com' ) 
    {
     echo '非法反向代理访问';
     //header('Location: http://www.xxx.com/');
     exit;
    }
    
    • 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"

      以上几种解决方案为服务器端解决方案。

      解决$GLOBALS["HTTP_RAW_POST_DATA"]获取不到数据的问题

      转自hpugym的CSDN:https://blog.csdn.net/hpugym/article/details/54969457

      昨天在微信中公众号开发中使用$GLOBALS["HTTP_RAW_POST_DATA"]来获取微信公众平台推送过来的post数据,结果惊奇的发现微信号总是提示“该微信公众号暂时无法提供服务”,仔细去检查代码,也没错,可就是无法提供服务。今天又检查了一把,还是没有语法错误,于是乎,我将中间的所有数据全部写到的记事本里去,通过及时本发现$GLOBALS["HTTP_RAW_POST_DATA"]获取的数据是空的。经过资料查找,终于发现了解决的套路:

      $GLOBALS ["HTTP_RAW_POST_DATA"]跟$_POST,file_get_contents('php://input') 差不多,用$GLOBALS ["HTTP_RAW_POST_DATA"]或file_get_contents('php://input')的情况大多是为了获取$_POST无法接收的数据类型(如XML数据)

      在$GLOBALS ["HTTP_RAW_POST_DATA"]取不到值的情况下可以按以下方式排查:
      1、用file_get_contents('php://input')获取数据。如果获取不到,则可能是数据传输错误,对请求进行捉包,分析数据。
      2、如果file_get_contents('php://input')有数据。则查看php.ini配置文件。

      找到如下,如果没开启则开启

      always_populate_raw_post_data = On

      注意:这种处理方式是在php版本较低的时候,在php-ini中才有的配置,当版本升级到7,或者更高的时候该机制就被废弃掉了。

      下边归纳几种php获取post数据的方式:

      RPC 规定接收取值方式 $GLOBALS['HTTP_RAW_POST_DATA'];
      PHP默认识别的数据类型是application/x-www.form-urlencoded标准的数据类型。

      1、$_POST['paramName']
      只能接收Content-Type: application/x-www-form-urlencoded提交的数据,php会将http请求body相应数据会 填入到数组$_POST,填入到$_POST数组中的数据是进行urldecode()解析的结果。(其实,除了该Content-Type,还有 multipart/form-data表示数据是表单数据)

      2、file_get_contents("php://input")
      适用大多数类型的Content-type,php://input 允许读取 POST 的原始数据。和 $HTTP_RAW_POST_DATA 比起来,它给内存带来的压力较小,并且不需要任何特殊的 php.ini 设置。php://input 不能用于 enctype="multipart/form-data"。

      3、$GLOBALS['HTTP_RAW_POST_DATA'];
      总是产生 $HTTP_RAW_POST_DATA  变量包含有原始的 POST 数据。此变量仅在碰到未识别 MIME 类型的数据时产生。$HTTP_RAW_POST_DATA  对于 enctype="multipart/form-data"  表单数据不可用。

      如果post过来的数据不是PHP能够识别的,你可以用 $GLOBALS['HTTP_RAW_POST_DATA']来接收,比如 text/xml 或者 soap 等等。需要设置php.ini中的always_populate_raw_post_data值为On,PHP才会总把POST数据填入变量$http_raw_post_data。

      1,Coentent-Type仅在取值为application/x-www-data-urlencoded和multipart/form- data两种情况下,PHP才会将http请求数据包中相应的数据填入全局变量$_POST
      2,PHP不能识别的Content-Type类型的时候,会将http请求包中相应的数据填入变量$HTTP_RAW_POST_DATA
      3, 只有Coentent-Type不为multipart/form-data的时候,PHP不会将http请求数据包中的相应数据填入php: //input,否则其它情况都会。填入的长度,由Coentent-Length指定。
      4,只有Content-Type为application/x-www-data-urlencoded时,php://input数据才 跟$_POST数据相一致。
      5,php://input数据总是跟$HTTP_RAW_POST_DATA相同,但是php://input 比$HTTP_RAW_POST_DATA更凑效,且不需要特殊设置php.ini
      6,PHP会将PATH字段的query_path部分,填入全局变量$_GET。通常情况下,GET方法提交的http请求,body为空。

      总之:
      1、如果是 application/x-www-form-urlencoded 和 multipart/form-data 格式 用 $_POST;
      2、如果不能获取的时候比如 text/xml、application/json、soap,使用 file_get_contents('php://input');

      curl: (35) Unknown SSL protocol error in connection to abc.com:443

      curl: (35) Unknown SSL protocol error in connection to abc.com:443

      出现此错误可能的原因:

      1、PHP版本过低,我从php5.6升级到php7.2

      2、对于访问https链接,添加跳过验证对等证书和域名

      if(strpos(strtolower($url), 'https://')===0){
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //https请求时跳过cURL验证对等证书
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //https请求时跳过cURL验证域名
      }
      


      http访问跳转至https

      网站安装SSL证书后,未https访问根据端口判断,并自动转至https

      if($_SERVER['SERVER_PORT']=='80'){
          header("Location: https://www.abc.com".$_SERVER['REQUEST_URI']);
          exit;
      }
      

      增加对域名的判断

      switch(strtolower($_SERVER['SERVER_NAME'])){
          case 'abc.com':
              if($_SERVER['SERVER_PORT']=='80'){
                  header("Location: https://www.abc.com".$_SERVER['REQUEST_URI']);
                  exit;
              }
              break;
      }

      对是否为https方式访问的判断,不能单纯靠 $_SERVER['SERVER_PORT']=='80
      建议方法:

      function is_https() {
      	if(isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT']==='443'){
      		return true;
      	}elseif( !empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off'){
      		return true;
      	}elseif( !empty($_SERVER['HTTP_FROM_HTTPS']) && strtolower($_SERVER['HTTP_FROM_HTTPS']) !== 'off'){ //西部数码
      		return true;
      	}else{
      		return false;
      	}
      }
      

      使用.htaccess重定向

      RewriteEngine On
      RewriteCond %{HTTP:From-Https} !^on$ [NC]
      RewriteCond %{HTTP_HOST} ^(www.)?abc.com$ [NC]
      RewriteRule ^(.*)$ https://www.abc.com/$1 [R=301,L]
      


      PHP进制转换

      常见的进制:
      二进制      binary -->  bin
      八进制      octal   -->  oct
      十进制      decimal -->  dec
      十六进制   hexadecimal -->  hex

      记住上表,不同进制间转换只需两个缩写相连即为对应函数。如十进制转二进制为 decbin($num)

      在任意进制之间转换数字
      string base_convert ( string $number , int $frombase , int $tobase )

      返回一字符串,把 number 以 tobase 进制的表示。number 本身的进制由 frombase 指定。frombase 和 tobase 都只能在 2 和 36 之间(包括 2 和 36)。高于十进制的数字用字母 a-z 表示,例如 a 表示 10,b 表示 11 以及 z 表示 35。

      如十进制转五进制:base_convert($hexadecimal, 10, 5);

      PHP根据文件头获取文件类型

      <?php
      $file = 'https://www.baidu.com/img/baidu_logo.gif';
      $fp = fopen($file, 'rb');
      if(! $fp)exit('failed');
      
      //$content = stream_get_contents($fp); //全部读取
      /* 循环读取
      while(! feof($fp)){
      	$content .= fread($fp, 10240);
      }
      */
      $content = fread($fp, 2);
      fclose($fp);
      $arr = unpack('C2chars', $content);
      print_r($arr);
      ?>
      

      根据上面方法可获取文件头前两个字节的十进制数字,再用dcehex()转为十六进制,然后与 文件头大全对照,即可获取文件类型。

      CodeIgniter把找不到的页面301跳转到指定页

      问题:网站改版后页面链接地址发生变化,百度收录的原内容打开后出现404。

      解决办法:

      1、如果原网站也是 /product/view/id/12.html 这样的访问方式,只需要在自定义路由中设置下即可。如 $route['product/view/id/(:any)']='new_product/new_list';  把原产品详情页路由到新产品列表页;可以全部路由到一个新控制器,然后再跳转。

      2、如果原网站是 product.asp?id=12 这种而新网站又是linux不支持asp时,可以使用 .htaccess 直接进行301跳转。

      RewriteRule ^(news)\.asp$ http://domain/$1/gongsixinwen.html [R=301,L]
      RewriteRule ^(products)\.asp$ http://domain/$1/jixie.html [R=301,L]

      3、跳转到一个单独的控制器再进行精确跳转。

      RewriteRule ^(news|art|files)\/ https://domain/baidu/index/$1 [R=301,L]


      PHPMailer发信需要的函数

      php_openssl(如果使用SSL加密发送)、php_sockets、fsockopen

      今天本地电脑使用PHPMailer发送邮件成功,上传到阿里云主机后发送失败,原来阿里云主机默认未开启 fsockopen 函数,到主机控制面板中 站点信息》高级环境设置》PHP.ini设置 中启用即可。

      因网站漏洞被上传木马的解决方法

      网站被上传木马,导致页面被植入恶意链接,如果找不到漏洞,可以用 .htaccess 或 web.config 屏蔽木马程序的运行,确保网站的"相对"安全。

      .htaccess

      RewriteEngine on
      RewriteRule (uploadfile.+\.(php|asp|aspx|jsp))$ /rec.php?uri=$1 [R,NC,L]

      web.config

      <?xml version="1.0" encoding="UTF-8"?>
      <configuration>
          <system.webServer>
              <rewrite>
                  <rules>
                      <rule name="规则 1" stopProcessing="true">
                          <match url="(uploadfile.+\.(php|asp|aspx|jsp))$" />
                          <action type="Redirect" url="/rec.php?uri={R:1}" appendQueryString="false" redirectType="Found" />
                      </rule>
                  </rules>
              </rewrite>
          </system.webServer>
      </configuration>

      上面规则是阻止上传文件目录 uploadfile 中 php/asp/aspx/jsp 等类型文件的运行,并跳转到 /rec.php 进行记录(也可以重定向到百度……)。虽然没有解决漏洞,至少确保了木马文件不能运行。

      2024-11-23 星期六 农历十月二十三