文章作者:allyesno
早在写bat的一个小游戏猜数字的时候我就研究过这个问题如何在bat里面实现对输入的任意字符进行过滤当时使用的几种方法如下
Codz:
if"%1"=="要过滤的字符"echo你输入的是非法字符
例:if"%1"=="wrongpassword"echo错误口令
seterrorlevel=0
echo要过滤的字符|find"要过滤的字符"
if"%errorlevel%"=="0"echo你输入的是是非法字符
if"%errorlevel%"=="1"echo该字符串不在非法列表中
主要是使用这两种方法这两种方法可以过滤数字和英文字母但是对特殊字符不起作用
当要过滤【_+|-=[]{};':,./">~`!@#$%^&*()_+|-=[]{};':,./<>?】(包含空格和tab键值)的时候我们要这样
Codz:
echo"anyword"|find"anywrod"
注意到有什么不同了吗是的我们加入了""来包含anyword可是过滤到此并没完成发现上面要过滤的字符少了什么吗是的少了"字符本身遗憾的是这种方法无法完美的过滤"字符本身当"取值为奇数和偶数的时候用find对她进行过滤随条件不同可能会报错
这个问题困扰了我半年之久曾在安焦上问了一下没人回答
事实上要过滤它并不是那么的简单我们先写几个验证密码的小程序看看在不同情况下程序的反应
我们先写一个验证密码登录的小程序
注:当密码验证字符为ph4nt0m的时候授权登录
Codz:
@echooff
cls
:allyesno
seterrorlevel=>nul
echo请输入登录口令
set/ppassword=
echo"%password%"|findstr"ph4nt0m"
if"%errorlevel%"=="0"echo口令正确&gotoend
echo口令错误&gotoallyesno
:end
echo你成功登录系统
将bat保存为key.bat执行
执行结果
Codz:
C:test>key
请输入登录口令
test
口令错误
请输入登录口令
ph4nt0m
"ph4nt0m"
口令正确
你成功登录系统
事实上上面的代码用来进行一般的口令验证已经足够了但是要达到我们的目的任意字符过滤还不行
我们换个方式执行看看
执行结果
Codz:
C:test>key
请输入登录口令
test
口令错误
请输入登录口令
"
"""|findstr"ph4nt0m"
口令错误
请输入登录口令
ph4nt0m
"ph4nt0m"
口令正确
你成功登录系统
看见了吗当我们输入"字符的时候程序报错了并显示了密码为什么会这样呢?我们再看这个语句的语法结构echo"%password%"|findstr"ph4nt0m"当%password%="的时候就是echo"""|findstr"ph4nt0m"
之所以会如此跟echo的特性有关我们看下面几个语句
Codz:
I:>echo"|cd
"|cd
I:>echo""|cd
I:
I:>echo"""|cd
"""|cd
I:>echo""""|cd
I:
当"为奇数的时候则打印整行当"为偶数的时候则执行|字符后面的命令上面程序执行的命令是cd
这里我想了一个办法绕过echo的报错特性我用set代替了echo程序如下
Codz:
@echooff
cls
:allyesno
seterrorlevel=>nul
echo请输入登录口令
set/ppassword=
set|findstr"ph4nt0m"
if"%errorlevel%"=="0"echo口令正确&gotoend
echo口令错误&gotoallyesno
:end
echo你成功登录系统
执行结果如下
Codz:
请输入登录口令
test
口令错误
请输入登录口令
"
口令错误
请输入登录口令
ph4nt0m
password=ph4nt0m
口令正确
你成功登录系统
C:test>
程序进一步的完美了
但是还是有问题D我们再来看换一种方式执行
Codz:
请输入登录口令
test
口令错误
请输入登录口令
ph4nt0mallyesno
password=ph4nt0mallyesno
口令正确
你成功登录系统
C:test>
由于程序的验证方式是set|findstr"ph4nt0m"所以只要包含ph4nt0m字符的密码都被当成正确密码所以密码ph4nt0mallyesno也通过了
为了避免这个问题我设置了匹配参数<>对数据进行检验修改后的程序如下
Codz:
@echooff
cls
:allyesno
seterrorlevel=>nul
echo请输入登录口令
set/ppassword=
set|findstr"<ph4nt0m>"
if"%errorlevel%"=="0"echo口令正确&gotoend
echo口令错误&gotoallyesno
:end
echo你成功登录系统
执行结果
Codz:
请输入登录口令
test
口令错误
请输入登录口令
ph4nt0mallyesno
口令错误
请输入登录口令
ph4nt0m
password=ph4nt0m
口令正确
你成功登录系统
C:test>
最后再将程序修整如下
Codz:
@echooff
cls
:allyesno
seterrorlevel=>nul
echo请输入登录口令
set/ppassword=
rem如果密码字符串包含此行任一字符_+|-=[]{};':,./">~`!@#$%^&*()_+|-=[]{};':,./<>?则必须使用匹配模式<>
rem需要双写的字符
rem不可以作为密码的字符"
setpassword|findstr"<ph4nt0m>"
if"%errorlevel%"=="0"echo口令正确&gotoend
echo口令错误&gotoallyesno
:end
setpassword=>nul
echo你成功登录系统
注:当密码字符串中有字符的时候需要将字符双写
例setpassword|findstr"<>"
登录的时候只需要写一次不需要双写
"字符不可以作为密码字符串如果密码字符串包含此行任一字符_+|-=[]{};':,./">~`!@#$%^&*()_+|-=[]{};':,./<>?则必须使用匹配模式<>