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封号。
如何预防网站被反向代理?
- 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"
以上几种解决方案为服务器端解决方案。
解决$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);