05

PHP获得真实客户端的真实IP REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR

REMOTE_ADDR 是你的客户端跟你的服务器“握手”时候的IP。如果使用了“匿名代理”,REMOTE_ADDR将显示代理服务器的IP。
HTTP_CLIENT_IP 是代理服务器发送的HTTP头。如果是“超级匿名代理”,则返回none值。同样,REMOTE_ADDR也会被替换为这个代理服务器的IP。
$_SERVER['REMOTE_ADDR']; //访问端(有可能是用户,有可能是代理的)IP
$_SERVER['HTTP_CLIENT_IP']; //代理端的(有可能存在,可伪造)
$_SERVER['HTTP_X_FORWARDED_FOR']; //用户是在哪个IP使用的代理(有可能存在,也可以伪造)

三个值区别如下:

一、没有使用代理服务器的情况:

REMOTE_ADDR = 您的 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示

二、使用透明代理服务器的情况:Transparent Proxies

REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 您的真实 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。

三、使用普通匿名代理服务器的情况:Anonymous Proxies

REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 代理服务器 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。

四、使用欺骗性代理服务器的情况:Distorting Proxies

REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 随机的 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。

五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)

REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示 ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。

上面内容是抄袭的,下面代码是个人测试可以获取到客户端真实IP的方法。

 

23

PHP各种加密解密函数(URL加密解密、sha1加密解密、des加密解密)

普通hash函数如md5、sha1、base64等都是不可逆函数。虽然我们利用php可以利用这些函数写出可逆函数来。但是跨语言时这类可逆函数非常难搞定。所以这时尽量使用AES DES RC4 Rabbit TripleDes这些方法。

包含超时的加密解密函数

最简单的往往是最好用的。

URL加密解密函数

用户密码可逆加密解密函数:

测试方法:

SHA1的可逆加密解密函数:

DES的加密解密函数:

封装了两个PHP对称加密解密函数

 

29

php常用基本函数

15个PHP常用函数

1.统计数组元素个数

2. 循环删除目录

Continue reading

29

PHP遍历文件函数glob,比opendir和readdir效率高

PHP遍历文件函数glob,比opendirreaddir效率高(亲测,效率高出至少一倍以上),而且使用起来相对灵活,尤其针对遍历文件名为部分未知的情况,书写更为方便。

在遍历非同级目录文件时,因为glob函数返回是带路径的文件名(如下第三个例子),所以如果需要取文件名则需要使用basename函数。

glob函数

函数说明:array glob ( string $pattern [, int $flags ] )
功能:寻找与模式匹配的文件路径,返回包含匹配文件(目录)的数组(注:被检查的文件必须是服务器系统的,不能用于远程文件)
参数说明:第一个参数:匹配模式;第二个可选参数:
GLOB_MARK – 在每个返回的项目中加一个斜线
GLOB_NOSORT – 按照文件在目录中出现的原始顺序返回(不排序)
GLOB_NOCHECK – 如果没有文件匹配则返回用于搜索的模式
GLOB_NOESCAPE – 反斜线不转义元字符
GLOB_BRACE – 扩充 {a,b,c} 来匹配 ‘a’,’b’ 或 ‘c’
GLOB_ONLYDIR – 仅返回与模式匹配的目录项
GLOB_ERR – Stop on read errors (like unreadable directories), by default errors are ignored.

参数 GLOB_BRACE

 

23

JS使用replace()方法匹配替换手机号、座机号、带区号连接符座机号

老客户的一论坛需要把会员发布的手机号、座机号转成可点击拨号的链接,首先我考虑,是要在会员发布提交时进行处理,还是在发布后进行处理。

我选择在发布后进行前台处理。

需要使用JS replace()方法和正则知识

另一篇关于replace方法与正则基础知识的介绍

测试代码实例:

解释:

