王新阳

wangxinyang

PHP从7.2升级到7.3(7.4)后需要注意的地方

1、数组不再支持大括号调用,必须使用中括号。 $array{0} 会报错:

Severity: 8192
Array and string offset access syntax with curly braces is deprecated 

2、switch 中使用 continue 会出现警告:

Severity: Warning
"continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?

需要根据实际情况改为 break (仅退出switch) 或 continue 2 (退出for/foreach等)

CodeIgniter获取header信息

以下两个用于获取 Request Headers

$this->input->request_headers()
返回 HTTP 请求头数组

$this->input->get_request_header()
返回某个指定的 HTTP 请求头,如果不存在,则返回 NULL

以下用于获取使用 header() 设置的 Response Headers

$this->output->get_header($header)
返回请求的 HTTP 头,如果 HTTP 头还没设置,返回 NULL

PHP过滤器预定义常量

PHP过滤器函数

  • filter_has_var — 检测是否存在指定类型的变量
  • filter_id — 返回与某个特定名称的过滤器相关联的id
  • filter_input_array — 获取一系列外部变量,并且可以通过过滤器处理它们
  • filter_input — 通过名称获取特定的外部变量,并且可以通过过滤器处理它
  • filter_list — 返回所支持的过滤器列表
  • filter_var_array — 获取多个变量并且过滤它们
  • filter_var — 使用特定的过滤器过滤一个变量




以下转自:https://blog.csdn.net/asty9000/article/details/83186890

变量类型

常量名值(PHP7.2.4)说明
INPUT_POST0POST变量
INPUT_GET1GET变量
INPUT_COOKIE2COOKIE变量
INPUT_ENV4ENV变量
INPUT_SERVER5SERVER变量
INPUT_SESSION6SESSION变量
INPUT_REQUEST99REQUEST变量

过滤器标记

常量名值(PHP7.2.4)说明
FILTER_FLAG_NONE0表示没有使用标记
FILTER_FLAG_ALLOW_OCTAL1允许八进制的字符(0[0-7]+)。
FILTER_FLAG_ALLOW_HEX2允许十六进制的字符(0x[0-9a-fA-F]+)。
FILTER_NULL_ON_FAILURE134217728过滤失败时返回null,而不是false。
FILTER_FLAG_ALLOW_THOUSAND8192允许使用千分位分隔符(,)。
FILTER_FLAG_SCHEME_REQUIRED65536url需要带协议部分(PHP5.2.1FILTER_VALIDATE_URL隐式使用)。
FILTER_FLAG_HOST_REQUIRED131072url需要带ip地址或域名部分(PHP5.2.1FILTER_VALIDATE_URL隐式使用)。
FILTER_FLAG_PATH_REQUIRED262144url需要带路径部分。
FILTER_FLAG_QUERY_REQUIRED524288url需要带数据部分。
FILTER_FLAG_EMAIL_UNICODE1048576PHP7.1起,在邮件地址用户名部分允许 Unicode 字符。
FILTER_FLAG_IPV41048576仅允许IPv4地址。
FILTER_FLAG_IPV62097152仅允许IPv6地址。
FILTER_FLAG_NO_PRIV_RANGE8388608ip地址不在私有地址范围内。
FILTER_FLAG_NO_RES_RANGE4194304ip地址不在保留地址范围内(PHP5.2.10起,支持IPv6地址)。
FILTER_FLAG_HOSTNAME1048576PHP7.0起,验证主机名(必须以字母数字字符开头,并且只包含字母数字或连字符)。
FILTER_FLAG_NO_ENCODE_QUOTES

128

