<?xml version="1.0" encoding="UTF-8"?>
<rss>
<channel>
<title>Rick 's BLOG</title>
<link>https://www.rickw.cn/</link>
<Description>Rick 's BLOG</Description>
<language>zh-cn</language>
<copyright>Copyright 2004-2025 Rick</copyright>
<webMaster>redcheek@gmail.net</webMaster>
<image>
	<title>Rick 's BLOG</title> 
	<url>https://www.rickw.cn/images/logos.gif</url> 
	<link>https://www.rickw.cn/</link> 
	<description>Rick 's BLOG</description> 
</image>
<item>
<link>https://www.rickw.cn/blogview/337</link>
<title><![CDATA[Sublime Text 4 Build 4180 安装激活]]></title>
<author>rick</author>
<category>原创作品</category>
<pubDate>2024-12-05 12:04:25</pubDate>
<guid>https://www.rickw.cn/blogview/337</guid>
	
<description><![CDATA[Sublime&nbsp;Text4&nbsp;目前最新版本是&nbsp;BUILD&nbsp;4180，发布日期&nbsp;2024年8月6日(6&nbsp;Aug&nbsp;2024)<br />
<br />
之前的激活方式【<a target="_blank" href="/blogview/273">&nbsp;Sublime&nbsp;Text&nbsp;4&nbsp;下载&amp;激活(4169)&nbsp;</a>】已经失效。<br />
<br />
<h2>最新版本的激活方式如下：</h2><br />
<br />
激活的操作方式和之前的激活方式基本差不多，详细操作方式可以参考之前的文章。<br />
主要区别是<strong>【处理许可证验证逻辑】</strong>查找替换的内容有变更。<br />
<br />
<h2>新的查找替换内容如下：</h2><br />
<div class="txt_main">查找：807905000f94c2<br />
替换：c6410501b20090<br />
</div><br />
<br />
其它的操作不变。<br />
<br />
&nbsp;<h3><a target="_blank" href="/blogview/274">Sublime&nbsp;Text4&nbsp;安装中文语言包</a>&nbsp;</h3><br />
<br />
<br />
<h2>最后这里提供备用下载地址</h2><br />
<br />
<img src="/images/download.gif" align="absmiddle" /><a target="_blank" href="http://dl.rickw.cn/f/20272120-1432870660-abc432">&nbsp;Sublime&nbsp;Text4&nbsp;Build4180&nbsp;X64原版下载</a><br />
<br />
<img src="/images/download.gif" align="absmiddle" /><a target="_blank" href="http://dl.rickw.cn/f/20272120-1432870627-589f2f">&nbsp;Sublime&nbsp;Text4&nbsp;Build4180&nbsp;X64补丁下载</a><br />
<br />
]]></description>
</item>
<item>
<link>https://www.rickw.cn/blogview/299</link>
<title><![CDATA[【宇轩】ASP Web Server服务器 V2.1]]></title>
<author>rick</author>
<category>原创作品</category>
<pubDate>2023-12-09 14:09:10</pubDate>
<guid>https://www.rickw.cn/blogview/299</guid>
	
<description><![CDATA[2023-12-09&nbsp;更新V2.1<br />
1，增加支持无参数调用Request.QueryString的方式。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;直接无参调用&nbsp;Request.QueryString&nbsp;会返回Url中?号后面的原始查询字符串。<br />
2，改善了对runt&nbsp;server的script标签的兼容性。标签属性有双引号和无双引号的情况都支持。<br />
3，增加设置选项，在出错时可以输出服务器变量信息。<br />
<br />
2.0版本参考<a target="_blank" href="/blogview/294">【宇轩】ASP&nbsp;WEB服务器</a>&nbsp;<br />
<br />
程序下载：<br />
<br />
<img src="/images/download.gif" align="absmiddle" /><a target="_blank" href="http://dl.rickw.cn/f/20272120-987188230-519721">【宇轩】ASP&nbsp;Web&nbsp;Server服务器&nbsp;V2.1.rar</a><br />
]]></description>
</item>
<item>
<link>https://www.rickw.cn/blogview/294</link>
<title><![CDATA[【宇轩】ASP WEB服务器]]></title>
<author>rick</author>
<category>原创作品</category>
<pubDate>2023-12-06 23:58:13</pubDate>
<guid>https://www.rickw.cn/blogview/294</guid>
	
<description><![CDATA[最近整理资料，需要查看一些老的asp程序的数据信息。在网上找了几个简易aspweb程序，都没有成功。<br />
在网上还找到了自己十几年写的紫雨轩aspweb&nbsp;server程序，也一样有问题没有成功。<br />
在仓库里面找了一下发现源代码还没有丢，就翻出来修改了一下。<br />
我这边备份的几个asp博客程序、asp内容管理程序已经能正常运行，查看数据信息。<br />
<br />
更新记录：<br />
2023-12-06&nbsp;【宇轩】ASP&nbsp;Web&nbsp;Server&nbsp;V2.0  <br />
1，增加支持&nbsp;UTF-8&nbsp;charset&nbsp;和&nbsp;codepage。<br />
2，修正了几种特殊情况下&nbsp;Server&nbsp;Side&nbsp;Include&nbsp;异常的问题。<br />
3，修正了文件中含有&nbsp;Unix格式换行符时的处理异常问题。<br />
4，增加了的JScript脚本语言的支持。<br />
5，增加了对&nbsp;runat&nbsp;server的script标签的支持。<br />
6，优化了&nbsp;Server.MapPath&nbsp;的路径判断，会根据网站根目录和文件当前目录自动判断。<br />
7，修正了有些情况下ASP输出图片验证码的问题。<br />
8，优化了出错时的错误信息显示。<br />
<br />
2005-03-22&nbsp;V1.0<br />
1，完整实现&nbsp;response,request对象。【上传文件，图片验证码&nbsp;测试通过】&nbsp;<br />
2，增强了对中文文件名的处理&nbsp;<br />
3，实现session对象。&nbsp;<br />
4，增加多重缺省文件的设置。<br />
<br />
<br />
软件运行截图：<br />
<img src="https://ooo.0x0.ooo/2023/12/06/OApPuI.png" border="0" style="max-width:90%;height:auto;"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="showImage(this);" /><br />
<br />
错误信息的显示效果：<br />
<img src="https://ooo.0x0.ooo/2023/12/06/OApvvc.jpg" border="0" style="max-width:90%;height:auto;"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="showImage(this);" /><br />
<br />
ASP博客程序运行画面：<br />
<img src="https://ooo.0x0.ooo/2023/12/06/OApydr.png" border="0" style="max-width:90%;height:auto;"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="showImage(this);" /><br />
<br />
<br />
软件下载：<br />
<img src="/images/download.gif" align="absmiddle" /><a target="_blank" href="http://dl.rickw.cn/f/20272120-986271028-e235c9">【宇轩】ASPWebServerV2.0.rar</a><br />
]]></description>
</item>
<item>
<link>https://www.rickw.cn/blogview/291</link>
<title><![CDATA[在CodeIgniter4实现前端切换风格模版功能，并允许风格模版只实现部分页面]]></title>
<author>rick</author>
<category>原创作品</category>
<pubDate>2023-12-05 18:26:41</pubDate>
<guid>https://www.rickw.cn/blogview/291</guid>
	