因为客户代码中是要对不相连的多个区块中进行处理,所以选择器只能抓取comeing类,这样的话,下面就必须使用for循环,如果可以选择整个区域的话,那选择器就抓取mrdede类,不使用for循环,matchHtml = matchS.eq(i).html()改为matchHtml = matchS.html()即可。

replace方法正则替换

var regexp = new RegExp(/(1)(2)(3)/g);

se = matchHtml.replace(regexp, ‘$3 $1 $2′);

RegExp中的正则表达式,其中在两个正斜杠“/”之间区域,有并列的多个(),

那么这多个()把匹配的内容,从左向右依次为$1 $2 $3 ……

如果:

var regexp = new RegExp(/(123)/g);

se = matchHtml.replace(regexp, ‘$1我被找到了’);

RegExp中的正则表达式,其中在两个正斜杠“/”之间区域,只有一个()或没有(),

那么只有$1可以参与替换,

替换时不是一定要使用$1 $2 $3 …… 进行替换,也可以使用其它字符进行替换。

关于实例中正则的解释(从左向右依次解释):

全部原始正则表达式([^0-9])([0-1]{1}[1-9][0-9]{1,2}[^0-9]?[0-9]{7,8}|[1-9]\d{6,7})([^0-9])

([^0-9])以非数字开头(即$1)

原始中的第二段([0-1]{1}[1-9][0-9]{1,2}[^0-9]?[0-9]{7,8}|[1-9]\d{6,7}) 即$2

[0-1]{1}解释:0到1之间(含)的数字必须出现一次

[1-9]解释:1到9之间(含)的数字必须出现一次

[0-9]{1,2}解释:0到9之间(含)的数字至少出现一次,最多出现两次

[^0-9]?解释:非数字的任意一个字符至少出现0次,最多出现一次

[0-9]{7,8}解释:0到9之间(含)的数字至少出现7次,最多出现8次

|解释:或者的意思

[1-9]解释:1到9之间(含)的数字必须出现一次

\d{6,7}解释:0到9之间(含)的数字至少出现6次,最多出现7次

最后面的([^0-9])解释:以非数字结尾(即$3 这样就能保证不匹配以0或1开头的大于12位的数字串了)

注注注:

