php怎么识别真实ip
PHP 里用来获取客户端 IP 的变量有这些:
$_SERVER['HTTP_CLIENT_IP'] 这个头是有的,但是很少,不一定服务器都实现了。客户端可以伪造。(推荐学习:PHP编程从入门到精通)
$_SERVER['HTTP_X_FORWARDED_FOR'] 是有标准定义,用来识别经过 HTTP 代理后的客户端 IP 地址,格式:clientip,proxy1,proxy2。详细解释见 http://zh.wikipedia.org/wiki/X-Forwarded-F...。 客户端可以伪造。
$_SERVER['REMOTE_ADDR'] 是可靠的, 它是最后一个跟你的服务器握手的 IP,可能是用户的代理服务器,也可能是自己的反向代理。客户端不能伪造。
客户端可以伪造的参数必须过滤和验证!很多人以为 $_SERVER 变量里的东西都是可信的,其实并不不然,$_SERVER['HTTP_CLIENT_IP'] 和 $_SERVER['HTTP_X_FORWARDED_FOR'] 都来自客户端请求的 header 里面。
如果要严格获取用户真实 ip
在反爬虫,防刷票的时候,客户端可以伪造的东西,我们一律不信任,此为严格获取。
没有套 CDN,用户直连我们的 PHP 服务器
这种情况下用 tcp 层握手的 ip,$_SERVER['REMOTE_ADDR']
自建集群用 nginx 实现负载均衡的时候
这种情况下,PHP 应用服务器不能对外暴露,我们在 nginx 中实现获取真实 IP 再换发给 PHP 服务器。
location /{ proxy_set_header client-real-ip $remote_addr;}
client-real-ip 可以随意自己命名,我们将 tcp 层中跟 nginx 握手的 ip 转发给 PHP。
使用 CDN,从 PHP 服务器取源的时候
CDN 会转发客户端的握手 ip 过来,各家策略有差异,具体去查 CDN 的文档。
当然我们也可以把需要严格核查的业务绑一个二级域名,单独走我们自己的 nginx 服务器,避开 CDN。
相关文章
- 【转】PHP网站(nginx、php-fpm、mysql) 用户权限解析
- PHP 7.4 新语法:箭头函数
- 解决php编译报错configure: error: mcrypt.h not found. Please reinstall libmcrypt.
- 通过yum安装nginx-mysql-php-fastcgi配置LNMP
- [获取行数]php读取大文件提供性能的方法,PHP的stream_get_line函数读取大文件获取文件的行数的方...
- php:在linux上用sudo提升权限(centos 8 / PHP 7.4.2)
- thinkphp6: 前后端分离:用jwt+middleware做用户登录验证(php 8.1.1 / thinkphp v6.0.10LTS )
- redis cluster php 客户端 predis
- PHP图片识别成文字
- PHP 自动加载对象(以MVC框架为例)
- [PHP] 如何让 php-fpm 的循环 echo 实时输出到浏览器
- [php-src]一个Php扩展的结构
- Atitit.跨语言 java c#.net php js常用的codec encode算法api 兼容性 应该内置到语言里面
- Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php c#.Net
- Atitit.执行cmd 命令行 php
- php与java语法的区别
- CentOS下yum安装PHP,配置php-fpm服务
- php去除换行符的方法小结(PHP_EOL变量的使用)
- php魔术方法
- PHP 开发基础知识笔记