不对'和"进行编码。
FILTER_FLAG_STRIP_LOW4去掉ASCII编码值小于32的字符。
FILTER_FLAG_STRIP_HIGH8去掉ASCII编码值大于127的字符。
FILTER_FLAG_STRIP_BACKTICK512PHP5.3.2起,去掉反引号(`)。
FILTER_FLAG_ENCODE_LOW16对ASCII编码值小于32的字符进行编码。
FILTER_FLAG_ENCODE_HIGH32对ASCII编码值大于127的字符进行编码。
FILTER_FLAG_ENCODE_AMP64对&进行编码。
FILTER_FLAG_ALLOW_FRACTION4096保留小数点(.)。
FILTER_FLAG_ALLOW_THOUSAND8192保留千位符(,)。
FILTER_FLAG_ALLOW_SCIENTIFIC16384保留科学计数符(e或E)。
FILTER_REQUIRE_SCALAR33554432需要值为标量。
FILTER_REQUIRE_ARRAY16777216需要值为数组。
FILTER_FORCE_ARRAY67108864如果值为标量,则将其作为数组处理,标量值作为数组元素。
FILTER_FLAG_EMPTY_STRING_NULL256PHP5.4起,如果是空字符串,则返回null。

验证过滤器

常量名值(PHP7.2.4)说明
FILTER_VALIDATE_INT257整型验证过滤器
FILTER_VALIDATE_BOOLEAN258布尔验证过滤器
FILTER_VALIDATE_FLOAT259浮点验证过滤器
FILTER_VALIDATE_REGEXP272正则验证过滤器
FILTER_VALIDATE_URL273URL地址验证过滤器
FILTER_VALIDATE_EMAIL274邮件地址验证过滤器
FILTER_VALIDATE_IP275IP地址验证过滤器
FILTER_VALIDATE_MAC276PHP5.5起,MAC地址验证过滤器
FILTER_VALIDATE_DOMAIN277域名验证过滤器

清洗过滤器

常量名值(PHP7.2.4)说明
FILTER_SANITIZE_STRING

513

字符串过滤器
FILTER_SANITIZE_STRIPPED513字符串过滤器的别名
FILTER_SANITIZE_ENCODED514url编码过滤器
FILTER_SANITIZE_SPECIAL_CHARS515特殊字符过滤器
FILTER_UNSAFE_RAW516原值过滤器
FILTER_SANITIZE_EMAIL517邮件地址过滤器
FILTER_SANITIZE_URL518url地址过滤器
FILTER_SANITIZE_NUMBER_INT519整型过滤器
FILTER_SANITIZE_NUMBER_FLOAT520浮点过滤器
FILTER_SANITIZE_MAGIC_QUOTES521转义过滤器
FILTER_SANITIZE_FULL_SPECIAL_CHARS522PHP5.3.3起,全部特殊字符过滤器

其他

常量名值(PHP7.2.4)说明
FILTER_DEFAULT

与配置的默认过滤器相同

与配置的默认过滤器相同
FILTER_CALLBACK1024回调过滤器

PHP原生函数判断IP格式是否正确

一般我们都是通过正则表达式来判断IP格式是否正确,其实从php5.2.0之后,PHP就有专门的函数来做这个判断了。

filter_var — 使用特定的过滤器过滤一个变量
过滤器预定义常量见:http://wangxinyang.cn/wxy/view.asp?id=253

判断是否是合法IP方法如下:

if(filter_var($ip, FILTER_VALIDATE_IP)) {
// it's valid
}
else {
// it's not valid
}
  
//判断是否是合法的IPv4 IP地址
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
// it's valid
}
else {
// it's not valid
}
//判断是否是合法的公共IPv4地址,192.168.1.1这类的私有IP地址将会排除在外
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE)) {
// it's valid
}
else {
// it's not valid
}
//判断是否是合法的IPv6地址
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)) {
// it's valid
}
else {
// it's not valid
}
//判断是否是public IPv4 IP或者是合法的Public IPv6 IP地址
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
// it's valid
}
else {
// it's not valid
}

以上转自:https://www.haibakeji.com/archives/313.html


/**
* 是否有效ipv4地址
*/
function is_ip($str){
return preg_match("/^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$/", (string)$str) === 1 ? TRUE : FALSE;
}
/**
* 是否有效ipv6地址
* 1、可以是纯IPv6地址,如 fb80::86e2:c6f7:c749:2d43
* 2、可以是嵌入IPv4的IPv6地址,如 fb80::86e2:c6f7:c749:2d43:192.168.1.1
* 3、不能是带网卡interface标识的IPv6地址,如 fb80::86e2:c6f7:c749:2d43%15
* 4、$_SERVER['REMOTE_ADDR'] 获取的可能是3中所指的带网卡标识的IPv6,所以在判断前要先去掉网卡标识部分
*/
function is_ipv6($str){
return preg_match("/^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:)|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}(:[0-9A-Fa-f]{1,4}){1,2})|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){1,3})|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){1,4})|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){1,5})|([0-9A-Fa-f]{1,4}:(:[0-9A-Fa-f]{1,4}){1,6})|(:(:[0-9A-Fa-f]{1,4}){1,7})|(([0-9A-Fa-f]{1,4}:){6}(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})|(([0-9A-Fa-f]{1,4}:){5}:(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){0,1}:(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){0,2}:(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){0,3}:(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})|([0-9A-Fa-f]{1,4}:(:[0-9A-Fa-f]{1,4}){0,4}:(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})|(:(:[0-9A-Fa-f]{1,4}){0,5}:(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}))$/", (string)$str) === 1 ? TRUE : FALSE;
}


PHP超全局变量

  超全局变量是PHP4.1引入的在全部作用域中始终可用的内置变量。在函数或方法中无需使用global关键字就能访问超全局变量。

  $GLOBALS:引用全局作用域中可用的全部变量。一个包含了全部变量的全局组合数组。变量的名字就是数组的键。

  $_SERVER:一个包含了诸如头信息(header)、路径(path)、以及脚本位置(srcipt location)等信息的数组。这个数组中的项目由Web服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。

  $_GET:HTTP GET变量,通过 URL 参数传递给当前脚本的变量的数组。

  $_POST:HTTP POST变量,当HTTP POST请求的Content-Type是application/x-www-form-urlencoded或 multipart/form-data时,会将变量以关联数组形式传入当前脚本。

  $_FILES:HTTP文件上传变量,通过HTTP POST方式上传到当前脚本的项目的数组。

  $_COOKIE:HTTP Cookies,通过HTTP Cookies方式传递给当前脚本的变量的数组。

  $_SESSION:Session 变量,当前脚本可用SESSION变量的数组。

  $_REQUEST:HTTP Request变量,默认情况下包含了$_GET,$_POST和$_COOKIE的数组。$_FILES信息从PHP4.1起被从$_REQUEST中移除。

  $_ENV:环境变量,通过环境方式传递给当前脚本的变量的数组。这些变量被从 PHP 解析器的运行环境导入到 PHP 的全局命名空间。很多是由支持 PHP 运行的 Shell 提供的,并且不同的系统很可能运行着不同种类的 Shell,所以不可能有一份确定的列表。

————————————————
原文链接:https://blog.csdn.net/asty9000/java/article/details/80870358

访问IPv6网站时的 $_SERVER

Array
(
    [_FCGI_X_PIPE_] => \\.\pipe\IISFCGI-e45319dc-f612-43f6-ba91-233966c64843
    [ALLUSERSPROFILE] => C:\ProgramData
    [APPDATA] => C:\WINDOWS\system32\config\systemprofile\AppData\Roaming
    [APP_POOL_CONFIG] => C:\inetpub\temp\apppools\DefaultAppPool\DefaultAppPool.config
    [APP_POOL_ID] => DefaultAppPool
    [CommonProgramFiles] => C:\Program Files\Common Files
    [CommonProgramFiles(x86)] => C:\Program Files (x86)\Common Files
    [CommonProgramW6432] => C:\Program Files\Common Files
    [COMPUTERNAME] => SC-201902101815
    [ComSpec] => C:\WINDOWS\system32\cmd.exe
    [DriverData] => C:\Windows\System32\Drivers\DriverData
    [LOCALAPPDATA] => C:\WINDOWS\system32\config\systemprofile\AppData\Local
    [NUMBER_OF_PROCESSORS] => 4
    [OS] => Windows_NT
    [Path] => C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files\Microsoft\Web Platform Installer\;C:\WINDOWS\system32\config\systemprofile\AppData\Local\Microsoft\WindowsApps
    [PATHEXT] => .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
    [PROCESSOR_ARCHITECTURE] => AMD64
    [PROCESSOR_IDENTIFIER] => Intel64 Family 6 Model 58 Stepping 9, GenuineIntel
    [PROCESSOR_LEVEL] => 6
    [PROCESSOR_REVISION] => 3a09
    [ProgramData] => C:\ProgramData
    [ProgramFiles] => C:\Program Files
    [ProgramFiles(x86)] => C:\Program Files (x86)
    [ProgramW6432] => C:\Program Files
    [PSModulePath] => C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules
    [PUBLIC] => C:\Users\Public
    [SystemDrive] => C:
    [SystemRoot] => C:\WINDOWS
    [TEMP] => C:\WINDOWS\TEMP
    [TMP] => C:\WINDOWS\TEMP
    [USERDOMAIN] => WorkGroup
    [USERNAME] => SC-201902101815$
    [USERPROFILE] => C:\WINDOWS\system32\config\systemprofile
    [windir] => C:\WINDOWS
    [ORIG_PATH_INFO] => /index.php
    [URL] => /index.php
    [SERVER_SOFTWARE] => Microsoft-IIS/10.0
    [SERVER_PROTOCOL] => HTTP/1.1
    [SERVER_PORT_SECURE] => 0
    [SERVER_PORT] => 80
    [SERVER_NAME] => fb80::49d8:1f71:2038:410e
    [SCRIPT_NAME] => /index.php
    [SCRIPT_FILENAME] => D:\WEB\web10001\index.php
    [REQUEST_URI] => /
    [REQUEST_METHOD] => GET
    [REMOTE_USER] => 
    [REMOTE_PORT] => 12368
    [REMOTE_HOST] => fb80::86e2:c6f7:c749:2d43%15
    [REMOTE_ADDR] => fb80::86e2:c6f7:c749:2d43%15
    [QUERY_STRING] => 
    [PATH_TRANSLATED] => D:\WEB\web10001\index.php
    [LOGON_USER] => 
    [LOCAL_ADDR] => fb80::49d8:1f71:2038:410e%15
    [INSTANCE_META_PATH] => /LM/W3SVC/6
    [INSTANCE_NAME] => WEB10001
    [INSTANCE_ID] => 6
    [HTTPS_SERVER_SUBJECT] => 
    [HTTPS_SERVER_ISSUER] => 
    [HTTPS_SECRETKEYSIZE] => 
    [HTTPS_KEYSIZE] => 
    [HTTPS] => off
    [GATEWAY_INTERFACE] => CGI/1.1
    [DOCUMENT_ROOT] => D:\WEB\web10001
    [CONTENT_TYPE] => 
    [CONTENT_LENGTH] => 0
    [CERT_SUBJECT] => 
    [CERT_SERIALNUMBER] => 
    [CERT_ISSUER] => 
    [CERT_FLAGS] => 
    [CERT_COOKIE] => 
    [AUTH_USER] => 
    [AUTH_PASSWORD] => 
    [AUTH_TYPE] => 
    [APPL_PHYSICAL_PATH] => D:\WEB\web10001\
    [APPL_MD_PATH] => /LM/W3SVC/6/ROOT
    [IIS_UrlRewriteModule] => 7,1,1993,2336
    [HTTP_UPGRADE_INSECURE_REQUESTS] => 1
    [HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36
    [HTTP_HOST] => [fb80::49d8:1f71:2038:410e]
    [HTTP_ACCEPT_LANGUAGE] => zh-CN,zh;q=0.9
    [HTTP_ACCEPT_ENCODING] => gzip, deflate
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
    [HTTP_CONTENT_LENGTH] => 0
    [HTTP_CONNECTION] => keep-alive
    [FCGI_ROLE] => RESPONDER
    [PHP_SELF] => /index.php
    [REQUEST_TIME_FLOAT] => 1586529155.0947
    [REQUEST_TIME] => 1586529155
)

PHP学习资源

https://www.cnblogs.com/Renyi-Fan/category/1116999.html

怎么判断扩展是否启用
https://www.cnblogs.com/Renyi-Fan/p/9742246.html
1、使用 extension_loaded() 判断扩展是否已开始
2、使用 function_exists() 判断该扩展的某个函数是否存在
3、直接调用该扩展的函数看运行结果,如:gd_info()
……

PHP开发中常见的安全问题详解和解决方法https://www.cnblogs.com/walblog/articles/8331399.html

PHP扩展官方下载地址
https://windows.php.net/downloads/pecl/releases/
https://windows.php.net/

php最简单的遍历文件夹

<php
//遍历文件夹
function list_file($dir){
	$list = scandir($dir);
	$path='';
	foreach($list as $v){
		if($v=='.' || $v=='..')continue;
		$path = $dir.'/'.$v;
		if(is_dir($path)){
			//echo '<a href="?p=',$path,'">',$v,'</a>'
			list_file($path);
		}else{
			echo "$dir/$v<br>";
		}
	}
}
$dir = dirname(__FILE__);
list_file($dir);

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

转自: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"

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

      2024-05-10 星期五 农历四月初三