此正则写法只可使用在JS的replace方法进行替换的情况,如果想用在其它地方,需要去掉正则前后的([^0-9]) 即使用[^0-9])([0-1]{1}[1-9][0-9]{1,2}[^0-9]?[0-9]{7,8}|[1-9]\d{6,7})([^0-9],但是如果想更严谨一些的话,可以再改造。

其实我写的这段正则用在replace方法中匹配替换手机号与座机号时,还是不太严谨,但是绝大多数情况还是可以的。

==========================================

修改:

就在刚才,发布完文章,又做了一下修改,上面实例中双斜杠注释掉的部分是原来的

在它下面两行是改后的,这样就更严谨一些了。

var regexp = new RegExp(/([^0-9])([0-1]{1}[1-9][0-9]{1,2})([^0-9]?)([0-9]{7,8}|[1-9]\d{6,7})([^0-9])/g);

se = matchHtml.replace(regexp, '$1<a style="color:#09f;text-decoration:underline;" href="tel:$2$4">$2$3$4</a>$5');

把原来中间部分([0-1]{1}[1-9][0-9]{1,2}[^0-9]?[0-9]{7,8}|[1-9]\d{6,7})改为([0-1]{1}[1-9][0-9]{1,2})([^0-9]?)([0-9]{7,8}|[1-9]\d{6,7})

也就是把原来的中间部分分成了三个部分,现在全部正则为/([^0-9])([0-1]{1}[1-9][0-9]{1,2})([^0-9]?)([0-9]{7,8}|[1-9]\d{6,7})([^0-9])/ 

所以在替换的时候就有$1$2$3$4$5这五个部分可以参与替换了。

其中$2各$4是实际打可拨打号码的部分,所以在链接中使用href=”tel:$2$4″

中间部分就是$2$3$4的组合了

尾部$5

这样就防止替换的座机号存在非数字时也参与拨号的情况出现了,如抓取到的号码为010-12345678或010 12345678,在拨打时就是01012345678

我不知道在拨号时区号与直拨号间有横杠或空格时能不能拨得出去,没试,也就不试。

个人感觉,严谨一些的话,还是现在这样写正则比较好。

==========================================

再次修改正则:

上一次修改后不能匹配7位和8位的电话直拨号,有错误。

这回测试了,可用,没问题了。哈哈

另附一图,关于replace的替换变量的规律的,如下:

JS使用replace()方法匹配替换手机号、座机号、带区号连接符座机号

23

JS replace方法替换字符串实例及正则表达式基础知识

1、javascript 正则对象替换创建 和用法: /pattern/flags  先简单案例学习认识下replace能干什么

正则表达式构造函数: new RegExp("pattern"[,"flags"]);

正则表达式替换变量函数:stringObj.replace(RegExp,replace Text);

参数说明:
pattern — 一个正则表达式文本
flags — 如果存在,将是以下值:
g: 全局匹配
i: 忽略大小写
gi: 以上组合 Continue reading

15

PHP中extract()的使用方法

年前年后没什么活儿,闲着没事时准备把织梦折采集功能提出来,经过改造移植进Destoon网站系统。在改造的过程中,也碰到了很多新知识来学习。

Destoon源码根目录common.inc.php文件约第80多行,源码如下:

if($_POST) extract($_POST, EXTR_SKIP);
if($_GET) extract($_GET, EXTR_SKIP);

注:不要对不能信任的数据使用 extract()

测试实例:

form.html

action.php

extract(),它的主要作用是将数组展开,键名(name)作为变量名,元素值(value)为变量值,可以说为数组的操作提供了另外一个方便的工具,比方说,可以很方便的提取$_POST或者$_GET的元素,对表单提交过来的内容不用一一赋值。

int extract ( array $var_array [, int $extract_type [, string $prefix ]] )

extract() 检查每个键名看是否可以作为一个合法的变量名,同时也检查和符号表中已有的变量名的冲突。对待非法/数字和冲突的键名的方法将根据 extract_type 参数决定。可以是以下值之一:

EXTR_OVERWRITE
如果有冲突,覆盖已有的变量。
EXTR_SKIP
如果有冲突,不覆盖已有的变量。
EXTR_PREFIX_SAME
如果有冲突,在变量名前加上前缀 prefix 。
EXTR_PREFIX_ALL
给所有变量名加上前缀 prefix 。自 PHP 4.0.5 起这也包括了对数字索引的处理。
EXTR_PREFIX_INVALID
仅在非法/数字的变量名前加上前缀 prefix 。本标记是 PHP 4.0.5 新加的。
EXTR_IF_EXISTS
仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。可以用在已经定义了一组合法的变量,然后要从一个数组例如 $_REQUEST 中提取值覆盖这些变量的场合。本标记是 PHP 4.2.0 新加的。
EXTR_PREFIX_IF_EXISTS
仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。本标记是 PHP 4.2.0 新加的。
EXTR_REFS
将变量作为引用提取。这有力地表明了导入的变量仍然引用了 var_array 参数的值。可以单独使用这个标志或者在 extract_type 中用 OR 与其它任何标志结合使用。本标记是 PHP 4.3.0 新加的。
如果没有指定 extract_type ,则被假定为 EXTR_OVERWRITE。

注意 prefix 仅在 extract_type 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 时需要。如果附加了前缀后的结果不是合法的变量名,将不会导入到符号表中。前缀和数组键名之间会自动加上一个下划线。

extract() 的一种可能用法是将 wddx_deserialize() 返回的结合数组中的内容导入到符号表变量中去。

Example#1 extract() 例子

上例将输出:

blue, large, sphere, medium

$size 没有被覆盖,因为指定了 EXTR_PREFIX_SAME,这使得 $wddx_size 被建立。如果指定了 EXTR_SKIP,则 $mrdede_size 也不会被建立。EXTR_OVERWRITE 将使 $size 的值为“medium”,EXTR_PREFIX_ALL 将建立新变量 $mrdede_color,$mrdede_size 和 $mrdede_shape。

必须使用关联数组,数字索引的数组将不会产生结果,除非用了 EXTR_PREFIX_ALL 或者 EXTR_PREFIX_INVALID。

十一 07

PHP输出函数有哪些?

1 echo();2 print();3 print_r();4 printf();5 sprintf();6 die();7 var_dump();8 var_export();

echo

返回值是void,可以一次输出多个值,多个值之间用逗号分隔。echo是语言结构(language construct)也就是关键字,而并不是真正的函数,因此不能作为表达式的一部分使用。使用的时候不用加括号,加上也可以。只支持基本类型,布尔型除外,echo true的时候显示1,echo false的时候啥都没有。echo不可以输出数组类型

print()

只可以同时输出一个字符串,一个变量,不支持逗号分隔多个显示变量的语法,需要圆括号,print能输出数组类型的数据,返回值是int,当其执行失败时返flase。print  的用法和C语言很像,所以会对输出内容里的%做特殊解释。

print_r()

不仅可以打印变量的的值,还能显示变量类型,而且也可以显示数组和对象这样复杂的变量类型。print_r() 将把数组的指针移到最后边。使用 reset() 可让指针回到开始处。print_r()可以把字符串和数字简单地打印出来,而数组则以括起来的键和值得列表形式显示,并以Array开头。 Continue reading

十一 07

PHP $_SERVER 相关信息

$_SERVER中存着很多信息,备份待用。

以下四行,是我们相对常用的

  1. $_SERVER['HTTP_ACCEPT_LANGUAGE']//浏览器语言
  2. $_SERVER['REMOTE_ADDR'] //当前用户 IP 。
  3. $_SERVER['REMOTE_HOST'] //当前用户主机名,DNS 反向解析不依赖于用户的 REMOTE_ADDR。
  4. $_SERVER['REQUEST_URI'] //URL

其它:

  1. $_SERVER['SCRIPT_FILENAME'] //当前执行脚本的绝对路径名。
  2. $_SERVER['SCRIPT_URI'] //用来指定访问的页面,如:“/index.html”
  3. $_SERVER['REMOTE_PORT'] //端口。
  4. $_SERVER['SERVER_ADDR'] //当前运行脚本所在的服务器IP
  5. $_SERVER['SERVER_NAME'] //服务器主机的名称。
  6. $_SERVER['PHP_SELF']//正在执行脚本的文件名
  7. $_SERVER['argv'] //传递给该脚本的参数。
  8. $_SERVER['argc'] //传递给程序的命令行参数的个数。
  9. $_SERVER['GATEWAY_INTERFACE']//CGI 规范的版本。
  10. $_SERVER['SERVER_SOFTWARE'] //服务器标识的字串,在响应请求时的头信息中给出
  11. $_SERVER['SERVER_PROTOCOL'] //请求页面时通信协议的名称和版本
  12. $_SERVER['REQUEST_METHOD']//访问页面时的请求方法
  13. $_SERVER['REQUEST_TIME'] //请求开始时的时间戳。从 PHP 5.1.0 起可用
  14. $_SERVER['QUERY_STRING'] //查询(query)的字符串,如果有的话,通过它进行页面访问。
  15. $_SERVER['DOCUMENT_ROOT'] //当前运行脚本所在的文档根目录
  16. $_SERVER['HTTP_ACCEPT'] //当前请求的 Accept: 头部的内容,如果存在的话。
  17. $_SERVER['HTTP_ACCEPT_CHARSET'] //当前请求的 Accept-Charset: 头部的内容,如果存在的话。
  18. $_SERVER['HTTP_ACCEPT_ENCODING'] //当前请求的 Accept-Encoding: 头部的内容
  19. $_SERVER['HTTP_CONNECTION'] //当前请求的 Connection: 头部的内容。例如:“Keep-Alive”。
  20. $_SERVER['HTTP_HOST'] //当前请求的 Host: 头部的内容,如果存在的话。
  21. $_SERVER['HTTP_REFERER'] //链接到当前页面的前一页面的 URL 地址,该值并不可信。
  22. $_SERVER['HTTP_USER_AGENT'] //当前请求的 User_Agent: 头部的内容。
  23. $_SERVER['HTTPS']//如果通过https访问,则被设为一个非空的值(on),否则返回off
  24. $_SERVER['SERVER_ADMIN'] //管理员信息。该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值。
  25. $_SERVER['SERVER_PORT'] //服务器所使用的端口,默认值为 "80"。如果使用 SSL 安全连接,则这个值为用户设置的 HTTP 端口。
  26. $_SERVER['SERVER_SIGNATURE'] //包含服务器版本和虚拟主机名的字符串。
  27. $_SERVER['PATH_TRANSLATED'] //当前脚本所在文件系统(不是文档根目录)的基本路径。
  28. $_SERVER['SCRIPT_NAME'] //包含当前脚本的路径。这在页面需要指向自己时非常有用。__FILE__ 常量包含当前脚本(例如包含文件)的完整路径和文件名。
  29. $_SERVER['PHP_AUTH_USER'] //当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。
  30. $_SERVER['PHP_AUTH_PW'] //当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。
  31. $_SERVER['AUTH_TYPE'] //当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型
十一 06

PHP使用$_SERVER['HTTP_USER_AGENT'];获取User Agent信息,另附JS方法

PHP使用$_SERVER['HTTP_USER_AGENT'];获取User Agent信息,通过查找信息的异同并加以判断语句来实现只允许页面在微信内置浏览器打开,或只允许在手机QQ内置浏览器打开,或其它浏览器打开等。

安卓系统

手机UC浏览器:
Mozilla/5.0 (Linux; U; Android 4.2.2; zh-CN; Hol-T00 Build/HUAWEIHol-T00) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 UCBrowser/10.7.5.655 U3/0.8.0 Mobile Safari/534.30

手机QQ浏览器:
Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; Hol-T00 Build/HUAWEIHol-T00) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 MQQBrowser/6.1 Mobile Safari/537.36

