首页
关于
归档
朋友
留言
API平台
告白墙
休闲游戏
更多
留言板
练字贴
Layui手册
Search
1
【PHP】PHPoffice/PHPSpreadsheet读取和写入Excel
1,006 阅读
2
【Git】No tracked branch configured for branch master or the branch doesn't exist.
742 阅读
3
【composer】composer常用命令
487 阅读
4
【Layui】控制页面元素展示隐藏
437 阅读
5
【MySQL】MySQL触发器应用场景和使用方法
417 阅读
默认分类
PHP
ThinkPHP
Laravel
面向对象
设计模式
算法
基础
网络安全
Web
HTML
CSS
JavaScript
jQuery
Layui
VUE
uni-app
Database
MySQL
Redis
RabbitMQ
Nginx
Git
Linux
Soft Ware
Windows
网赚
Go
登录
Search
标签搜索
PHP
函数
方法
类
MySQL
ThinkPHP
OOP
JavaScript
Layui
Web
Linux
Array
设计模式
Git
PHPSpreadsheet
PHPoffice
排序算法
面试题
Windows
基础
小破孩
累计撰写
212
篇文章
累计收到
16
条评论
首页
栏目
默认分类
PHP
ThinkPHP
Laravel
面向对象
设计模式
算法
基础
网络安全
Web
HTML
CSS
JavaScript
jQuery
Layui
VUE
uni-app
Database
MySQL
Redis
RabbitMQ
Nginx
Git
Linux
Soft Ware
Windows
网赚
Go
页面
关于
归档
朋友
留言
API平台
告白墙
休闲游戏
留言板
练字贴
Layui手册
搜索到
7
篇与
的结果
2022-06-23
【PHP】判断客户端是否使用代理服务器
要判断客户端是否使用代理服务器,可以从客户端所发送的环境变量信息来判断。 具体来说,就是看HTTP_VIA字段,如果这个字段设置了,说明客户端使用了代理服务器。 匿名级别可以参考下表来判断。 一、没有使用代理服务器的情况: REMOTE_ADDR = 您的 IP HTTP_VIA = 没数值或不显示 HTTP_X_FORWARDED_FOR = 没数值或不显示 二、使用透明代理服务器的情况:Transparent Proxies REMOTE_ADDR = 代理服务器 IP HTTP_VIA = 代理服务器 IP (补充:这个字段由代理服务器填充,有时会填充网关信息等) HTTP_X_FORWARDED_FOR = 您的真实 IP 这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。 三、使用普通匿名代理服务器的情况:Anonymous Proxies REMOTE_ADDR = 代理服务器 IP HTTP_VIA = 代理服务器 IP (补充:这个字段由代理服务器填充,有时会填充网关信息等) HTTP_X_FORWARDED_FOR = 代理服务器 IP 隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。 四、使用欺骗性代理服务器的情况:Distorting Proxies REMOTE_ADDR = 代理服务器 IP HTTP_VIA = 代理服务器 IP (补充:这个字段由代理服务器填充,有时会填充网关信息等) HTTP_X_FORWARDED_FOR = 随机的 IP 告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。 五、使用高匿名代理服务器的情况:High Anonymity Proxies REMOTE_ADDR = 代理服务器 IP HTTP_VIA = 没数值或不显示 HTTP_X_FORWARDED_FOR = 没数值或不显示 完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。 除此之外,可以通过proxy judges总 结其他一些可供参考的判定信息,一遍于在实践中加以利用。 if(!empty($_SERVER['HTTP_VIA'])) //使用了代理 { if(!isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { //Anonymous Proxies 普通匿名代理服务器 //代理IP地址为 $_SERVER['REMOTE_ADDR'] exit('Access Denied'); } else { //Transparent Proxies 透明代理服务器 //代理IP地址为 $_SERVER['REMOTE_ADDR'] //真实ip地址为 $_SERVER['HTTP_X_FORWARDED_FOR'] exit('Access Denied'); } } else //没有代理或者是高匿名代理 { //真实ip地址为 $_SERVER['REMOTE_ADDR'] }
2022年06月23日
76 阅读
0 评论
0 点赞
2022-06-23
【PHP】PHP实现JWT生成和验证
JWT里面的 encode 和 decode方法进行生成token和验证token /** * @Author: 小破孩嫩 * @Email: 3584685883@qq.com * @Time: 2021/6/17 16:14 * @param $uid * @return mixed * @Description:生成token */ public function setToken($uid){ //私钥 $privateKey = <<<EOD -----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQC8kGa1pSjbSYZVebtTRBLxBz5H4i2p/llLCrEeQhta5kaQu/Rn vuER4W8oDH3+3iuIYW4VQAzyqFpwuzjkDI+17t5t0tyazyZ8JXw+KgXTxldMPEL9 5+qVhgXvwtihXC1c5oGbRlEDvDF6Sa53rcFVsYJ4ehde/zUxo6UvS7UrBQIDAQAB AoGAb/MXV46XxCFRxNuB8LyAtmLDgi/xRnTAlMHjSACddwkyKem8//8eZtw9fzxz bWZ/1/doQOuHBGYZU8aDzzj59FZ78dyzNFoF91hbvZKkg+6wGyd/LrGVEB+Xre0J Nil0GReM2AHDNZUYRv+HYJPIOrB0CRczLQsgFJ8K6aAD6F0CQQDzbpjYdx10qgK1 cP59UHiHjPZYC0loEsk7s+hUmT3QHerAQJMZWC11Qrn2N+ybwwNblDKv+s5qgMQ5 5tNoQ9IfAkEAxkyffU6ythpg/H0Ixe1I2rd0GbF05biIzO/i77Det3n4YsJVlDck ZkcvY3SK2iRIL4c9yY6hlIhs+K9wXTtGWwJBAO9Dskl48mO7woPR9uD22jDpNSwe k90OMepTjzSvlhjbfuPN1IdhqvSJTDychRwn1kIJ7LQZgQ8fVz9OCFZ/6qMCQGOb qaGwHmUK6xzpUbbacnYrIM6nLSkXgOAwv7XXCojvY614ILTK3iXiLBOxPu5Eu13k eUz9sHyD6vkgZzjtxXECQAkp4Xerf5TGfQXGXhxIX52yH+N2LtujCdkQZjXAsGdm B2zNzvrlgRmgBrklMTrMYgm1NPcW+bRLGcwgW2PTvNM= -----END RSA PRIVATE KEY----- EOD; $payload = [ 'iss'=>'xiaopohai', //签发人(官方字段:非必需) 'exp'=>time()+3600*24*7, //过期时间(官方字段:非必需) 'aud'=>'everyone', //受众(官方字段:非必需) 'nbf'=>time(), //生效时间(官方字段:非必需) 'iat'=>time(), //签发时间(官方字段:非必需) 'userInfo'=>[ 'id' =>$uid, ], ]; $token = JWT::encode($payload,$privateKey,'HS256'); return $token; } /** * @Author: 小破孩嫩 * @Email: 3584685883@qq.com * @Time: 2021/6/17 16:01 * @param $token * @return int[] * @Description:验证token */ public function checkToken($token){ try{ //公钥 $publicKey = <<<EOD -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8kGa1pSjbSYZVebtTRBLxBz5H 4i2p/llLCrEeQhta5kaQu/RnvuER4W8oDH3+3iuIYW4VQAzyqFpwuzjkDI+17t5t 0tyazyZ8JXw+KgXTxldMPEL95+qVhgXvwtihXC1c5oGbRlEDvDF6Sa53rcFVsYJ4 ehde/zUxo6UvS7UrBQIDAQAB -----END PUBLIC KEY----- EOD; $res = JWT::decode($token,$publicKey,['HS256']); returnResponse('200','请求成功', $res); }catch (Exception $e) { returnResponse(100,$e->getMessage()); } }学习地址:https://github.com/firebase/php-jwt
2022年06月23日
405 阅读
0 评论
0 点赞
2022-06-23
【PHP】RSA 类 和 使用
下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin目录,执行以下命令: a、openssl genrsa -out rsa_private_key.pem 1024 b、openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem c、openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 第一条命令生成原始 RSA私钥文件 rsa_private_key.pem 第二条命令将原始 RSA私钥转换为 pkcs8格式 第三条生成RSA公钥 rsa_public_key.pem 上面几个就可以看出:通过私钥能生成对应的公钥RSA类: <?php class Rsa { /** * 获取私钥 * @return bool|resource */ private static function getPrivateKey() { $abs_path = dirname(__FILE__) . '/rsa_private_key.pem'; $content = file_get_contents($abs_path); return openssl_pkey_get_private($content); } /** * 获取公钥 * @return bool|resource */ private static function getPublicKey() { $abs_path = dirname(__FILE__) . '/rsa_public_key.pem'; $content = file_get_contents($abs_path); return openssl_pkey_get_public($content); } /** * 私钥加密 * @param string $data * @return null|string */ public static function privEncrypt($data = '') { if (!is_string($data)) { return null; } return openssl_private_encrypt($data,$encrypted,self::getPrivateKey()) ? base64_encode($encrypted) : null; } /** * 公钥加密 * @param string $data * @return null|string */ public static function publicEncrypt($data = '') { if (!is_string($data)) { return null; } return openssl_public_encrypt($data,$encrypted,self::getPublicKey()) ? base64_encode($encrypted) : null; } /** * 私钥解密 * @param string $encrypted * @return null */ public static function privDecrypt($encrypted = '') { if (!is_string($encrypted)) { return null; } return (openssl_private_decrypt(base64_decode($encrypted), $decrypted, self::getPrivateKey())) ? $decrypted : null; } /** * 公钥解密 * @param string $encrypted * @return null */ public static function publicDecrypt($encrypted = '') { if (!is_string($encrypted)) { return null; } return (openssl_public_decrypt(base64_decode($encrypted), $decrypted, self::getPublicKey())) ? $decrypted : null; } } **demo:** <?php require_once "Rsa.php"; $rsa = new Rsa(); $data['name'] = 'Tom'; $data['age'] = '20'; $privEncrypt = $rsa->privEncrypt(json_encode($data)); echo '私钥加密后:'.$privEncrypt.'<br>'; $publicDecrypt = $rsa->publicDecrypt($privEncrypt); echo '公钥解密后:'.$publicDecrypt.'<br>'; $publicEncrypt = $rsa->publicEncrypt(json_encode($data)); echo '公钥加密后:'.$publicEncrypt.'<br>'; $privDecrypt = $rsa->privDecrypt($publicEncrypt); echo '私钥解密后:'.$privDecrypt.'<br>'; 也有一些网站提供生成rsa公钥私钥的服务:http://www.bm8.com.cn/webtool/rsa/文章参考:https://www.cnblogs.com/xuweiqiang/p/9784584.html
2022年06月23日
325 阅读
1 评论
0 点赞
2022-06-23
【PHP】单点登录(SingleSignOn,SSO)的思路
用到的工具:JWP类, RSA非对称加密类composer require firebase/php-jwt;JWT包含三部分数据:Header:头部,通常头部有两部分信息:1.token类型:JWT2.加密方式:base64(HS256)Payload:载荷,就是有效数据,一般包含下面信息:1.用户身份信息(注意,这里因为采用base64编码,可解码,因此不要存放敏感信息)2.注册声明:如token的签发时间,过期时间,签发人等这部分也会采用base64编码,得到第二部分数据Signature:签名,是整个数据的认证信息。根据前两步的数据,再加上指定的密钥(secret)(不要泄漏,最好周期性更换),通过base64编码生成。用于验证整个数据完整和可靠性RSA非对称加密:需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。将私钥private_key.pem用在服务器端,公钥发放给android跟ios等前端就是将非对称加密的信息传递到JWT里面的做解密验证
2022年06月23日
105 阅读
0 评论
0 点赞
2022-06-23
【PHP】通过CURL获取结果集
在PHP调用别人的接口,需要用到curl相关操作,本文章集成了多个操作方法,并在今后的工作中不断完善 /** * @Author: 小破孩嫩 * @Email: 3584685883@qq.com * @Time: 2021/4/1 10:39 * @param string $url url地址 * @param bool $params 参数 * @param int $ispost 是否是post请求,默认get * @param int $https 是否是https,默认http * @param int $flbg 返回值是否转成数组,默认不转 * @param int $header 是否传递header值,默认不传,header值格式:$header = ['CLIENT-IP:127.0.0.1','X-FORWARDED-FOR:127.0.0.1']; * @param int $headercontent 是否获取请求的header值内容,默认不获取 * @param int $local 是否使用本地ip进行请求,默认不使用 * @return array|bool|mixed|string * @Description:curl请求 */ public function curl($url, $params = false, $ispost = 0, $https = 0, $flbg = 0, $header = 0,$headercontent = 0,$local = 0){ // $httpInfo = []; $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'); // curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400'); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); if($header){ curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); } if($headercontent){ curl_setopt($ch, CURLOPT_HEADER, 1); } if($local){ $header = [ 'CLIENT-IP:127.0.0.1', 'X-FORWARDED-FOR:127.0.0.1' ]; curl_setopt($ch, CURLOPT_HTTPHEADER, $header); } if($https){ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // 对认证证书来源的检查 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // 从证书中检查SSL加密算法是否存在 } if($ispost){ curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); curl_setopt($ch, CURLOPT_URL, $url); }else{ if($params){ if (is_array($params)) { $params = http_build_query($params); } curl_setopt($ch, CURLOPT_URL, $url . '?' . $params); }else{ curl_setopt($ch, CURLOPT_URL, $url); } } $response = curl_exec($ch); // if($response === FALSE){ // echo "CURL Error: " . curl_error($ch); // return false; // } // $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // $httpInfo = array_merge($httpInfo, curl_getinfo($ch)); if($headercontent){ //对返回的结果进行字符串处理 if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == '200') { $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $headers = substr($response, 0, $headerSize); $body = substr($response, $headerSize); return [$headers,$body]; //body内容是图片 } } curl_close($ch); if ($flbg) { $response = json_decode($response, true); } return $response; } 上面的用本地请求的场景是,被curl请求接口做了IP限制,如果本地不可以用,可以使用下面的方法需要一个有效的代理ip和端口号,有的还需要用户名密码,代码如下:curl_setopt($ch, CURLOPT_PROXY, "http://39.156.69.79:8080");窍门:一般情况下是不需要代理,但是伪造的ip不能用,就ping一下你扒取接口的网址,然后用这个网址的ip做伪造。百分百成功。如遇类似问题不能解决,欢迎留言讨论。
2022年06月23日
82 阅读
0 评论
0 点赞
2022-06-19
【PHP】PHP提取网页的关键词
$meta = get_meta_tags('http://www.emoticode.net/'); $keywords = $meta['keywords']; // Split keywords $keywords = explode(',', $keywords ); // Trim them $keywords = array_map( 'trim', $keywords ); // Remove empty values $keywords = array_filter( $keywords ); print_r( $keywords );更多爬取方法可参考:QueryList
2022年06月19日
119 阅读
0 评论
0 点赞
2022-06-19
【网络安全】常见的网络攻击
CSRF攻击跨站点请求伪造。攻击者盗用用户身份发送恶意请求,执行攻击性代码进行攻击。预防方法:验证HTTP中的referer字段: HTTP中的referer字段中记录了该http的请求来源地址,黑客进行CSRF攻击时,必须在其带有攻击性代码的网站中进行请求伪造,当该请求发送至目标网站中时,referer字段中记录的请求来源地址实际上是黑客的网站地址。在请求地址中添加token验证 CSRF攻击是利用存在cookie中的用户信息进行请求伪造和通过安全验证,在http请求中以参数的形式添加一个随机的token,并在服务器建立一个拦截器进行验证,如果请求中没有token或者token内容不正确,则可以认为是CSRF攻击。在HTTP头中自定义属性并验证。SQL注入SQL注入是一种将SQL代码添加到输入参数中,传递到服务器解析并执行的一种攻击手法。SQL注入攻击是输入参数未经过滤,然后直接拼接到SQL语句当中解析,执行达到预想之外的一种行为,称之为SQL注入攻击。数字注入:OR 1 =1字符串注入(‘#’、’.... ‘):'-- ' (--后面有个空格):'--'后面的字符串都会被当成注释来处理;'#'后所有的字符串都会被当成注释来处理SQL注入是怎么产生的?1)WEB开发人员无法保证所有的输入都已经过滤2)攻击者利用发送给SQL服务器的输入参数构造可执行的SQL代码(可加入到get请求、post请求、http头信息、cookie中)3)数据库未做相应的安全配置如何预防SQL注入?1)严格检查输入变量的类型和格式2)过滤和转义特殊字符3)使用正则表达式过滤传入的参数XSS攻击跨站脚本攻击。通过对网页注入可执行代码且成功地被浏览器 执行,达到攻击的目的。预防方法:mysql_real_escape_string 函数转义 SQL 语句中使用的字符串中的特殊字符。 htmlspecialchars 函数把预定义的字符转换为 HTML 实体。 strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签。Cookie攻击Cookie窃取攻击,最基本的XSS跨站攻击方法就是窃取受害者Cookie信息。Cookie窃取攻击的步骤1、判断网站是否存在反射型XSS/存储型XSS漏洞 2、注入Cookie信息窃取的恶意代码3、 冒充被害人身份登陆网站其他攻击手段攻击手段永远都比防御方法多得多。因此平时的业务中需要及时的添加各种攻击防御策略。
2022年06月19日
75 阅读
0 评论
0 点赞