首页
📷在线壁纸
🎬娱乐天地
🔖友情链接
更多
📝留言板
Search
1
【javascript】JS-向当前url追加参数
2,345 阅读
2
【PHP】生成随机昵称
2,219 阅读
3
【PHP】判断一个字符串是否属于序列化后的数据
2,024 阅读
4
【css】html+css给文章页,做阅读全文
1,975 阅读
5
【PHP】 设计模式(23种)
1,910 阅读
📂默认分类
💓typecho
🏳️🌈代码改变世界
🍇 mysql
🍈 Winform
🍓 golang
🍉 设计模式
🥝 PHP
🍎 python
🍊 nginx
🍋 网络安全
🍍 javascript
🫑 database
🍭文艺范
🍏mac
AI
LLM
image
audio
yolo
3D
code
登录
Search
标签搜索
php
typecho
代码注释
redis
mysql
go
golang
nginx
thinkphp
docker
gin
linux
curl
html
mamp
算法
短网址
构造函数
webhook
代码片段
依然范儿特西
累计撰写
145
篇文章
累计收到
1
条评论
首页
栏目
📂默认分类
💓typecho
🏳️🌈代码改变世界
🍇 mysql
🍈 Winform
🍓 golang
🍉 设计模式
🥝 PHP
🍎 python
🍊 nginx
🍋 网络安全
🍍 javascript
🫑 database
🍭文艺范
🍏mac
AI
LLM
image
audio
yolo
3D
code
页面
📷在线壁纸
🎬娱乐天地
🔖友情链接
📝留言板
搜索到
145
篇与
的结果
2021-06-29
【PHP】RSA非对称加密解密
PHP服务端与客户端交互或者提供开放API时,通常需要对敏感的数据进行加密,这时候rsa非对称加密就能派上用处了。举个通俗易懂的例子,假设我们再登录一个网站,发送账号和密码,请求被拦截了。密码没加密,那攻击者就直接拿到了密码,这是最搓的。密码加密了,是不可逆加密,那攻击者只需要模拟那个请求即可登录。密码加密了,是可逆加密,其中携带有时间等参数,后台可以根据时间等参数来判断是否有效,但因为是在前端加密,其加密方式也能在代码中找到,找到加密方式就可以得出解密方式。但是如果我们使用非对称加密就可以避免以上问题。非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。工作过程如下,甲乙之间使用非对称加密的方式完成了重要信息的安全传输。乙方生成一对密钥(公钥和私钥)并将公钥向其它方公开。得到该公钥的甲方使用该密钥对机密信息进行加密后再发送给乙方。乙方再用自己保存的另一把专用密钥(私钥)对加密后的信息进行解密。乙方只能用其专用密钥(私钥)解密由对应的公钥加密后的信息。在传输过程中,即使攻击者截获了传输的密文,并得到了乙的公钥,也无法破解密文,因为只有乙的私钥才能解密密文。同样,如果乙要回复加密信息给甲,那么需要甲先公布甲的公钥给乙用于加密,甲自己保存甲的私钥用于解密。在非对称加密中使用的主要算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。下面我们通过一个例子来说明如何用PHP来实现RSA的加密解密。<?php class Rsa { public $privateKey = ''; public $publicKey = ''; public function __construct() { $resource = openssl_pkey_new(); openssl_pkey_export($resource, $this->privateKey); $detail = openssl_pkey_get_details($resource); $this->publicKey = $detail['key']; } public function publicEncrypt($data, $publicKey) { openssl_public_encrypt($data, $encrypted, $publicKey); return $encrypted; } public function publicDecrypt($data, $publicKey) { openssl_public_decrypt($data, $decrypted, $publicKey); return $decrypted; } public function privateEncrypt($data, $privateKey) { openssl_private_encrypt($data, $encrypted, $privateKey); return $encrypted; } public function privateDecrypt($data, $privateKey) { openssl_private_decrypt($data, $decrypted, $privateKey); return $decrypted; } } $rsa = new Rsa(); echo "公钥:\n", $rsa->publicKey, "\n"; echo "私钥:\n", $rsa->privateKey, "\n"; // 使用公钥加密 $str = $rsa->publicEncrypt('hello', $rsa->publicKey); // 这里使用base64是为了不出现乱码,默认加密出来的值有乱码 $str = base64_encode($str); echo "公钥加密(base64处理过):\n", $str, "\n"; $str = base64_decode($str); $pubstr = $rsa->publicDecrypt($str, $rsa->publicKey); echo "公钥解密:\n", $pubstr, "\n"; $privstr = $rsa->privateDecrypt($str, $rsa->privateKey); echo "私钥解密:\n", $privstr, "\n"; // 使用私钥加密 $str = $rsa->privateEncrypt('world', $rsa->privateKey); // 这里使用base64是为了不出现乱码,默认加密出来的值有乱码 $str = base64_encode($str); echo "私钥加密(base64处理过):\n", $str, "\n"; $str = base64_decode($str); $pubstr = $rsa->publicDecrypt($str, $rsa->publicKey); echo "公钥解密:\n", $pubstr, "\n"; $privstr = $rsa->privateDecrypt($str, $rsa->privateKey); echo "私钥解密:\n", $privstr, "\n"; 大家执行一下可以看到公钥加密的数据,只有私钥能解密,反之亦然,私钥加密的数据只有公钥能解码。这是PHP端的实现,可用在第三方跟平台之间的数据传输,但如果是前端传到后端该怎么办呢,搜索了一下,发现了这个库https://github.com/travist/jsencrypt使用jsencrypt加密解密的例子如下:<!DOCTYPE html> <html> <head> <title>JSEncrypt Example</title> <base id="basetag" href="/jsencrypt-2.3.0/"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="jquery.js"></script> <script type="text/javascript" src="bin/jsencrypt.js"></script> </head> <body> <div class="container"> <script type="text/javascript"> // Call this code when the page is done loading. $(function() { // Run a quick encryption/decryption when they click. $('#testme').click(function() { // Encrypt with the public key... var encrypt = new JSEncrypt(); encrypt.setPublicKey($('#pubkey').val()); var encrypted = encrypt.encrypt($('#input').val()); console.log(encrypted) // Decrypt with the private key... var decrypt = new JSEncrypt(); decrypt.setPrivateKey($('#privkey').val()); var uncrypted = decrypt.decrypt(encrypted); console.log(uncrypted) // Now a simple check to see if the round-trip worked. if (uncrypted == $('#input').val()) { alert('It works!!!'); } else { alert('Something went wrong....'); } }); }); </script> <label for="privkey">Private Key</label><br/> <textarea id="privkey" rows="15" cols="65">-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDkaTKbAERvJGE0 jGsdPXUI1FpO1uDkBkuuQU4LRv0Quw9r8j+fVNkN9rZVXMV7MiGOgb80Z0k9zRxZ 5KWOqMnSlrpyO3WjhFpDJeSmqZ4wLMFwmxrr31AjabD5Nkf9dQ7RiEIuM49g27+M 3OFvdIPcLgCyXnkl8FwBceBs38QbCXY5MrwlZr13yWZnyj6fbbG8t4atAzJ6bnj3 FZuvynC3QnMaVi6YnTIlBOUOHtqt/jsUTOCWkwKqkZh+RZF2fx3IFkSpJAOMgT5p jSnfEJkK5E4JJHobLo/dFO0J7Gve+qb/lfJ9UpnZe78N1TAvbJiNZoN22ghbuIAW M5qqIqOzAgMBAAECggEBAItUJFtqoVQOpADy+s/+UirNpjzbVJmjwXyNN3cnmW0g PjsBrY+aqUCcUwLlMU2B+fg86w6jRokdWgL3t4m7Kkl8SkUuQgc5z/mP3tdPNkB6 vJDc/GIPeYnwidSrKOTSB/UGoiAesYJK6aCaiCV9tIWVxjUH7eyXnvf+qAChyrUW PG/FirLyYmz1yRG99VKKE+iEIzemGSswU0DI0bwTFQ0MunLeJf0EdT20XppNwnl4 uoRgOBpMkW02vxDDWke2YIpk128KFRtPE3zF7W+Prb3ifMuQHSqDdqTgZA5+G3A9 D+lwczy95+0mIBpJ8rKQGjJ51ZT5WVMET9+Hb9+nUIECgYEA9NluRzIi9tZxwQa2 KdU8WAtWZZQZfG18mSFg8/QYrAGF2TyLAW0mEIe7nQXxPzm50HdpxTJCkUrXGm3u hfPayx18H4oVVYRepSSfV+xe7wdogJWV6i5h/LaZsiTk1O8vF9Cwc3yUyVoMtKsg yVcsONOzo/Kg/vwejQJb1C8dNvMCgYEA7tAewjA25vDmfiWZ0lrWKlwGQZ97+pMU X+N12DWxL1Lvi6jBKXlK+Eiz19Qm/mBz9RxrDDY4/o0IjtTxdOh5thDaiqIcnqQn PiBpm7zbheZOlPBGjFJ1vwueIWvqbx9vcqHik/4xHwuFNwQ+YCSpVpVoqrgoN/h/ fX5+hKm1kEECgYEAzn69UZAICtLKNveZE+jBLqPJJnvjjpur1F1hLfzz/cR/BLnZ pcdOrew7Hu+PCTp+6kB7VJLRr0VF6gVCf3gsUta4AsVqvqeXRoF/XSB84+wEh0Ug nNKnUwEQ2DvjPW3G8rfOyGcN+E5YntogGY3KPtbUDvWmL8WjYlrV5Toi0l8CgYAQ Ujr37JGkAOzPzEQSA1FFvdpTm9G+U1T+JK6GI01DvbhPZC4nZnnAND/OTVqI4hCq vNF4GTCV/Q+Lq3QBGG5RCh/Vf7TTBscD0PVGxoZ+RTozpaQ8rNoNP38EK7ru80gL npK8qI+03nWxR+H3cin8l+N6X3GoOZyE+CMvb+XPwQKBgEeDjwTWxVhH/uksO3pw MgbHjauD6AjuW9jc2a7ngFCWSQxQ3+xK1Spn6pbVdLPiBgInxCIl8d6S1yFU0Uan iZHgy4fs1hdJRSuJ6qydqSwlS2C+gDpyY8ye0i+jq5VYYhKcpJCrCgaQGbleuaUd ldp7v1FD8uyeemknGA35f6Id -----END PRIVATE KEY-----</textarea><br/> <label for="pubkey">Public Key</label><br/> <textarea id="pubkey" rows="15" cols="65">-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5GkymwBEbyRhNIxrHT11 CNRaTtbg5AZLrkFOC0b9ELsPa/I/n1TZDfa2VVzFezIhjoG/NGdJPc0cWeSljqjJ 0pa6cjt1o4RaQyXkpqmeMCzBcJsa699QI2mw+TZH/XUO0YhCLjOPYNu/jNzhb3SD 3C4Asl55JfBcAXHgbN/EGwl2OTK8JWa9d8lmZ8o+n22xvLeGrQMyem549xWbr8pw t0JzGlYumJ0yJQTlDh7arf47FEzglpMCqpGYfkWRdn8dyBZEqSQDjIE+aY0p3xCZ CuROCSR6Gy6P3RTtCexr3vqm/5XyfVKZ2Xu/DdUwL2yYjWaDdtoIW7iAFjOaqiKj swIDAQAB -----END PUBLIC KEY-----</textarea><br/> <label for="input">Text to encrypt:</label><br/> <textarea id="input" name="input" type="text" rows=4 cols=70>This is a test!</textarea><br/> <input id="testme" type="button" value="Test Me!!!" /><br/> </div> </body> </html>其中的公钥和私钥都是上面PHP代码中生成的,这边好像只有公钥加密,私钥解密。拿到其中打印出的加密后的数据,尝试在PHP中进行解密,可以看到也能解密成功。代码如下:<?php class Rsa { public $privateKey = '-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDkaTKbAERvJGE0 jGsdPXUI1FpO1uDkBkuuQU4LRv0Quw9r8j+fVNkN9rZVXMV7MiGOgb80Z0k9zRxZ 5KWOqMnSlrpyO3WjhFpDJeSmqZ4wLMFwmxrr31AjabD5Nkf9dQ7RiEIuM49g27+M 3OFvdIPcLgCyXnkl8FwBceBs38QbCXY5MrwlZr13yWZnyj6fbbG8t4atAzJ6bnj3 FZuvynC3QnMaVi6YnTIlBOUOHtqt/jsUTOCWkwKqkZh+RZF2fx3IFkSpJAOMgT5p jSnfEJkK5E4JJHobLo/dFO0J7Gve+qb/lfJ9UpnZe78N1TAvbJiNZoN22ghbuIAW M5qqIqOzAgMBAAECggEBAItUJFtqoVQOpADy+s/+UirNpjzbVJmjwXyNN3cnmW0g PjsBrY+aqUCcUwLlMU2B+fg86w6jRokdWgL3t4m7Kkl8SkUuQgc5z/mP3tdPNkB6 vJDc/GIPeYnwidSrKOTSB/UGoiAesYJK6aCaiCV9tIWVxjUH7eyXnvf+qAChyrUW PG/FirLyYmz1yRG99VKKE+iEIzemGSswU0DI0bwTFQ0MunLeJf0EdT20XppNwnl4 uoRgOBpMkW02vxDDWke2YIpk128KFRtPE3zF7W+Prb3ifMuQHSqDdqTgZA5+G3A9 D+lwczy95+0mIBpJ8rKQGjJ51ZT5WVMET9+Hb9+nUIECgYEA9NluRzIi9tZxwQa2 KdU8WAtWZZQZfG18mSFg8/QYrAGF2TyLAW0mEIe7nQXxPzm50HdpxTJCkUrXGm3u hfPayx18H4oVVYRepSSfV+xe7wdogJWV6i5h/LaZsiTk1O8vF9Cwc3yUyVoMtKsg yVcsONOzo/Kg/vwejQJb1C8dNvMCgYEA7tAewjA25vDmfiWZ0lrWKlwGQZ97+pMU X+N12DWxL1Lvi6jBKXlK+Eiz19Qm/mBz9RxrDDY4/o0IjtTxdOh5thDaiqIcnqQn PiBpm7zbheZOlPBGjFJ1vwueIWvqbx9vcqHik/4xHwuFNwQ+YCSpVpVoqrgoN/h/ fX5+hKm1kEECgYEAzn69UZAICtLKNveZE+jBLqPJJnvjjpur1F1hLfzz/cR/BLnZ pcdOrew7Hu+PCTp+6kB7VJLRr0VF6gVCf3gsUta4AsVqvqeXRoF/XSB84+wEh0Ug nNKnUwEQ2DvjPW3G8rfOyGcN+E5YntogGY3KPtbUDvWmL8WjYlrV5Toi0l8CgYAQ Ujr37JGkAOzPzEQSA1FFvdpTm9G+U1T+JK6GI01DvbhPZC4nZnnAND/OTVqI4hCq vNF4GTCV/Q+Lq3QBGG5RCh/Vf7TTBscD0PVGxoZ+RTozpaQ8rNoNP38EK7ru80gL npK8qI+03nWxR+H3cin8l+N6X3GoOZyE+CMvb+XPwQKBgEeDjwTWxVhH/uksO3pw MgbHjauD6AjuW9jc2a7ngFCWSQxQ3+xK1Spn6pbVdLPiBgInxCIl8d6S1yFU0Uan iZHgy4fs1hdJRSuJ6qydqSwlS2C+gDpyY8ye0i+jq5VYYhKcpJCrCgaQGbleuaUd ldp7v1FD8uyeemknGA35f6Id -----END PRIVATE KEY-----'; public $publicKey = '-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5GkymwBEbyRhNIxrHT11 CNRaTtbg5AZLrkFOC0b9ELsPa/I/n1TZDfa2VVzFezIhjoG/NGdJPc0cWeSljqjJ 0pa6cjt1o4RaQyXkpqmeMCzBcJsa699QI2mw+TZH/XUO0YhCLjOPYNu/jNzhb3SD 3C4Asl55JfBcAXHgbN/EGwl2OTK8JWa9d8lmZ8o+n22xvLeGrQMyem549xWbr8pw t0JzGlYumJ0yJQTlDh7arf47FEzglpMCqpGYfkWRdn8dyBZEqSQDjIE+aY0p3xCZ CuROCSR6Gy6P3RTtCexr3vqm/5XyfVKZ2Xu/DdUwL2yYjWaDdtoIW7iAFjOaqiKj swIDAQAB -----END PUBLIC KEY-----'; public function __construct() { } public function publicEncrypt($data, $publicKey) { openssl_public_encrypt($data, $encrypted, $publicKey); return $encrypted; } public function publicDecrypt($data, $publicKey) { openssl_public_decrypt($data, $decrypted, $publicKey); return $decrypted; } public function privateEncrypt($data, $privateKey) { openssl_private_encrypt($data, $encrypted, $privateKey); return $encrypted; } public function privateDecrypt($data, $privateKey) { openssl_private_decrypt($data, $decrypted, $privateKey); return $decrypted; } } $rsa = new Rsa(); // 使用公钥加密的内容 $str = 'IUMBGcLwJECdxUu3LMbeEhGQdoRjCLqFwfZQBO/Odh3tClbq76Tva7yYqTVxexXLmZ3uY8DrOk/XwcVVRr6g9rBnv/zxBxUShCdN0CwkoguvI+6Oju2aUBlM4FhUp+gmasa5YfqylEp1RpsVAp67GMGlxZvp0ekfhFXkjSqAguPd7dKq5YjftP12xOyuJHAzzg7U+eHxffxnneKqXkK7QrfQD6VrLpbYmayPSjMza/RbjXF+d85UeUZUaF25PZ7Y7kD4Yo7/hY/L6peeOkI5//tpl6U4QY9VsFsjAbIpNMsZuNjE/cZ57Kc5WScPsmy0o9wsp5DUEJmu+YYmr6adoA=='; $str = base64_decode($str); $pubstr = $rsa->publicDecrypt($str, $rsa->publicKey); echo "公钥解密:\n", $pubstr, "\n"; $privstr = $rsa->privateDecrypt($str, $rsa->privateKey); echo "私钥解密:\n", $privstr, "\n"; 参考资料百度百科:非对称加密: https://baike.baidu.com/item/%E9%9D%9E%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86/9874417?fr=aladdinphp加密扩展: https://www.php.net/manual/zh/book.openssl.php
2021年06月29日
231 阅读
0 评论
1 点赞
2021-06-28
【PHP】cURL error 60: SSL certificate unable to get local issuer certificate
导致该问题的原因在于没有配置curl.cainfo,该配置位于php.ini中解决方案:1 下载cacert.pemhttps://curl.haxx.se/ca/cacert.pem2 配置 php.ini[curl] ; A default value for the CURLOPT_CAINFO option. This is required to be an ; absolute path. curl.cainfo = 【你的绝对路径】记得重启php
2021年06月28日
196 阅读
0 评论
1 点赞
2021-06-26
【mysql】解决报错:SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client
错误信息提示SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client原因由于MySQL 8默认使用了新的密码验证插件:caching_sha2_password,而低版本的PHP版本中所带的mysqlnd无法支持这种验证。故报“请求客户端未知的身份验证方法”。解决方案一可以通过phpinfo()函数了解当前安装的PHP是否支持caching_sha2_password方案二更改加密方式 alter user 'root'@'localhost' identified with mysql_native_password by '123456'; flush privileges;
2021年06月26日
359 阅读
1 评论
2 点赞
2021-06-24
【html】Layui 静态表格复选框全选
html<table class="layui-table" > <thead> <tr> <th><input type="checkbox" name="" lay-skin="primary" lay-filter="allChoose"></th> <th>id</th> </tr> </thead> <tbody> {foreach $data_list as $key=>$vo } <tr> <td><input type="checkbox" name="id_array[]" value="{$vo.id}" lay-skin="primary" lay-filter="itemChoose" ></td> <td>{$vo.id}</td> </tr> {/foreach} </tbody> </table> js <script> layui.use(['form', 'layedit','jquery','element','table'], function() { var form = layui.form; table = layui.table; form.render(); //全选or 取消全选 form.on('checkbox(allChoose)', function(data){ //所有 var all_child = $(data.elem).parents('table').find('tbody input[type="checkbox"]'); //data.elem.checked 值为 true 或者 false all_child.each(function(index, item){ item.checked = data.elem.checked; }); form.render('checkbox'); //获取已选中 var checked_child = $(data.elem).parents('table').find('tbody input[type="checkbox"]:checked'); layer.msg('选中了:'+ checked_child.length + ' 个'); //获取选中的值 var arr_box = []; checked_child.each(function() { arr_box.push($(this).val()); }); console.log(arr_box.toString()); }); //全选和部分选中时候,表头全选按钮的样式变化 form.on('checkbox(itemChoose)', function (data) { var sib = $(data.elem).parents('table').find('tbody input[type="checkbox"]:checked').length; var total = $(data.elem).parents('table').find('tbody input[type="checkbox"]').length; if (sib == total) { $(data.elem).parents('table').find('thead input[type="checkbox"]').prop("checked", true); } else { $(data.elem).parents('table').find('thead input[type="checkbox"]').prop("checked",false); } form.render('checkbox'); //获取已选中 var child = $(data.elem).parents('table').find('tbody input[type="checkbox"]:checked'); layer.msg('选中了:'+ child.length + ' 个'); //获取选中的值 var arr_box = []; child.each(function() { arr_box.push($(this).val()); }); console.log(arr_box.toString()); }); }); </script>
2021年06月24日
261 阅读
0 评论
3 点赞
2021-06-24
【PHP】二维数组根据多个字段进行排序
函数 array_multisort()array_multisort() 函数返回一个排序数组。您可以输入一个或多个数组。函数先对第一个数组进行排序,接着是其他数组,如果两个或多个值相同,它将对下一个数组进行排序。函数 array_column()array_column()从记录集中取出 last_name 列:代码<?php $data = [ ['name'=>'laofan1','age'=>18,'space'=>3], ['name'=>'laofan2','age'=>19,'space'=>1], ['name'=>'laofan3','age'=>19,'space'=>2], ['name'=>'laofan4','age'=>17,'space'=>4], ]; array_multisort(array_column($data, 'age'),SORT_DESC,array_column($data, 'space'),SORT_DESC, $data); print_r($data); ?> 结果Array ( [0] => Array ( [name] => laofan3 [age] => 19 [space] => 2 ) [1] => Array ( [name] => laofan2 [age] => 19 [space] => 1 ) [2] => Array ( [name] => laofan1 [age] => 18 [space] => 3 ) [3] => Array ( [name] => laofan4 [age] => 17 [space] => 4 ) )
2021年06月24日
130 阅读
0 评论
0 点赞
2021-06-24
【PHP】隐藏真实的视频播放地址
前言在做视频站,往往不想让用户看到视频真实地址,于是就有了这个代码代码示例html 代码<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>videojs</title> </head> <body> <video class="video-js vjs-big-play-centered" controls data-setup="{}" width="960" height="400" preload="auto" > <source src="https://richerdyoung.com/test.php" type="video/mp4"></source> </video> <link href="//cdn.bootcss.com/video.js/7.0.0-alpha.1/alt/video-js-cdn.css" rel="stylesheet"> <script src="//cdn.bootcss.com/video.js/7.0.0-alpha.1/video.min.js"></script> </body> </html> test.php<?php ini_set('memory_limit', '1024M'); //修改脚本的最大运行内存 set_time_limit(600); //设置超时限制为 10分钟 //视频地址可以换成你的来测试 $play_url = 'https://richerdyoung.com/test.mp4'; //输出视频流 outPutStream($real_paly_url);die(); //输出视频流 function outPutStream($videoUrl) { if(!$videoUrl){ header('HTTP/1.1 500 Internal Server Error'); echo "Error: Video cannot be played !"; exit(); } //获取视频大小 $header_array = get_headers($videoUrl, true); $sizeTemp = $header_array['Content-Length']; if (is_array($sizeTemp)) { $size = $sizeTemp[count($sizeTemp) - 1]; } else { $size = $sizeTemp; } //初始参数 $start = 0; $end = $size - 1; $length = $size; $buffer = 1024 * 1024 * 10; // 输出的流大小 10m //计算 Range $ranges_arr = array(); if (isset($_SERVER['HTTP_RANGE'])) { if (!preg_match('/^bytes=\d*-\d*(,\d*-\d*)*$/i', $_SERVER['HTTP_RANGE'])) { header('HTTP/1.1 416 Requested Range Not Satisfiable'); } $ranges = explode(',', substr($_SERVER['HTTP_RANGE'], 6)); foreach ($ranges as $range) { $parts = explode('-', $range); $ranges_arr[] = array($parts[0], $parts[1]); } $ranges = $ranges_arr[0]; $start = (int)$ranges[0]; if ($ranges[1] != '') { $end = (int)$ranges[1]; } $length = min($end - $start + 1, $buffer); $end = $start + $length - 1; }else{ // php 文件第一次浏览器请求不会携带 RANGE 为了提升加载速度 默认请求 1 个字节的数据 $start=0; $end=1; $length=2; } //添加 Range 分段请求 $header = array("Range:bytes={$start}-{$end}"); #发起请求 $ch2 = curl_init(); curl_setopt($ch2, CURLOPT_URL, $videoUrl); curl_setopt($ch2, CURLOPT_TIMEOUT, 60); curl_setopt($ch2, CURLOPT_HTTPHEADER, $header); //设置读取的缓存区大小 curl_setopt($ch2, CURLOPT_BUFFERSIZE, $buffer); // 关闭安全认证 curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch2, CURLOPT_SSL_VERIFYHOST, false); //追踪返回302状态码,继续抓取 curl_setopt($ch2, CURLOPT_HEADER, false); curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch2, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch2, CURLOPT_CONNECTTIMEOUT, 60); curl_setopt($ch2, CURLOPT_NOBODY, false); curl_setopt($ch2, CURLOPT_REFERER, $videoUrl); //模拟来路 curl_setopt($ch2, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36 Edg/85.0.564.44"); $content = curl_exec($ch2); curl_close($ch2); #设置响应头 header('HTTP/1.1 206 PARTIAL CONTENT'); header("Accept-Ranges: bytes"); header("Connection: keep-alive"); header("Content-Type: video/mp4"); header("Access-Control-Allow-Origin: *"); //为了兼容 ios UC这类浏览器 这里加个判断 UC的 Content-Range 是 起始值-总大小减一 if($end!=1){ $end=$size-1; } header("Content-Range: bytes {$start}-{$end}/{$size}"); //设置流的实际大小 header("Content-Length: ".strlen($content)); //清空缓存区 ob_clean(); //输出视频流 echo $content; //销毁内存 unset($content); } function PutMovie($file) { ini_set('memory_limit','512M'); header("Content-type: video/mp4"); header("Accept-Ranges: bytes"); ob_start(); // ------ 开启缓冲区 $size = filesize($file); if(isset($_SERVER['HTTP_RANGE'])){ header("HTTP/1.1 206 Partial Content"); list($name, $range) = explode("=", $_SERVER['HTTP_RANGE']); list($begin, $end) =explode("-", $range); if($end == 0) $end = $size - 1; }else { $begin = 0; $end = $size - 1; } header("Content-Length: " . ($end - $begin + 1)); header("Content-Disposition: filename=".basename($file)); header("Content-Range: bytes ".$begin."-".$end."/".$size); try { $fp = fopen($file, 'r'); } catch (\Exception $e) { echo $e->getTraceAsString();exit; } fseek($fp, $begin); $contents = ''; while(!feof($fp)) { $p = min(1024, $end - $begin + 1); //$begin += $p; $contents .= fread($fp, $p); //echo fread($fp, $p); } //$contents = ltrim($contents, "\XEF\XBB\XBF"); ob_end_clean(); // ------ 清除缓冲区 ob_clean(); //$contents = substr($contents, 3); fclose($fp); exit($contents); } ?> 亲测可用! ,有问题可联系我一起讨论
2021年06月24日
259 阅读
0 评论
3 点赞
2021-06-22
【PHP】zfaka部署时候关闭pathinfo
开源项目地址:https://github.com/zlkbdotnet/zfaka部署的时候,会提示重定向次数过多,解决办法:1 PHP 配置修改,关闭 cgi.fix_pathinfo2 注释掉 include pathinfo.conf 文件位置: /www/server/nginx/conf/enable-php-72.conf location ~ [^/]\.php(/|$) { try_files $uri =404; fastcgi_pass unix:/tmp/php-cgi-72.sock; fastcgi_index index.php; include fastcgi.conf; # include pathinfo.conf; } 重启PHP 即可
2021年06月22日
155 阅读
0 评论
0 点赞
2021-06-17
【mysql】让数据库支持emoji表情
此处我们以typecho的文章表为例依次执行下列sqlALTER DATABASE typecho_blog CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE typecho_blog.typecho_contents CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;查看结果SHOW VARIABLES WHERE Variable_name LIKE 'character%' OR Variable_name LIKE 'collation%';显示如下,即为成功!Variable_name Value character_set_client utf8mb4 character_set_connection utf8mb4 character_set_database utf8mb4 character_set_filesystem binary character_set_results utf8mb4 character_set_server utf8mb4 character_set_system utf8 character_sets_dir /www/server/mysql/share/charsets/ collation_connection utf8mb4_general_ci collation_database utf8mb4_unicode_ci collation_server utf8mb4_general_ci
2021年06月17日
192 阅读
0 评论
0 点赞
2021-06-10
【Typecho】Typecho 防黑安全加固
删除安装文件成功安装后删除 install.php 文件、install/ 文件夹。修改后台地址把 admin 修改为黑客猜不到的名字,例如 pipixia,防止黑客穷举密码。修改`admin`文件夹名称修改 admin 文件夹名称为你喜欢的名称,例如 pipixia修改配置文件以适配修改后的`admin`路径修改 config.inc.php修改为以下代码,我就当修改为 pipixia 了。/** 后台路径(相对路径) */ define('__TYPECHO_ADMIN_DIR__', '/pipixia/');好了。现在你可以访问你的域名/pipixia/ 了。这就是你的新的后台地址,原来的你的域名/admin/ 已经不能访问了。屏蔽 usr、var 目录下 php 文件的访问屏蔽 usr、var 目录下 php 文件的访问可以阻止黑客访问到他上传的 php木马。我们利用 Rewrite 伪静态机制来做。我这里以 Apache 服务器为例,大部分虚拟主机都是 Apache。LiteSpeed Web Server 也使用的是 Apache 的规则。我们同时屏蔽 config.inc.php 和.htaccess 的访问。屏蔽原理就是把要屏蔽的请求重定向到首页文件,首页文件会当成文章名来解析,没有同名文章就会返回 404 未找到。所以就算黑客上传了木马也只会得到 404 未找到的响应。文件名:.htaccess<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [E=PATH_INFO:$1] RewriteRule (var|usr)(.+ph*)$ index.php [E=PATH_INFO:$1] RewriteRule (config.inc.php|.htaccess)$ index.php [L,E=PATH_INFO:$1] </IfModule>新建.htaccess 文件添加以上内容,上传到你 typecho 博客的根目录就可以了。Nginx if (!-e $request_filename) { rewrite ^(.*)$ /index.php$1; } rewrite /(var|usr)(.+ph*)$ /index.php; rewrite /(config.inc.php|.htaccess)$ /index.php last;
2021年06月10日
286 阅读
3 评论
2 点赞
2021-06-09
【redis】PHP Redis扩展无法加载的问题解决方法
问题安装命令pecl install redis安装之后,出现报错:PHP Warning: PHP Startup: Unable to load dynamic library 'redis.so' (tried: /usr/lib64/php/modules/redis.so (/usr/lib64/php/modules/redis.so: undefined symbol: php_json_decode_ex), /usr/lib64/php/modules/redis.so.so (/usr/ lib64/php/modules/redis.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0 解决办法1 配置 php.ini在php.ini中一定要配置extension_dir和extension,如:extension_dir = "/usr/lib64/php/modules/" extension=redis.so2.配置redis.ini# 在/etc/php.d/目录中创建redis.ini文件 vim redis.ini # 文件中添加: extension=redis.so3.重启php-fpm即可systemctl restart php-fpm
2021年06月09日
319 阅读
0 评论
0 点赞
1
...
8
9
10
...
15