手机QQ内置浏览器:
Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; Hol-T00 Build/HUAWEIHol-T00) AppleWebKit/533.1 (KHTML, like Gecko)Version/4.0 MQQBrowser/5.4 TBS/025477 Mobile Safari/533.1 V1_AND_SQ_5.9.1_272_YYB_D QQ/5.9.1.2535 NetType/WIFI WebP/0.3.0 Pixel/720

微信内置浏览器:
Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; Hol-T00 Build/HUAWEIHol-T00) AppleWebKit/533.1 (KHTML, like Gecko)Version/4.0 MQQBrowser/5.4 TBS/025478 Mobile Safari/533.1 MicroMessenger/6.3.5.50_r1573191.640 NetType/WIFI Language/zh_CN

手机百度:
Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; Hol-T00 Build/HUAWEIHol-T00) AppleWebKit/534.24 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.24 T5/2.0 baiduboxapp/6.9.1 (Baidu; P1 4.2.2)

IOS系统

微信内置浏览器:(iPhone 4S)
Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13B143 MicroMessenger/6.3.6 NetType/WIFI Language/zh_CN

手机QQ内置浏览器:(iPhone 4S)
Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13B143 MicroMessenger/6.3.6 NetType/WIFI Language/zh_CN

手机QQ内置浏览器:(iPhone plus)
Mozilla/5.0 (iPhone; CPU iPhone OS 8_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12D508 QQ/5.9.1.405 Pixel/1080 NetType/WIFI Mem/132

手机QQ内置浏览器:(iPhone plus)
Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13B143 QQ/5.9.1.405 Pixel/1080 NetType/2G Mem/208

JavaScript和PHP获取后判断信息方法如下:
Continue reading