<description><![CDATA[准备给博客系统增加风格模版功能，同时还需要允许新的风格模版按需实现部分页面即可。<br />
<br />
一种简单的实现方式是，直接全局切换风格模版目录，这样的缺点是要求新的风格模版必须实现所有页面。<br />
<br />
而更优雅的实现方式是：允许风格模版按需实现页面，新的风格模板没有实现的页面自动使用默认模版页面。<br />
<br />
<strong>这里介绍两种改造实现的方法：</strong><br />
<h2>1，增加新的全局函数&nbsp;templateview()</h2><br />
<div class="txt_main">&nbsp;templateview()&nbsp;的函数原型和功能对应CodeIgniter4框架自身的函数&nbsp;view()。<br />
<font color="red">区别就是&nbsp;templateview&nbsp;函数会自动处理风格问题。</font><br />
函数代码添加到APP\Common.php中：<br />
<script type="text/javascript">window.attachEvent("onload",function (){AutoSizeDIV('CODE_CkxESWDzsjVR')})</script><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="code_head"><tr><td></td><td align="right"><a href="javascript:CopyText(document.all.CODE_CkxESWDzsjVR);">[复制到剪贴板] </a></td></tr></table><div class="code_main" id="CODE_CkxESWDzsjVR" style="overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;"><code><span style="color: #000000"><br />
<span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">templateview</span><span style="color: #007700">(</span><span style="color: #0000BB">$page</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$data</span><span style="color: #007700">=[],&nbsp;</span><span style="color: #0000BB">$options&nbsp;</span><span style="color: #007700">=&nbsp;[]){<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">currentControl</span><span style="color: #007700">()-&gt;</span><span style="color: #0000BB">templateview</span><span style="color: #007700">(</span><span style="color: #0000BB">$page</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$data</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$options</span><span style="color: #007700">);<br />}&nbsp;</span><br />
</span><br />
</code></div><br />
这里的全局函数只是提供了一个调用封装，我们会将实际实现添加到BaseController中。<br />
这里用到了在全局函数中访问当前控制器实例的方法，可以参考之前的文章实现&nbsp;<a target="_blank" href="/blogview/278">CodeIgniter4中如何在view或者helper函数中访问当前控制器对象</a>。<br />
<br />
在BaseController中添加如下实现代码：<br />
<script type="text/javascript">window.attachEvent("onload",function (){AutoSizeDIV('CODE_IBBbc84PGfGY')})</script><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="code_head"><tr><td></td><td align="right"><a href="javascript:CopyText(document.all.CODE_IBBbc84PGfGY);">[复制到剪贴板] </a></td></tr></table><div class="code_main" id="CODE_IBBbc84PGfGY" style="overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;"><code><span style="color: #000000"><br />
<span style="color: #FF8000">/**<br />&nbsp;*&nbsp;视图模版的路径<br />&nbsp;*/&nbsp;<br /></span><span style="color: #007700">private&nbsp;</span><span style="color: #0000BB">$viewPath&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">APPPATH&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #DD0000">'Views/templates/'</span><span style="color: #007700">;&nbsp;&nbsp;<br /></span><span style="color: #FF8000">//当前风格模版名称<br /></span><span style="color: #007700">private&nbsp;</span><span style="color: #0000BB">$template&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">null</span><span style="color: #007700">;<br /><br />public&nbsp;function&nbsp;</span><span style="color: #0000BB">templateview</span><span style="color: #007700">(</span><span style="color: #0000BB">$page</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$data</span><span style="color: #007700">=[],&nbsp;</span><span style="color: #0000BB">$options&nbsp;</span><span style="color: #007700">=&nbsp;[]){<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">view</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">templateFile</span><span style="color: #007700">(</span><span style="color: #0000BB">$page</span><span style="color: #007700">),&nbsp;</span><span style="color: #0000BB">$data</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$options</span><span style="color: #007700">);<br />}<br /></span><span style="color: #FF8000">/**<br />&nbsp;*&nbsp;根据风格模版获取视图文件，不存在时返回默认模版文件<br />&nbsp;*/&nbsp;<br /></span><span style="color: #007700">public&nbsp;function&nbsp;</span><span style="color: #0000BB">templateFile</span><span style="color: #007700">(</span><span style="color: #0000BB">$view</span><span style="color: #007700">){<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$fileExt&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">pathinfo</span><span style="color: #007700">(</span><span style="color: #0000BB">$view</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">PATHINFO_EXTENSION</span><span style="color: #007700">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$viewfile&nbsp;</span><span style="color: #007700">=&nbsp;empty(</span><span style="color: #0000BB">$fileExt</span><span style="color: #007700">)&nbsp;?&nbsp;</span><span style="color: #0000BB">$view&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #DD0000">'.php'&nbsp;</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">$view</span><span style="color: #007700">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if(empty(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">template</span><span style="color: #007700">))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #DD0000">'default/'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">$viewfile</span><span style="color: #007700">;</span><span style="color: #FF8000">//默认视图文件<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$viewfile&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">viewPath&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">template&nbsp;</span><span style="color: #007700">.</span><span style="color: #DD0000">'/'</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">$viewfile</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000BB">is_file</span><span style="color: #007700">(</span><span style="color: #0000BB">$viewfile</span><span style="color: #007700">))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">template&nbsp;</span><span style="color: #007700">.</span><span style="color: #DD0000">'/'</span><span style="color: #007700">.</span><span style="color: #0000BB">$viewfile</span><span style="color: #007700">;</span><span style="color: #FF8000">//风格模版的视图文件<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">return&nbsp;</span><span style="color: #DD0000">'default/'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">$viewfile</span><span style="color: #007700">;</span><span style="color: #FF8000">//默认视图文件<br /></span><span style="color: #007700">}&nbsp;</span><br />
</span><br />
</code></div><br />
<br />
这样主要工作就算完成了。<br />
其它需要调整的地方<br />
<ol type="1"><br />
<li>在Controller的初始化代码中给&nbsp;$this-&gt;template&nbsp;属性赋值。<br />
<li>控制器中调用&nbsp;view()&nbsp;函数的地方，如果需要使用风格模版功能，改为调用&nbsp;$this-&gt;templateview()函数或者全局函数&nbsp;templateview()<br />
<li>在视图文件中如果调用其它视图的地方如&lt;?=view('header')?&gt;&nbsp;改为&nbsp;&lt;?=templateview('header')?&gt;<br />
</ul></ol><br />
</div><br />
<br />
<h2>第二种实现方式</h2><br />
<div class="txt_main">直接替换框架的&nbsp;view()&nbsp;函数。<br />
函数代码添加到APP\Common.php中完成函数替换：<br />
<script type="text/javascript">window.attachEvent("onload",function (){AutoSizeDIV('CODE_PYfT405A8nW1')})</script><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="code_head"><tr><td></td><td align="right"><a href="javascript:CopyText(document.all.CODE_PYfT405A8nW1);">[复制到剪贴板] </a></td></tr></table><div class="code_main" id="CODE_PYfT405A8nW1" style="overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;"><code><span style="color: #000000"><br />
<span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">view</span><span style="color: #007700">(</span><span style="color: #0000BB">$page</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$data</span><span style="color: #007700">=[],&nbsp;</span><span style="color: #0000BB">$options&nbsp;</span><span style="color: #007700">=&nbsp;[]){<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">currentControl</span><span style="color: #007700">()-&gt;</span><span style="color: #0000BB">templateview</span><span style="color: #007700">(</span><span style="color: #0000BB">$page</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$data</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$options</span><span style="color: #007700">);<br />}&nbsp;</span><br />
</span><br />
</code></div><br />
<br />
再就是BaseController中代码，和第一部分的代码基本一样，只有templateview函数代码不同，新的代码参考如下<br />
<script type="text/javascript">window.attachEvent("onload",function (){AutoSizeDIV('CODE_BZXJfRYefkjG')})</script><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="code_head"><tr><td></td><td align="right"><a href="javascript:CopyText(document.all.CODE_BZXJfRYefkjG);">[复制到剪贴板] </a></td></tr></table><div class="code_main" id="CODE_BZXJfRYefkjG" style="overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;"><code><span style="color: #000000"><br />
<span style="color: #007700">public&nbsp;function&nbsp;</span><span style="color: #0000BB">templateview</span><span style="color: #007700">(</span><span style="color: #0000BB">$page</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$data</span><span style="color: #007700">=[],&nbsp;</span><span style="color: #0000BB">$options&nbsp;</span><span style="color: #007700">=&nbsp;[]){<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$view&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">templateFile</span><span style="color: #007700">(</span><span style="color: #0000BB">$page</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//这里要增加判断视图文件是否存在，如果不存在，则认为不是风格视图文件。<br />&nbsp;&nbsp;&nbsp;&nbsp;//直接使用原始的视图文件<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">if(!</span><span style="color: #0000BB">is_file</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">viewPath&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">$view&nbsp;</span><span style="color: #007700">))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$view&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$page</span><span style="color: #007700">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//这里不能再调用view函数，把view函数代码拷贝过来。<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$renderer&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">\Config\Services</span><span style="color: #007700">::</span><span style="color: #0000BB">renderer</span><span style="color: #007700">();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$config&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">config</span><span style="color: #007700">(</span><span style="color: #0000BB">\Config\View</span><span style="color: #007700">::class);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$saveData&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$config</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">saveData</span><span style="color: #007700">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span style="color: #0000BB">array_key_exists</span><span style="color: #007700">(</span><span style="color: #DD0000">'saveData'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$options</span><span style="color: #007700">))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$saveData&nbsp;</span><span style="color: #007700">=&nbsp;(bool)&nbsp;</span><span style="color: #0000BB">$options</span><span style="color: #007700">[</span><span style="color: #DD0000">'saveData'</span><span style="color: #007700">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset(</span><span style="color: #0000BB">$options</span><span style="color: #007700">[</span><span style="color: #DD0000">'saveData'</span><span style="color: #007700">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">$renderer</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setData</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'raw'</span><span style="color: #007700">)-&gt;</span><span style="color: #0000BB">render</span><span style="color: #007700">(</span><span style="color: #0000BB">$view</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$options</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$saveData</span><span style="color: #007700">);<br />}&nbsp;</span><br />
</span><br />
</code></div><br />
<br />
在Controller的初始化代码中给&nbsp;$this-&gt;template&nbsp;属性赋值。<br />
这样子就可以了。其它的地方基本不需要修改。<br />
<br />
</div><br />
]]></description>
</item>
<item>
<link>https://www.rickw.cn/blogview/285</link>
<title><![CDATA[在php中实现安全的用户登录、Cookie中保存登录状态(remember me)]]></title>
<author>rick</author>
<category>原创作品</category>
<pubDate>2023-12-02 01:19:41</pubDate>
<guid>https://www.rickw.cn/blogview/285</guid>
	
<description><![CDATA[使用安全的方式实现用户登录，并在Cookie中保存登录状态，记住我（remember&nbsp;me）功能。<br />
<br />
比较天真的实现方式：将登录凭证、权限信息等保存到Cookie中。<br />
真的是很可怕，本站之前使用的老ASP博客系统就是这么实现的。<br />
最终导致系统被黑，网站被挂马。。。。。<br />
<br />
这次开发的新系统考虑到这种教训，采用了比较安全的实现方式。<br />
<br />
<h2>1，在用户密码的存储和验证方面使用了安全性较高的实现方案。</h2><br />
<div class="txt_main">&nbsp;具体实现方式在之前的文章中有详细介绍。<br />
a.&nbsp;对密码强度进行要求。&nbsp;参考&nbsp;<a target="_blank" href="/blogview/275">&nbsp;简单实现js密码强度检测，友好的html&nbsp;css样式提示&nbsp;</a><br />
<font color="red">密码要求至少8位，大小写字母数字标点符合至少包含三种。</font><br />
保证密码的基本安全性。<br />
<br />
b.&nbsp;&nbsp;对密码采用安全的hash加密存储。参考&nbsp;<a target="_blank" href="/blogview/276">在PHP程序中实现安全的用户密码保存-加密存储和登录验证</a><br />
密码安全存储是为了应对数据泄漏风险。<br />
</div><br />
<br />
<h2>2，在登录时进行暴力破解预防</h2><br />
<div class="txt_main">最基本的两项就是&nbsp;验证码&nbsp;和&nbsp;密码试错次数限制。<br />
验证码功能可以参考之前的文章&nbsp;<a target="_blank" href="/blogview/280">在CodeIgniter4中集成谷歌验证码&nbsp;reCaptcha&nbsp;V2&nbsp;</a><br />
<br />
关于密码错误次数的限制，网上有一些天真的利用&nbsp;Session&nbsp;记录错误次数的实现代码。<br />
那样是完全没有效果的。<br />
<br />
错误次数可以在数据库中记录，也可以在Memcache，redis等缓存中记录。<br />
CodeIgniter4有缓存模块，我们这里可以直接利用它自带的缓存模块实现<br />
<script type="text/javascript">window.attachEvent("onload",function (){AutoSizeDIV('CODE_NnWDXoFAEaU9')})</script><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="code_head"><tr><td></td><td align="right"><a href="javascript:CopyText(document.all.CODE_NnWDXoFAEaU9);">[复制到剪贴板] </a></td></tr></table><div class="code_main" id="CODE_NnWDXoFAEaU9" style="overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;"><code><span style="color: #000000"><br />
<span style="color: #0000BB"><br /></span><span style="color: #FF8000">/**<br />&nbsp;*&nbsp;判断是否超出了最大错误次数<br />&nbsp;*&nbsp;2小时内错误5次<br />&nbsp;*/&nbsp;<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">password_CheckErrors</span><span style="color: #007700">(</span><span style="color: #0000BB">$username</span><span style="color: #007700">):</span><span style="color: #0000BB">bool</span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$key&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'passErr_'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">$username&nbsp;</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$data&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">cache</span><span style="color: #007700">(</span><span style="color: #0000BB">$key</span><span style="color: #007700">)??&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000BB">$data&nbsp;</span><span style="color: #007700">&gt;=&nbsp;</span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">true</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">false</span><span style="color: #007700">;<br />}<br /></span><span style="color: #FF8000">/**<br />&nbsp;*&nbsp;记录错误次数<br />&nbsp;*/&nbsp;<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">password_addErrors</span><span style="color: #007700">(</span><span style="color: #0000BB">$username</span><span style="color: #007700">):&nbsp;</span><span style="color: #0000BB">int</span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$key&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'passErr_'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">$username&nbsp;</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$data&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">cache</span><span style="color: #007700">(</span><span style="color: #0000BB">$key</span><span style="color: #007700">)&nbsp;??&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$data</span><span style="color: #007700">++;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">cache</span><span style="color: #007700">()-&gt;</span><span style="color: #0000BB">save</span><span style="color: #007700">(</span><span style="color: #0000BB">$key</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$data</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">7200</span><span style="color: #007700">);</span><span style="color: #FF8000">//2小时<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">return&nbsp;</span><span style="color: #0000BB">$data</span><span style="color: #007700">;<br />}<br /></span><span style="color: #FF8000">/**<br />&nbsp;*&nbsp;获取当前错误次数<br />&nbsp;*/&nbsp;<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">password_getErrors</span><span style="color: #007700">(</span><span style="color: #0000BB">$username</span><span style="color: #007700">):</span><span style="color: #0000BB">int</span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$key&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'passErr_'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">$username&nbsp;</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$data&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">cache</span><span style="color: #007700">(</span><span style="color: #0000BB">$key</span><span style="color: #007700">)??</span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(int)</span><span style="color: #0000BB">$data</span><span style="color: #007700">;<br />}<br />&nbsp;</span><br />
</span><br />
</code></div><br />
根据用户名来记录密码错误次数信息，在登录时先判断错误次数。次数超过时直接报错。<br />
然后进行登录验证，密码失败时，调用辅助函数记录次数。<br />
</div><br />
<br />
<h2>3，安全的使用Cookie保存登录状态</h2><br />
<div class="txt_main">首先，绝对不能将用户凭证权限等信息保存到Cookie中。<br />
我们可以在Cookie中保存一个没有实际意义token标识。同时将这个token标识，过期信息保存到数据库中和用户关联。<br />
<script type="text/javascript">window.attachEvent("onload",function (){AutoSizeDIV('CODE_0POx8BeYfOzA')})</script><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="code_head"><tr><td></td><td align="right"><a href="javascript:CopyText(document.all.CODE_0POx8BeYfOzA);">[复制到剪贴板] </a></td></tr></table><div class="code_main" id="CODE_0POx8BeYfOzA" style="overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;"><code><span style="color: #000000"><br />
<span style="color: #FF8000">/**<br />&nbsp;*&nbsp;@param&nbsp;$length&nbsp;生成的Token字符长度<br />&nbsp;*&nbsp;@return&nbsp;返回生成的Token字符串<br />&nbsp;*/&nbsp;<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">password_generateToken</span><span style="color: #007700">(</span><span style="color: #0000BB">int&nbsp;$length&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">20</span><span style="color: #007700">):&nbsp;</span><span style="color: #0000BB">string</span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">bin2hex</span><span style="color: #007700">(</span><span style="color: #0000BB">random_bytes</span><span style="color: #007700">(</span><span style="color: #0000BB">$length</span><span style="color: #007700">));<br />}<br />&nbsp;</span><br />
</span><br />
</code></div><br />
在用户登录成功后通过上面的辅助函数生成一个随机token。<br />
<br />
在用户下次访问时直接获取token值，然后从数据库中查询是否有关联用户。<br />
如果找到用户，先判断是否过期，然后实现自动登录，并从数据库中获取用户权限等信息。<br />
<br />
如果考虑更严格安全一点，也可以在数据库中记录用户的IP地址，UserAgent等信息，要求完全匹配才给登录。<br />
</div><br />
<br />
<h2>4，自动登录Token的注销</h2><br />
<div class="txt_main">在用户进行密码修改后要主动从数据中删除token值，避免安全漏洞。<br />
<br />
在用户&nbsp;点击&nbsp;退出登录&nbsp;后，也要主动注销token值，同时注销Session。<br />
这一点很重要，可以保证用户在公共场合登录帐号后能安全退出。<br />
在用户退出后不会给Cookie劫持或者Session劫持攻击机会。<br />
</div><br />
<br />
<h2>5，最后，敏感操作要重新验证用户密码</h2><br />
<div class="txt_main">如用户修改密码、邮箱、绑定手机号等情况，需要重新验证用户，以保证安全。<br />
</div>]]></description>
</item>
<item>
<link>https://www.rickw.cn/blogview/280</link>
<title><![CDATA[在CodeIgniter4中集成谷歌验证码 reCaptcha V2]]></title>
<author>rick</author>
<category>原创作品</category>
<pubDate>2023-12-01 00:15:05</pubDate>
<guid>https://www.rickw.cn/blogview/280</guid>
	
<description><![CDATA[为什么要在网站上使用验证吗？主要还是安全方面的原因。<br />
通过验证码可以防止一些机器人和程序自动化的操作，如发送垃圾信息等。<br />
验证码还可以防止暴力破解攻击，特别是在登录或密码重置等敏感操作时。<br />
通过添加验证码，也可以增加攻击的难度和时间，从而减少攻击成功的可能性。<br />
<br />
国内大厂的验证码都是收费的，之前腾讯有免费的防水墙（验证码）服务，现在也停了。<br />
国际大厂免费的验证码服务，谷歌算是比较有名气的了。<br />
<br />
我们这边选择的是&nbsp;reCaptcha&nbsp;V2&nbsp;版本的。<br />
在系统集成之前，你需要先去谷歌官网申请&nbsp;reCaptcha&nbsp;的帐号密钥。<br />
因为网络因素，这个是无法直接访问的，请大家参考网上的申请教程。<br />
我们这里只介绍在CodeIgniter4系统中集成的方法。<br />
<br />
<h2>首先，在&nbsp;App\Config\App.php&nbsp;中增加&nbsp;密钥的配置设置。</h2><br />
<div class="txt_main">/**<br />
&nbsp;*&nbsp;谷歌验证码配置<br />
&nbsp;*&nbsp;reCaptcha&nbsp;V2<br />
&nbsp;*/<br />
public&nbsp;$reCaptchaV2&nbsp;=&nbsp;['htmlkey'&nbsp;=&gt;&nbsp;"***这里是网页端的密钥======",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"apikey"&nbsp;&nbsp;=&gt;&nbsp;"=======这里是后端api的密钥====="&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;];</div><br />
<br />
<h2>然后，增加两个辅助函数，辅助函数可以写到&nbsp;App\Common.php&nbsp;中。</h2><br />
<div class="txt_main">第一个辅助函数，是在网页中显示验证码组件。<br />
注意这里引用的js脚本路径，这个路径是可以在国内正常使用的。<br />
<script type="text/javascript">window.attachEvent("onload",function (){AutoSizeDIV('CODE_OvFvepGssvx0')})</script><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="code_head"><tr><td></td><td align="right"><a href="javascript:CopyText(document.all.CODE_OvFvepGssvx0);">[复制到剪贴板] </a></td></tr></table><div class="code_main" id="CODE_OvFvepGssvx0" style="overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;"><code><span style="color: #000000"><br />
<span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">form_verifycode</span><span style="color: #007700">(</span><span style="color: #0000BB">string&nbsp;$name</span><span style="color: #007700">=</span><span style="color: #DD0000">"validatecode"</span><span style="color: #007700">){&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #FF8000">//获取扩展配置<br /></span><span style="color: #0000BB">$cfg&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">config</span><span style="color: #007700">(</span><span style="color: #DD0000">'App'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$key&nbsp;</span><span style="color: #007700">=</span><span style="color: #0000BB">$cfg</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">reCaptchaV2</span><span style="color: #007700">[</span><span style="color: #DD0000">'htmlkey'</span><span style="color: #007700">];<br /><br /></span><span style="color: #0000BB">$txt&nbsp;&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'&lt;script&nbsp;src="https://www.recaptcha.net/recaptcha/api.js"&nbsp;async=""&nbsp;defer=""&gt;&lt;/script&gt;'</span><span style="color: #007700">;&nbsp;<br /></span><span style="color: #0000BB">$txt&nbsp;</span><span style="color: #007700">.=&nbsp;</span><span style="color: #DD0000">'&lt;script&nbsp;type="text/javascript"&gt;'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$txt&nbsp;</span><span style="color: #007700">.=&nbsp;</span><span style="color: #DD0000">"var&nbsp;verifyCallback_</span><span style="color: #0000BB">$name</span><span style="color: #DD0000">&nbsp;=&nbsp;function(response)&nbsp;{"&nbsp;</span><span style="color: #007700">;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #0000BB">$txt&nbsp;</span><span style="color: #007700">.=&nbsp;</span><span style="color: #DD0000">"document.getElementById(\"</span><span style="color: #0000BB">$name\</span><span style="color: #DD0000">").value&nbsp;=&nbsp;response;"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$txt&nbsp;</span><span style="color: #007700">.=&nbsp;</span><span style="color: #DD0000">"};&lt;/script&gt;"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$txt&nbsp;</span><span style="color: #007700">.=&nbsp;</span><span style="color: #DD0000">"&lt;div&nbsp;class=\"</span><span style="color: #0000BB">g</span><span style="color: #007700">-</span><span style="color: #0000BB">recaptcha\</span><span style="color: #DD0000">"&nbsp;data-callback=\"</span><span style="color: #0000BB">verifyCallback_$name\</span><span style="color: #DD0000">"&nbsp;data-sitekey=\"</span><span style="color: #0000BB">$key\</span><span style="color: #DD0000">"&gt;&lt;/div&gt;"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$txt&nbsp;</span><span style="color: #007700">.=&nbsp;</span><span style="color: #DD0000">"&lt;input&nbsp;type=\"</span><span style="color: #0000BB">hidden\</span><span style="color: #DD0000">"&nbsp;name=\"</span><span style="color: #0000BB">$name\</span><span style="color: #DD0000">"&nbsp;id=\"</span><span style="color: #0000BB">$name\</span><span style="color: #DD0000">"&gt;"</span><span style="color: #007700">;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />return&nbsp;</span><span style="color: #0000BB">$txt</span><span style="color: #007700">;<br />}<br />&nbsp;</span><br />
</span><br />
</code></div><br />
第二个辅助函数，php后端检查验证码正确性的。<br />
<script type="text/javascript">window.attachEvent("onload",function (){AutoSizeDIV('CODE_24QaHLwDWXyW')})</script><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="code_head"><tr><td></td><td align="right"><a href="javascript:CopyText(document.all.CODE_24QaHLwDWXyW);">[复制到剪贴板] </a></td></tr></table><div class="code_main" id="CODE_24QaHLwDWXyW" style="overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;"><code><span style="color: #000000"><br />
<span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">verify_Code</span><span style="color: #007700">(</span><span style="color: #0000BB">string&nbsp;$code</span><span style="color: #007700">){<br />&nbsp;&nbsp;&nbsp;&nbsp;if(empty(</span><span style="color: #0000BB">$code</span><span style="color: #007700">))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">false</span><span style="color: #007700">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//获取扩展配置<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$cfg&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">config</span><span style="color: #007700">(</span><span style="color: #DD0000">'App'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//使用方法<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$post_data&nbsp;</span><span style="color: #007700">=&nbsp;array(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'secret'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000BB">$cfg</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">reCaptchaV2</span><span style="color: #007700">[</span><span style="color: #DD0000">'apikey'</span><span style="color: #007700">],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'response'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000BB">$code<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$data&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">post_curls</span><span style="color: #007700">(</span><span style="color: #DD0000">'https://www.recaptcha.net/recaptcha/api/siteverify'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$post_data</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$vd&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">json_decode</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">true</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;empty(</span><span style="color: #0000BB">$vd</span><span style="color: #007700">[</span><span style="color: #DD0000">'success'</span><span style="color: #007700">])&nbsp;)&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">false</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />return&nbsp;</span><span style="color: #0000BB">true</span><span style="color: #007700">;<br />}&nbsp;</span><br />
</span><br />
</code></div><br />
</div><br />
<br />
<h2>最后是使用方式了</h2><br />
<div class="txt_main">1，在视图文件中可以按如下方式调用。<br />
<script type="text/javascript">window.attachEvent("onload",function (){AutoSizeDIV('CODE_fYbUL09WlxzI')})</script><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="code_head"><tr><td></td><td align="right"><a href="javascript:CopyText(document.all.CODE_fYbUL09WlxzI);">[复制到剪贴板] </a></td></tr></table><div class="code_main" id="CODE_fYbUL09WlxzI" style="overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;"><code><span style="color: #000000"><br />
<span style="color: #007700">&lt;</span><span style="color: #0000BB">tr</span><span style="color: #007700">&gt;<br />&nbsp;&lt;</span><span style="color: #0000BB">td&nbsp;align</span><span style="color: #007700">=</span><span style="color: #DD0000">"right"&nbsp;</span><span style="color: #0000BB">bgcolor</span><span style="color: #007700">=</span><span style="color: #DD0000">"#FFFFFF"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">验证码：</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">td</span><span style="color: #007700">&gt;<br />&nbsp;&lt;</span><span style="color: #0000BB">td&nbsp;bgcolor</span><span style="color: #007700">=</span><span style="color: #DD0000">"#FFFFFF"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">&lt;?</span><span style="color: #007700">=</span><span style="color: #0000BB">form_verifycode</span><span style="color: #007700">()</span><span style="color: #0000BB">?&gt;</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">td</span><span style="color: #007700">&gt;<br />&lt;/</span><span style="color: #0000BB">tr</span><span style="color: #007700">&gt;&nbsp;</span><br />
</span><br />
</code></div><br />
2，在后端接受到post数据后，可以按下面方式验证<br />
<script type="text/javascript">window.attachEvent("onload",function (){AutoSizeDIV('CODE_Z04ni4esQ2lf')})</script><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="code_head"><tr><td></td><td align="right"><a href="javascript:CopyText(document.all.CODE_Z04ni4esQ2lf);">[复制到剪贴板] </a></td></tr></table><div class="code_main" id="CODE_Z04ni4esQ2lf" style="overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;"><code><span style="color: #000000"><br />
<span style="color: #007700">if(!</span><span style="color: #0000BB">verify_Code</span><span style="color: #007700">(</span><span style="color: #0000BB">$rndcode</span><span style="color: #007700">)){<br />&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">showErrors</span><span style="color: #007700">(</span><span style="color: #0000BB">null</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'验证码错误，请完成人机验证。'</span><span style="color: #007700">);<br />}&nbsp;</span><br />
</span><br />
</code></div><br />
</div>]]></description>
</item>
<item>
<link>https://www.rickw.cn/blogview/278</link>
<title><![CDATA[CodeIgniter4中如何在view或者helper函数中访问当前控制器对象]]></title>
<author>rick</author>
<category>原创作品</category>
<pubDate>2023-11-30 00:20:42</pubDate>
<guid>https://www.rickw.cn/blogview/278</guid>
	
<description><![CDATA[在CodeIgniter4中我们如果将一些共通的基础数据保存到了当前控制器实例中。<br />
就有可能会遇到需要在view视图中访问当前控制器实例的情况（需要访问基础数据）。<br />
也有可能会需要在helper辅助函数中访问当前控制器实例。<br />
<br />
这里我们可以通过扩展核心库的方式实现。<br />
<br />
<strong>首先，我们扩展CodeIgniter\CodeIgniter&nbsp;类来记录当前控制器实例，并提供访问接口</strong><br />
<div class="txt_main">&nbsp;实现代码如下（当前代码还包含了之前文章介绍的&nbsp;<a target="_blank" href="/blogview/271">SQL执行数量功能的实现</a>）<br />
<br />
<script type="text/javascript">window.attachEvent("onload",function (){AutoSizeDIV('CODE_0KvOSHrWkvQH')})</script><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="code_head"><tr><td></td><td align="right"><a href="javascript:CopyText(document.all.CODE_0KvOSHrWkvQH);">[复制到剪贴板] </a></td></tr></table><div class="code_main" id="CODE_0KvOSHrWkvQH" style="overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;"><code><span style="color: #000000"><br />
<span style="color: #007700">namespace&nbsp;</span><span style="color: #0000BB">App\Libraries</span><span style="color: #007700">;<br />use&nbsp;</span><span style="color: #0000BB">CodeIgniter\Events\Events</span><span style="color: #007700">;<br />use&nbsp;</span><span style="color: #0000BB">CodeIgniter\CodeIgniter&nbsp;</span><span style="color: #007700">as&nbsp;</span><span style="color: #0000BB">BaseCodeIgniter</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">/**<br />&nbsp;*&nbsp;扩展核心类实现&nbsp;SQL&nbsp;执行数的统计功能<br />&nbsp;*&nbsp;提供当前控制器实例访问接口<br />&nbsp;*/&nbsp;<br /></span><span style="color: #007700">class&nbsp;</span><span style="color: #0000BB">CodeIgniter&nbsp;</span><span style="color: #007700">extends&nbsp;</span><span style="color: #0000BB">BaseCodeIgniter<br /></span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">/**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@var&nbsp;int|null&nbsp;&nbsp;变量SQL执行次数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">protected&nbsp;</span><span style="color: #0000BB">$sql_queries&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">/**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;当前的控制器对象实例<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">private&nbsp;</span><span style="color: #0000BB">$current_Control&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">null</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">/**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;函数&nbsp;统计SQL执行次数&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">public&nbsp;function&nbsp;</span><span style="color: #0000BB">collectDBQuery</span><span style="color: #007700">(</span><span style="color: #0000BB">$query</span><span style="color: #007700">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">sql_queries</span><span style="color: #007700">++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span style="color: #0000BB">initialize</span><span style="color: #007700">(){&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">initialize</span><span style="color: #007700">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//增加扩展初始化代码&nbsp;&nbsp;注册SQL统计函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">Events</span><span style="color: #007700">::</span><span style="color: #0000BB">on</span><span style="color: #007700">(</span><span style="color: #DD0000">'DBQuery'</span><span style="color: #007700">,&nbsp;[</span><span style="color: #0000BB">$this</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'collectDBQuery'</span><span style="color: #007700">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">/**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;增加替换&nbsp;&nbsp;sql_queries&nbsp;标签<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">public&nbsp;function&nbsp;</span><span style="color: #0000BB">displayPerformanceMetrics</span><span style="color: #007700">(</span><span style="color: #0000BB">string&nbsp;$output</span><span style="color: #007700">):&nbsp;</span><span style="color: #0000BB">string<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;替换&nbsp;&nbsp;sql_queries&nbsp;标签<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$output&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">str_replace</span><span style="color: #007700">(</span><span style="color: #DD0000">'&#123;sql_queries}'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">sql_queries</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$output</span><span style="color: #007700">);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">displayPerformanceMetrics</span><span style="color: #007700">(</span><span style="color: #0000BB">$output</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">/**&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;保存当前的Controller实例对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;Controller<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">protected&nbsp;function&nbsp;</span><span style="color: #0000BB">createController</span><span style="color: #007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">current_Control&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">createController</span><span style="color: #007700">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">current_Control</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">/**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;增加接口函数，获取当前控制器实例<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">public&nbsp;function&nbsp;</span><span style="color: #0000BB">getCurrentControl</span><span style="color: #007700">(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">current_Control</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />&nbsp;</span><br />
</span><br />
</code></div></div><br />
<br />
<strong>然后通过服务配置文件，将我们扩展的核心类注册到系统中</strong><br />
<div class="txt_main">需要修改的文件是&nbsp;App\Config\Services.php<br />
在文件中添加如下函数，完成注册：<br />
<script type="text/javascript">window.attachEvent("onload",function (){AutoSizeDIV('CODE_pvZ0z2yzMfLo')})</script><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="code_head"><tr><td></td><td align="right"><a href="javascript:CopyText(document.all.CODE_pvZ0z2yzMfLo);">[复制到剪贴板] </a></td></tr></table><div class="code_main" id="CODE_pvZ0z2yzMfLo" style="overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;"><code><span style="color: #000000"><br />
<span style="color: #FF8000">/**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;扩展&nbsp;CodeIgniter核心类<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;CodeIgniter<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">public&nbsp;static&nbsp;function&nbsp;</span><span style="color: #0000BB">codeigniter</span><span style="color: #007700">(?</span><span style="color: #0000BB">App&nbsp;$config&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">null</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">bool&nbsp;$getShared&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">true</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span style="color: #0000BB">$getShared</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;static::</span><span style="color: #0000BB">getSharedInstance</span><span style="color: #007700">(</span><span style="color: #DD0000">'codeigniter'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$config</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$config&nbsp;</span><span style="color: #007700">??=&nbsp;</span><span style="color: #0000BB">config</span><span style="color: #007700">(</span><span style="color: #0000BB">App</span><span style="color: #007700">::class);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;</span><span style="color: #0000BB">\App\Libraries\CodeIgniter</span><span style="color: #007700">(</span><span style="color: #0000BB">$config</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><br />
</span><br />
</code></div><br />
</div><br />
<br />
<strong>最后是访问方式</strong><br />
<div class="txt_main">首先在&nbsp;app\Common.php&nbsp;中添加全局的辅助函数：<br />
<script type="text/javascript">window.attachEvent("onload",function (){AutoSizeDIV('CODE_Sqk5gZNP47oG')})</script><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="code_head"><tr><td></td><td align="right"><a href="javascript:CopyText(document.all.CODE_Sqk5gZNP47oG);">[复制到剪贴板] </a></td></tr></table><div class="code_main" id="CODE_Sqk5gZNP47oG" style="overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;"><code><span style="color: #000000"><br />
<span style="color: #FF8000">/**<br />&nbsp;*&nbsp;获取当前的控制器实例<br />&nbsp;*/&nbsp;<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">currentControl</span><span style="color: #007700">(){<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$app&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">Config\Services</span><span style="color: #007700">::</span><span style="color: #0000BB">codeigniter</span><span style="color: #007700">();<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">$app</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getCurrentControl</span><span style="color: #007700">();<br />}&nbsp;</span><br />
</span><br />
</code></div><br />
<br />
<strong>然后你就可以通过全局函数&nbsp;<font color="red">currentControl</font>&nbsp;在任意位置访问当前控制器实例了。</strong><br />
</div>]]></description>
</item>
<item>
<link>https://www.rickw.cn/blogview/276</link>
<title><![CDATA[在PHP程序中实现安全的用户密码保存-加密存储和登录验证]]></title>
<author>rick</author>
<category>原创作品</category>
<pubDate>2023-11-29 00:16:59</pubDate>
<guid>https://www.rickw.cn/blogview/276</guid>
	
<description><![CDATA[<div class="txt_main">在网络世界中，用户密码的安全问题日益受到关注，用户身份验证和密码保护变得愈发重要。<br />
不用说明码保存密码这种低级问题，从2004年MD5碰撞漏洞以来在系统中使用md5保存密码都是不可以想象的灾难。<br />
<strong>采用md5、sha1甚至是加盐的md5、sha256都已经是不安全的了</strong><br />
目前有四种仍然安全的密码哈希算法：<strong><br />
<ul><li>&nbsp;Argon2&nbsp;<li>&nbsp;bcrypt&nbsp;<li>&nbsp;scrypt&nbsp;<li>&nbsp;PBKDF2&nbsp;</ul></ol></strong></div><br />
<br />
<div class="txt_main">一些PHP系统的生成环境可以没有安装PECL包，这种情况下&nbsp;scrypt&nbsp;哈希加密算法&nbsp;就无法使用。<br />
如果可能的话建议优先使用&nbsp;scrypt&nbsp;哈希加密算法。<br />
<br />
除此之外我们建议优先使用&nbsp;bcrypt，更重要的是PHP提供了内置函数支持。<br />
我们可以直接使用<strong><font color="red">&nbsp;password_hash()</font>&nbsp;&nbsp;和&nbsp;<font color="red">&nbsp;password_verify()&nbsp;</font></strong><br />
<br />
<strong>使用bcrypt需要注意它的两点限制：</strong><br />
<ol type="1"><li>它最多只支持72个字符，超过的字符会被截断。<li>如果字符串中含有NUL（\0）字符时会被截断</ul></ol><br />
<br />
<strong>对于一般网站来说这都不是问题，用户密码通常不会超过72个字符。<br />
网页端输入也不可能会出现NUL（\0）字符。</strong><br />
</div><br />
<br />
<h2>实际实现代码</h2><br />
<div class="txt_main">用户密码的加密：<br />
CodeIgniter4本身有提供加密库，我这里直接使用了CodeIgniter4自带的加密库。<br />
也可以使用专业的&nbsp;php-encryption&nbsp;加密库。<br />
<script type="text/javascript">window.attachEvent("onload",function (){AutoSizeDIV('CODE_HDZJBwLrEJh7')})</script><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="code_head"><tr><td></td><td align="right"><a href="javascript:CopyText(document.all.CODE_HDZJBwLrEJh7);">[复制到剪贴板] </a></td></tr></table><div class="code_main" id="CODE_HDZJBwLrEJh7" style="overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;"><code><span style="color: #000000"><br />
<span style="color: #FF8000">/**<br />&nbsp;*&nbsp;Hash密码，并加密Hash值。返回加密后的结果。<br />&nbsp;*&nbsp;返回值可以直接保存到数据库中。<br />&nbsp;*&nbsp;@param&nbsp;$password&nbsp;用户输入的密码<br />&nbsp;*&nbsp;@return&nbsp;返回加密后的Hash值<br />&nbsp;*/&nbsp;<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">password_hashAndEncrypt</span><span style="color: #007700">(</span><span style="color: #0000BB">string&nbsp;$password</span><span style="color: #007700">):&nbsp;</span><span style="color: #0000BB">string&nbsp;</span><span style="color: #007700">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$hash&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">password_hash</span><span style="color: #007700">(</span><span style="color: #0000BB">$password</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">PASSWORD_DEFAULT</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!</span><span style="color: #0000BB">is_string</span><span style="color: #007700">(</span><span style="color: #0000BB">$hash</span><span style="color: #007700">))&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">false</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$encrypter&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">\Config\Services</span><span style="color: #007700">::</span><span style="color: #0000BB">encrypter</span><span style="color: #007700">();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">base64_encode</span><span style="color: #007700">(</span><span style="color: #0000BB">$encrypter</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">encrypt</span><span style="color: #007700">(</span><span style="color: #0000BB">$hash</span><span style="color: #007700">));<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//php-encryption<br />&nbsp;&nbsp;&nbsp;&nbsp;//return&nbsp;Crypto::encrypt($hash,&nbsp;$aesKey);<br /></span><span style="color: #007700">}&nbsp;</span><br />
</span><br />
</code></div><br />
<br />
在用户登录时验证密码是否正确，这里进行函数封装：<br />
<script type="text/javascript">window.attachEvent("onload",function (){AutoSizeDIV('CODE_Ry1BUKgGBelA')})</script><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="code_head"><tr><td></td><td align="right"><a href="javascript:CopyText(document.all.CODE_Ry1BUKgGBelA);">[复制到剪贴板] </a></td></tr></table><div class="code_main" id="CODE_Ry1BUKgGBelA" style="overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;"><code><span style="color: #000000"><br />
<span style="color: #FF8000">/**<br />&nbsp;*&nbsp;解密数据库中的Hash值并验证密码是否正确<br />&nbsp;*&nbsp;@param&nbsp;$password&nbsp;用户输入的密码<br />&nbsp;*&nbsp;@param&nbsp;$ciphertext&nbsp;数据库保存的加密hash值<br />&nbsp;*&nbsp;@return&nbsp;返回验证是否成功<br />&nbsp;*/&nbsp;<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">password_decryptAndVerify</span><span style="color: #007700">(</span><span style="color: #0000BB">string&nbsp;$password</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">string&nbsp;$ciphertext</span><span style="color: #007700">):&nbsp;</span><span style="color: #0000BB">bool</span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$encrypter&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">\Config\Services</span><span style="color: #007700">::</span><span style="color: #0000BB">encrypter</span><span style="color: #007700">();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$hash&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$encrypter</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">decrypt</span><span style="color: #007700">(</span><span style="color: #0000BB">base64_decode</span><span style="color: #007700">(</span><span style="color: #0000BB">$ciphertext</span><span style="color: #007700">));<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//php-encryption<br />&nbsp;&nbsp;&nbsp;&nbsp;//$hash&nbsp;=&nbsp;Crypto::decrypt($ciphertext,&nbsp;$aesKey);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">if&nbsp;(!</span><span style="color: #0000BB">is_string</span><span style="color: #007700">(</span><span style="color: #0000BB">$hash</span><span style="color: #007700">))&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">false</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">password_verify</span><span style="color: #007700">(</span><span style="color: #0000BB">$password</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$hash</span><span style="color: #007700">);<br />}&nbsp;</span><br />
</span><br />
</code></div><br />
</div><br />
<br />
<h2>加密算法库下载</h2><br />
<img src="/images/download.gif" align="absmiddle" /><a target="_blank" href="http://dl.rickw.cn/f/20272120-983290804-24dd37">专业加密算法库&nbsp;php-encryption-2.4.0.zip</a><br />
]]></description>
</item>
<item>
<link>https://www.rickw.cn/blogview/275</link>
<title><![CDATA[简单实现js密码强度检测，友好的html css样式提示]]></title>
<author>rick</author>
<category>原创作品</category>
<pubDate>2023-11-28 14:14:03</pubDate>
<guid>https://www.rickw.cn/blogview/275</guid>
	
<description><![CDATA[从网站安全方面考虑，许多网站会采取强制措施来限制密码的强度，以保障网站安全。<br />
这些措施包括要求密码包含特定数量的大小写字母、数字和特殊字符，以及限制密码长度。<br />
<br />
今天我们这里提供一种简单有效的密码强度css提示效果实现方案，效果如下：<br />
<img src="https://ooo.0x0.ooo/2023/11/28/OrQbsD.gif" border="0" style="max-width:90%;height:auto;"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="showImage(this);" /><br />
<br />
<h1>实现代码如下：</h1><br />
<div class="txt_main"><strong>CSS样式代码：</strong><br />
<script type="text/javascript">window.attachEvent("onload",function (){AutoSizeDIV('CODE_4EJi11QZI60u')})</script><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="code_head"><tr><td></td><td align="right"><a href="javascript:CopyText(document.all.CODE_4EJi11QZI60u);">[复制到剪贴板] </a></td></tr></table><div class="code_main" id="CODE_4EJi11QZI60u" style="overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;"><code><span style="color: #000000"><br />
<span style="color: #007700">&lt;</span><span style="color: #0000BB">style&nbsp;type</span><span style="color: #007700">=</span><span style="color: #DD0000">"text/css"</span><span style="color: #007700">&gt;<br />.</span><span style="color: #0000BB">pbar_wrap&nbsp;</span><span style="color: #007700">{<br />&nbsp;&nbsp;</span><span style="color: #0000BB">width</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">128px</span><span style="color: #007700">;<br />&nbsp;&nbsp;</span><span style="color: #0000BB">height</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">15px</span><span style="color: #007700">;<br />&nbsp;&nbsp;</span><span style="color: #0000BB">display</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">inline</span><span style="color: #007700">-</span><span style="color: #0000BB">block</span><span style="color: #007700">;<br />&nbsp;&nbsp;</span><span style="color: #0000BB">vertical</span><span style="color: #007700">-</span><span style="color: #0000BB">align</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">middle</span><span style="color: #007700">;<br />&nbsp;&nbsp;</span><span style="color: #0000BB">overflow</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">visible</span><span style="color: #007700">;<br />&nbsp;&nbsp;</span><span style="color: #0000BB">border</span><span style="color: #007700">-</span><span style="color: #0000BB">radius</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">5px</span><span style="color: #007700">;<br />}<br />.</span><span style="color: #0000BB">pbar_item1&nbsp;</span><span style="color: #007700">{</span><span style="color: #0000BB">background</span><span style="color: #007700">-</span><span style="color: #0000BB">color</span><span style="color: #007700">:&nbsp;</span><span style="color: #FF8000">#cccccc;}<br /></span><span style="color: #007700">.</span><span style="color: #0000BB">pbar_item2&nbsp;</span><span style="color: #007700">{</span><span style="color: #0000BB">background</span><span style="color: #007700">-</span><span style="color: #0000BB">color</span><span style="color: #007700">:&nbsp;</span><span style="color: #FF8000">#cccccc;}<br /></span><span style="color: #007700">.</span><span style="color: #0000BB">pbar_item3&nbsp;</span><span style="color: #007700">{</span><span style="color: #0000BB">background</span><span style="color: #007700">-</span><span style="color: #0000BB">color</span><span style="color: #007700">:&nbsp;</span><span style="color: #FF8000">#cccccc;}<br /></span><span style="color: #007700">.</span><span style="color: #0000BB">pbar_item4&nbsp;</span><span style="color: #007700">{</span><span style="color: #0000BB">background</span><span style="color: #007700">-</span><span style="color: #0000BB">color</span><span style="color: #007700">:&nbsp;</span><span style="color: #FF8000">#cccccc;}<br /><br /></span><span style="color: #007700">.</span><span style="color: #0000BB">pbar_text&nbsp;</span><span style="color: #007700">{<br />&nbsp;&nbsp;</span><span style="color: #0000BB">display</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">inline</span><span style="color: #007700">-</span><span style="color: #0000BB">block</span><span style="color: #007700">;<br />&nbsp;&nbsp;</span><span style="color: #0000BB">color</span><span style="color: #007700">:&nbsp;</span><span style="color: #FF8000">#aaa;<br />&nbsp;&nbsp;</span><span style="color: #0000BB">font</span><span style="color: #007700">-</span><span style="color: #0000BB">weight</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">bold</span><span style="color: #007700">;<br />&nbsp;&nbsp;</span><span style="color: #0000BB">margin</span><span style="color: #007700">-</span><span style="color: #0000BB">left</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">5px</span><span style="color: #007700">;<br />&nbsp;&nbsp;-</span><span style="color: #0000BB">webkit</span><span style="color: #007700">-</span><span style="color: #0000BB">transition</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">.2s</span><span style="color: #007700">;<br />&nbsp;&nbsp;</span><span style="color: #0000BB">transition</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">.2s</span><span style="color: #007700">;<br />}<br />.</span><span style="color: #0000BB">pbar_item&nbsp;</span><span style="color: #007700">{<br />&nbsp;&nbsp;</span><span style="color: #0000BB">margin</span><span style="color: #007700">-</span><span style="color: #0000BB">left</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">2px</span><span style="color: #007700">;<br />&nbsp;&nbsp;</span><span style="color: #0000BB">display</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">inline</span><span style="color: #007700">-</span><span style="color: #0000BB">block</span><span style="color: #007700">;<br />&nbsp;&nbsp;</span><span style="color: #0000BB">height</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">100</span><span style="color: #007700">%;<br />&nbsp;&nbsp;</span><span style="color: #0000BB">width</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">30px</span><span style="color: #007700">;&nbsp;&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #0000BB">border</span><span style="color: #007700">-</span><span style="color: #0000BB">radius</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">5px</span><span style="color: #007700">;<br />&nbsp;&nbsp;</span><span style="color: #0000BB">float</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">left</span><span style="color: #007700">;&nbsp;&nbsp;<br />&nbsp;&nbsp;-</span><span style="color: #0000BB">webkit</span><span style="color: #007700">-</span><span style="color: #0000BB">transition</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">background</span><span style="color: #007700">-</span><span style="color: #0000BB">color&nbsp;.2s</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">visisility&nbsp;.1s</span><span style="color: #007700">;&nbsp;&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #0000BB">transition</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">background</span><span style="color: #007700">-</span><span style="color: #0000BB">color&nbsp;.2s</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">visisility&nbsp;.1s</span><span style="color: #007700">;<br />}<br /><br />.</span><span style="color: #0000BB">pbar_item1</span><span style="color: #007700">.</span><span style="color: #0000BB">active&nbsp;</span><span style="color: #007700">{&nbsp;</span><span style="color: #0000BB">background</span><span style="color: #007700">-</span><span style="color: #0000BB">color</span><span style="color: #007700">:&nbsp;</span><span style="color: #FF8000">#FF4B47;}<br /></span><span style="color: #007700">.</span><span style="color: #0000BB">pbar_item2</span><span style="color: #007700">.</span><span style="color: #0000BB">active&nbsp;</span><span style="color: #007700">{</span><span style="color: #0000BB">background</span><span style="color: #007700">-</span><span style="color: #0000BB">color</span><span style="color: #007700">:&nbsp;</span><span style="color: #FF8000">#F9AE35;}<br /></span><span style="color: #007700">.</span><span style="color: #0000BB">pbar_item3</span><span style="color: #007700">.</span><span style="color: #0000BB">active&nbsp;</span><span style="color: #007700">{</span><span style="color: #0000BB">background</span><span style="color: #007700">-</span><span style="color: #0000BB">color</span><span style="color: #007700">:&nbsp;</span><span style="color: #FF8000">#2DAF7D;}&nbsp;<br /></span><span style="color: #007700">.</span><span style="color: #0000BB">pbar_item4</span><span style="color: #007700">.</span><span style="color: #0000BB">active&nbsp;</span><span style="color: #007700">{&nbsp;</span><span style="color: #0000BB">background</span><span style="color: #007700">-</span><span style="color: #0000BB">color</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">green</span><span style="color: #007700">;}&nbsp;&nbsp;<br /><br />&lt;/</span><span style="color: #0000BB">style</span><span style="color: #007700">&gt;&nbsp;</span><br />
</span><br />
</code></div><br />
<strong>js代码</strong><br />
下面是简单的实现逻辑，主要检测密码长度，字符种类数。<br />
要求：大写字母、小写字母、标点符合、数字至少包含三种。密码不少于8个字符。<br />
强度值达到&nbsp;3&nbsp;即可满足条件。<br />
代码依赖jQuery。<br />
<br />
如果需要更复杂的密码强度检测，可以使用开源js库&nbsp;zxcvbn&nbsp;【&nbsp;dropbox&nbsp;开发的一个JavaScript密码强度估算库】。<br />
<br />
<script type="text/javascript">window.attachEvent("onload",function (){AutoSizeDIV('CODE_ySTt7cyfSr6B')})</script><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="code_head"><tr><td></td><td align="right"><a href="javascript:CopyText(document.all.CODE_ySTt7cyfSr6B);">[复制到剪贴板] </a></td></tr></table><div class="code_main" id="CODE_ySTt7cyfSr6B" style="overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;"><code><span style="color: #000000"><br />
<span style="color: #007700">&lt;</span><span style="color: #0000BB">script&nbsp;type</span><span style="color: #007700">=</span><span style="color: #DD0000">"text/javascript"</span><span style="color: #007700">&gt;<br />&nbsp;&nbsp;function&nbsp;</span><span style="color: #0000BB">changeText</span><span style="color: #007700">(</span><span style="color: #0000BB">el</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">color</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">el</span><span style="color: #007700">.</span><span style="color: #0000BB">text</span><span style="color: #007700">(</span><span style="color: #0000BB">text</span><span style="color: #007700">).</span><span style="color: #0000BB">css</span><span style="color: #007700">(</span><span style="color: #DD0000">'color'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">color</span><span style="color: #007700">);<br />&nbsp;&nbsp;};<br />&nbsp;&nbsp;function&nbsp;</span><span style="color: #0000BB">pwstrength</span><span style="color: #007700">(</span><span style="color: #0000BB">val</span><span style="color: #007700">){<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">let&nbsp;len&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">val</span><span style="color: #007700">.</span><span style="color: #0000BB">length</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000BB">len&nbsp;</span><span style="color: #007700">===&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">)&nbsp;return&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000BB">len&nbsp;</span><span style="color: #007700">&lt;&nbsp;</span><span style="color: #0000BB">8</span><span style="color: #007700">)&nbsp;return&nbsp;</span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;</span><span style="color: #0000BB">lv&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000BB">val</span><span style="color: #007700">.</span><span style="color: #0000BB">match</span><span style="color: #007700">(/[</span><span style="color: #0000BB">a</span><span style="color: #007700">-</span><span style="color: #0000BB">z</span><span style="color: #007700">]/</span><span style="color: #0000BB">g</span><span style="color: #007700">)){</span><span style="color: #0000BB">lv</span><span style="color: #007700">++;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000BB">val</span><span style="color: #007700">.</span><span style="color: #0000BB">match</span><span style="color: #007700">(/[</span><span style="color: #0000BB">A</span><span style="color: #007700">-</span><span style="color: #0000BB">Z</span><span style="color: #007700">]/</span><span style="color: #0000BB">g</span><span style="color: #007700">)){</span><span style="color: #0000BB">lv</span><span style="color: #007700">++;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000BB">val</span><span style="color: #007700">.</span><span style="color: #0000BB">match</span><span style="color: #007700">(/[</span><span style="color: #0000BB">0</span><span style="color: #007700">-</span><span style="color: #0000BB">9</span><span style="color: #007700">]/</span><span style="color: #0000BB">g</span><span style="color: #007700">)){</span><span style="color: #0000BB">lv</span><span style="color: #007700">++;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000BB">val</span><span style="color: #007700">.</span><span style="color: #0000BB">match</span><span style="color: #007700">(/(.[^</span><span style="color: #0000BB">a</span><span style="color: #007700">-</span><span style="color: #0000BB">zA</span><span style="color: #007700">-</span><span style="color: #0000BB">Z0</span><span style="color: #007700">-</span><span style="color: #0000BB">9</span><span style="color: #007700">])/</span><span style="color: #0000BB">g</span><span style="color: #007700">)){</span><span style="color: #0000BB">lv</span><span style="color: #007700">++;}&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">lv</span><span style="color: #007700">;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;$(</span><span style="color: #DD0000">'#password'</span><span style="color: #007700">).</span><span style="color: #0000BB">keyup</span><span style="color: #007700">(function(){<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">let&nbsp;that&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">this</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">let&nbsp;len&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">that</span><span style="color: #007700">.</span><span style="color: #0000BB">value</span><span style="color: #007700">.</span><span style="color: #0000BB">length</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;</span><span style="color: #0000BB">pbText&nbsp;</span><span style="color: #007700">=&nbsp;$(</span><span style="color: #DD0000">'.pbar_text'</span><span style="color: #007700">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;</span><span style="color: #0000BB">lv&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">pwstrength</span><span style="color: #007700">(</span><span style="color: #0000BB">that</span><span style="color: #007700">.</span><span style="color: #0000BB">value</span><span style="color: #007700">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span style="color: #0000BB">len&nbsp;</span><span style="color: #007700">===&nbsp;</span><span style="color: #0000BB">0&nbsp;</span><span style="color: #007700">||&nbsp;</span><span style="color: #0000BB">lv&nbsp;</span><span style="color: #007700">===&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span style="color: #DD0000">'.pbar_item'</span><span style="color: #007700">).</span><span style="color: #0000BB">each</span><span style="color: #007700">(function()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span style="color: #0000BB">this</span><span style="color: #007700">).</span><span style="color: #0000BB">removeClass</span><span style="color: #007700">(</span><span style="color: #DD0000">'active'</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">changeText</span><span style="color: #007700">(</span><span style="color: #0000BB">pbText</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'空'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'#aaa'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(</span><span style="color: #0000BB">lv&nbsp;</span><span style="color: #007700">==&nbsp;</span><span style="color: #0000BB">1</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span style="color: #DD0000">'.pbar_item1'</span><span style="color: #007700">).</span><span style="color: #0000BB">addClass</span><span style="color: #007700">(</span><span style="color: #DD0000">'active'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span style="color: #DD0000">'.pbar_item2'</span><span style="color: #007700">).</span><span style="color: #0000BB">removeClass</span><span style="color: #007700">(</span><span style="color: #DD0000">'active'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span style="color: #DD0000">'.pbar_item3'</span><span style="color: #007700">).</span><span style="color: #0000BB">removeClass</span><span style="color: #007700">(</span><span style="color: #DD0000">'active'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span style="color: #DD0000">'.pbar_item4'</span><span style="color: #007700">).</span><span style="color: #0000BB">removeClass</span><span style="color: #007700">(</span><span style="color: #DD0000">'active'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">changeText</span><span style="color: #007700">(</span><span style="color: #0000BB">pbText</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'弱'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'#FF4B47'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(</span><span style="color: #0000BB">lv&nbsp;</span><span style="color: #007700">==&nbsp;</span><span style="color: #0000BB">2</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span style="color: #DD0000">'.pbar_item1'</span><span style="color: #007700">).</span><span style="color: #0000BB">addClass</span><span style="color: #007700">(</span><span style="color: #DD0000">'active'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span style="color: #DD0000">'.pbar_item2'</span><span style="color: #007700">).</span><span style="color: #0000BB">addClass</span><span style="color: #007700">(</span><span style="color: #DD0000">'active'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span style="color: #DD0000">'.pbar_item3'</span><span style="color: #007700">).</span><span style="color: #0000BB">removeClass</span><span style="color: #007700">(</span><span style="color: #DD0000">'active'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span style="color: #DD0000">'.pbar_item4'</span><span style="color: #007700">).</span><span style="color: #0000BB">removeClass</span><span style="color: #007700">(</span><span style="color: #DD0000">'active'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">changeText</span><span style="color: #007700">(</span><span style="color: #0000BB">pbText</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'中'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'#F9AE35'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(</span><span style="color: #0000BB">lv&nbsp;</span><span style="color: #007700">==&nbsp;</span><span style="color: #0000BB">3</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span style="color: #DD0000">'.pbar_item1'</span><span style="color: #007700">).</span><span style="color: #0000BB">addClass</span><span style="color: #007700">(</span><span style="color: #DD0000">'active'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span style="color: #DD0000">'.pbar_item2'</span><span style="color: #007700">).</span><span style="color: #0000BB">addClass</span><span style="color: #007700">(</span><span style="color: #DD0000">'active'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span style="color: #DD0000">'.pbar_item3'</span><span style="color: #007700">).</span><span style="color: #0000BB">addClass</span><span style="color: #007700">(</span><span style="color: #DD0000">'active'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span style="color: #DD0000">'.pbar_item4'</span><span style="color: #007700">).</span><span style="color: #0000BB">removeClass</span><span style="color: #007700">(</span><span style="color: #DD0000">'active'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">changeText</span><span style="color: #007700">(</span><span style="color: #0000BB">pbText</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'高'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'#2DAF7D'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span style="color: #DD0000">'.pbar_item'</span><span style="color: #007700">).</span><span style="color: #0000BB">each</span><span style="color: #007700">(function()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</span><span style="color: #0000BB">this</span><span style="color: #007700">).</span><span style="color: #0000BB">addClass</span><span style="color: #007700">(</span><span style="color: #DD0000">'active'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">changeText</span><span style="color: #007700">(</span><span style="color: #0000BB">pbText</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'安全'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'green'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;});<br /></span><span style="color: #0000BB">&lt;/script&gt;&nbsp;</span><br />
</span><br />
</code></div><br />
</div><br />
<br />
<h1>最后记住一条安全准则：永远不要相信客户端提交的数据</h1><br />
<div class="txt_main"><strong>虽然我们在前端检查了密码强度，在后端我们还是需要再次检查一面。</strong><br />
php检测代码如下：<br />
<script type="text/javascript">window.attachEvent("onload",function (){AutoSizeDIV('CODE_BWCVeNEaC63i')})</script><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="code_head"><tr><td></td><td align="right"><a href="javascript:CopyText(document.all.CODE_BWCVeNEaC63i);">[复制到剪贴板] </a></td></tr></table><div class="code_main" id="CODE_BWCVeNEaC63i" style="overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;"><code><span style="color: #000000"><br />
<span style="color: #FF8000">/**<br />&nbsp;*&nbsp;返回强度0&nbsp;--&nbsp;4<br />&nbsp;*/&nbsp;<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">form_pwstrength</span><span style="color: #007700">(</span><span style="color: #0000BB">string&nbsp;$val</span><span style="color: #007700">):&nbsp;</span><span style="color: #0000BB">int<br /></span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;empty(</span><span style="color: #0000BB">$val</span><span style="color: #007700">)&nbsp;)&nbsp;return&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;</span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$val</span><span style="color: #007700">)&nbsp;&lt;&nbsp;</span><span style="color: #0000BB">8&nbsp;</span><span style="color: #007700">)&nbsp;return&nbsp;</span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$lv&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">"/[0-9]/"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$val</span><span style="color: #007700">)&nbsp;){</span><span style="color: #0000BB">$lv</span><span style="color: #007700">++;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">"/[a-z]/"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$val</span><span style="color: #007700">)&nbsp;){</span><span style="color: #0000BB">$lv</span><span style="color: #007700">++;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">"/[A-Z]/"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$val</span><span style="color: #007700">)&nbsp;){</span><span style="color: #0000BB">$lv</span><span style="color: #007700">++;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">"/[^a-zA-Z0-9]/"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$val</span><span style="color: #007700">)&nbsp;){</span><span style="color: #0000BB">$lv</span><span style="color: #007700">++;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">$lv</span><span style="color: #007700">;<br />}&nbsp;</span><br />
</span><br />
</code></div><br />
<strong>在&nbsp;CodeIgniter4&nbsp;中我们可以把这个函数放到&nbsp;helper&nbsp;中。</strong><br />
<br />
<strong>如果前端使用了&nbsp;zxcvbn&nbsp;库，后端也可以使用&nbsp;zxcvbn-php&nbsp;库。</strong><br />
</div><br />
<br />
<strong>一些文件下载</strong><br />
<img src="/images/download.gif" align="absmiddle" /><a target="_blank" href="http://dl.rickw.cn/f/20272120-983290801-562881">前端js库文件&nbsp;zxcvbn.js</a><br />
<img src="/images/download.gif" align="absmiddle" /><a target="_blank" href="http://dl.rickw.cn/f/20272120-983290795-6d940a">后端php库文件&nbsp;zxcvbn-php-1.3.1.zip</a><br />
<br />
]]></description>
</item>
<item>
<link>https://www.rickw.cn/blogview/274</link>
<title><![CDATA[Sublime Text4 安装中文语言包]]></title>
<author>rick</author>
<category>原创作品</category>
<pubDate>2023-11-28 12:28:17</pubDate>
<guid>https://www.rickw.cn/blogview/274</guid>
	
<description><![CDATA[<strong>Sublime&nbsp;Text4&nbsp;安装完成后默认是英文的，如果不习惯使用英文，可以安装中文语言包。</strong><br />
<br />
安装步骤如下：<br />
<br />
<br />
<br />
<ol type="1"><br />
<li>安装&nbsp;Sublime&nbsp;Text&nbsp;4&nbsp;成功后，点击菜单&nbsp;【Tools】&nbsp;-&gt;&nbsp;【Install&nbsp;Package&nbsp;Control】；<br />
<div class="txt_main"><font color="red"><strong>注意：安装包管理控制器需要等待一会，点击可能出现没有反应的情况，耐心等待弹窗即可！</strong></font></div><br />
<br />
<li><strong>在看到弹窗之前不要进行其它操作，看到弹出后点击【确定】按钮；</strong><br />
<img src="https://ooo.0x0.ooo/2023/11/28/OrGxXX.png" border="0" style="max-width:90%;height:auto;"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="showImage(this);" /><br />
<br />
<li><strong>点击菜单&nbsp;【Preferences】&nbsp;-&gt;&nbsp;【Package&nbsp;Control】-&gt;&nbsp;选择【Install&nbsp;Package】;</strong><br />
<div class="txt_main"><img src="https://ooo.0x0.ooo/2023/11/28/OrGFzt.png" border="0" style="max-width:90%;height:auto;"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="showImage(this);" /></div><br />
<br />
<li><strong>然后在弹出的输入框中输入关键词【ChineseLocalzations】，即可看到中文安装包，点击即可安装！</strong><br />
<img src="https://ooo.0x0.ooo/2023/11/28/OrGhPx.png" border="0" style="max-width:90%;height:auto;"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="showImage(this);" /><br />
<br />
<li><strong>安装完成后如下：</strong><br />
<img src="https://ooo.0x0.ooo/2023/11/28/OrGilj.png" border="0" style="max-width:90%;height:auto;"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="showImage(this);" /><br />
</ul></ol>]]></description>
</item>
</channel>
</rss>