为什么用户可以设置新密码,而无需输入与我的批处理代码正确的旧密码?

2023-12-31

我最近写了一个文件夹锁定程序。

我唯一的问题是当我需要更改密码时,例如我去部分newpass,该程序似乎不会将旧密码与新密码进行比较,而只是使用给定的任何输入,这违背了拥有密码的目的,因为每个人都可以更改密码,而不是用它解锁文件夹。

有人可以仔细检查我的代码并告诉我为什么这样做吗?

@echo off 
title Folder Locker by KBKOZLEV
:SETPASS
set/p password= <password.txt
set/p tipp= <tipp.txt
attrib +h +s "password.txt"
attrib +h +s "tipp.txt"
:START
if exist "Locked" goto OPEN
if exist "Unlocked" goto LOCK
if not exist "Unlocked" goto MDLOCKER
:LOCK
ren Unlocked "Locked"
attrib +h +s "Locked" 
echo.
echo Folder locked 
CHOICE /C X /T 1 /D X > nul
exit
:MDLOCKER
md Unlocked
echo( 1234 > password.txt
)
echo( 1234 > tipp.txt
)
attrib +h +s "password.txt" 
attrib +h +s "tipp.txt"
cls
echo.
echo Private folder created successfully 
CHOICE /C X /T 1 /D X > nul
goto End 
:OPEN
cls
echo.
echo Password Tip:%tipp%
echo.
echo Enter password to unlock folder or
echo Enter "new" to set a new password. 
set/p pass=">" 
if %pass%==new goto newpass
if %pass%==%password% ( 
attrib  -h -s "Locked" 
ren Locked "Unlocked"
echo Folder unlocked successfully 
goto End 
)
goto FAIL
:FAIL
cls
echo.
echo Invalid password,please try again. 
CHOICE /C X /T 1 /D X > nul 
cls
goto OPEN
:NEWPASS
cls
echo.
echo Enter old password.
set/p oldpass=">"
if %oldpass%==%password% {
attrib -h -s "password.txt"
attrib -h -s "tipp.txt"
cls 
echo.
echo Enter new password. 
set/p newpass= ">"
echo( %newpass% > password.txt
)
pause
cls
echo.
echo Enter new tipp
set/p passtipp=">"
echo( %passtipp% > tipp.txt
)
goto setpass
}
goto fail
:END

延迟环境变量扩展

最后重写批处理代码,以避免由于在IF块并在同一个块中对其进行评估,就像您在

if %oldpass%==%password% (
    attrib -h -s "password.txt"
    attrib -h -s "tipp.txt"
    cls
    echo.
    echo Enter new password. 
    set/p newpass= ">"
    echo( %newpass% > password.txt
    )
    rem ...
)

命令行解释器cmd.exe替换所有%env% within ( ... )在评估之前按其值进行阻止IF条件导致例如newpass总是什么都不是(最有可能)。在命令提示符窗口中阅读命令的完整帮助set输入后输出help set or set /?有关延迟扩展的详细信息。

打字错误

{代替(在您问题的上述代码块中。

块压痕

您应该在 a 内缩进行( ... )块,否则任何人都很难看到块结构,这使得代码检查非常困难。

RETURN 时环境变量不变

如果用户必须输入分配给环境变量的字符串,则用户始终可以只按 RETURN 或 ENTER 键,而无需输入任何内容。在这种情况下,如果环境变量已经存在,则环境变量的值根本不会改变。因此建议使用前确保环境变量不存在set /p如果用户必须输入一些内容。

另一种可能性是为环境变量分配了默认值,因此如果应使用默认值,用户只需按 RETURN 或 ENTER。但在此批处理代码中,用户应始终输入所有字符串。

分配给环境变量的尾随空格

可以将带有空格的字符串分配给环境变量,并且空格也可以位于字符串的末尾。批处理文件中的尾随空格是批处理文件无法按预期工作的常见原因。解决方案是使用 set“var=value”,因为在这种情况下,命令执行时会忽略第二个双引号后面的尾随空格。

字符串始终与周围的双引号进行比较

环境变量与字符串值的比较应始终在环境变量引用和字符串值周围使用双引号进行。否则,当用户输入任何内容时,很容易发生这种情况IF条件被解析为

if ==new goto newpass

这是无效的并且cmd.exe中断批处理文件的执行。这不会再发生了

if /i "%pass%"=="new" goto NEWPASS

/i使比较不区分大小写。

用户输入的双引号会破坏批处理脚本

但是用户仍然可以通过现在输入双引号字符来中断批处理文件的执行。解决方案是在进行字符串比较之前从输入的字符串中删除所有双引号,例如使用

set newpass=%newpass:"=%

但这会导致另一个问题,如果newpass在提示用户输入新密码并且用户不输入任何内容之前删除。这将再次导致无效的命令行语法cmd.exe。解决方案是预先定义newpass and passtipp只用"作为价值。现在用户可以按 RETURN 键,但变量仍然存在"作为价值。接下来将删除此双引号,并且批处理代码在下一行检测到用户尚未输入任何内容,否则单个双引号将被不同的内容替换。

最终批次代码

@echo off
title Folder Locker by KBKOZLEV
:SETPASS
set "tipp="
set "password="
if exist "password.txt" (
    set /p password=<password.txt
    attrib +h +s "password.txt"
)
if exist "tipp.txt" (
    set /p tipp=<tipp.txt
    attrib +h +s "tipp.txt"
)
:START
if exist "Locked" goto OPEN
if exist "Unlocked" goto LOCK
if not exist "Unlocked" goto MDLOCKER
:LOCK
ren "Unlocked" "Locked"
attrib +h +s "Locked"
echo.
echo Folder locked.
CHOICE /C X /T 5 /D X > nul
exit
:MDLOCKER
md "Unlocked"
echo>password.txt 1234
echo>tipp.txt 1234
attrib +h +s "password.txt"
attrib +h +s "tipp.txt"
cls
echo.
echo Private folder created successfully.
CHOICE /C X /T 5 /D X > nul
goto END
:OPEN
cls
echo.
echo Password tipp: %tipp%
echo.
echo Enter password to unlock folder or
echo enter "new" to set a new password.
echo.
set "pass="
set /p "pass=Password: "
if /i "%pass%"=="new" goto NEWPASS
if "%pass%"=="%password%" (
    attrib -h -s "Locked"
    ren "Locked" "Unlocked"
    echo.
    echo Folder unlocked successfully.
    goto END
)
goto FAIL
:FAIL
cls
echo.
echo Invalid password, please try again.
CHOICE /C X /T 5 /D X > nul
cls
goto OPEN
:NEWPASS
cls
echo.
set "oldpass="
set /p "oldpass=Old password: "
if not "%oldpass%"=="%password%" goto FAIL
:ENTERNEW
cls
echo.
set "newpass=""
set /p "newpass=New password: "
set newpass=%newpass:"=%
if "%newpass%"=="" (
    echo.
    echo Invalid new password, please enter new password again.
    CHOICE /C X /T 5 /D X > nul
    goto ENTERNEW
)
if exist "password.txt" attrib -h -s "password.txt"
echo>password.txt %newpass%
echo.
set "passtipp=""
set /p "passtipp=New tipp: "
set passtipp=%passtipp:"=%
if exist "tipp.txt" attrib -h -s "tipp.txt"
if not "%passtipp%"=="" (
    echo>tipp.txt %passtipp%
) else (
    del "tipp.txt"
)
goto SETPASS
:END

这里写的所有内容都已经在 Stack Overflow 上针对带有标签的问题的回答中被写了数千次了批处理文件。在开始批量代码开发之前,最好阅读这里 20 到 30 个答案。


2015年5月8日编辑:

如果此批处理文件的用户输入,这里是一个比上面更好的版本< or >在密码中或作为提示。它在必要时使用延迟扩展以避免这 2 个字符被解释为重定向语句。

@echo off
setlocal EnableDelayedExpansion
title Folder Locker by KBKOZLEV
:SETPASS
set "tipp="
set "password="
if exist "password.txt" (
    set /p password=<password.txt
    attrib +h +s "password.txt"
)
if exist "tipp.txt" (
    set /p tipp=<tipp.txt
    attrib +h +s "tipp.txt"
)
:START
if exist "Locked" goto OPEN
if exist "Unlocked" goto LOCK
if not exist "Unlocked" goto MDLOCKER
:LOCK
ren "Unlocked" "Locked"
attrib +h +s "Locked"
echo.
echo Folder locked.
CHOICE /C X /T 5 /D X > nul
exit
:MDLOCKER
md "Unlocked"
echo>password.txt 1234
echo>tipp.txt 1234
attrib +h +s "password.txt"
attrib +h +s "tipp.txt"
cls
echo.
echo Private folder created successfully.
CHOICE /C X /T 5 /D X > nul
goto END
:OPEN
cls
echo.
echo Password tipp: %tipp%
echo.
echo Enter password to unlock folder or
echo enter "new" to set a new password.
echo.
set "pass=""
set /p "pass=Password: "
set "pass=!pass:"=!"
if /i "%pass%"=="new" goto NEWPASS
if "%pass%"=="%password%" (
    attrib -h -s "Locked"
    ren "Locked" "Unlocked"
    echo.
    echo Folder unlocked successfully.
    goto END
)
goto FAIL
:FAIL
cls
echo.
echo Invalid password, please try again.
CHOICE /C X /T 5 /D X > nul
cls
goto OPEN
:NEWPASS
cls
echo.
set "oldpass=""
set /p "oldpass=Old password: "
set "oldpass=!oldpass:"=!"
if not "%oldpass%"=="%password%" goto FAIL
:ENTERNEW
cls
echo.
set "newpass=""
set /p "newpass=New password: "
set "newpass=!newpass:"=!"
if "%newpass%"=="" (
    echo.
    echo Invalid new password, please enter new password again.
    CHOICE /C X /T 5 /D X > nul
    goto ENTERNEW
)
if exist "password.txt" attrib -h -s "password.txt"
echo>password.txt !newpass!
echo.
set "passtipp=""
set /p "passtipp=New tipp: "
set "passtipp=!passtipp:"=!"
if exist "tipp.txt" attrib -h -s "tipp.txt"
if not "%passtipp%"=="" (
    echo>tipp.txt !passtipp!
) else (
    del "tipp.txt"
)
goto SETPASS
:END
endlocal
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么用户可以设置新密码,而无需输入与我的批处理代码正确的旧密码? 的相关文章

随机推荐

  • LibGDX 桌面启动器失败

    我一直在关注this https www youtube com watch v ir6O5hS Qk在线教程 我现在正在看第 2a 集 我尝试跑步DesktopLauncher第一次 我收到了一堆警告和这个错误 任务 desktop De
  • Glassfish 应用程序无法与 Maven 库(gf-client)一起使用

    在学校作业中 我收到了一个使用 JNDI 和 JMS 以及 Glassfish 3 开源版本 的 Netbeans 项目 此应用程序使用的所有 Glassfish 库均通过绝对路径引用 所有其他库 在 lib 文件夹中 均通过相对路径引用
  • 什么数据类型适合在 ActiveX 方法中处理二进制数据?

    我正在为我的朋友编写一个 ActiveX 控件 它应该封装加密例程 主要从 VB6 开始使用 我应该为加密密钥 初始化向量 输入和输出数据等二进制数据选择什么数据类型 以便我的朋友可以方便地从VB6使用它 我正在使用 Delphi 7 来编
  • Python:在 __init__ 中引发异常是一种不好的形式吗?

    在内部提出异常是否被认为是不好的形式 init 如果是这样 那么当某些类变量初始化为时抛出错误的可接受方法是什么None或者类型不正确 引发异常 init 绝对没问题 没有其他好的方法来指示初始化程序中的错误情况 并且标准库中有数百个示例
  • 在共享 Web 服务器上安装 PDFTK

    我的网站托管在 Total Choice Hosting 上 使用某种 Linux 我不知道具体是什么品种 和 Apache 我没有命令行访问权限 我只能通过 PHP 中的 exec 或通过 CRON 作业运行命令行程序 我可以在这样的系统
  • Web 服务代理设置

    在c 4 0 中 我有一个名为ManufacturerContactDetails 的Web 服务 我使用以下命令从 Windows 应用程序调用该 Web 服务 var ws new ManufacturerContactDetailsW
  • 从 TypeScript 扩展数组

    我在下面的代码中做错了什么 我正在尝试延长Array在我的课堂上MyNumberList然后尝试使用它 我看到的是 似乎没有任何项目被添加到列表中 我得到一个undefined当我尝试访问列表元素时 P S 我正在使用 TypeScript
  • 使用单独的数据库进行 papertrail 版本控制

    我正在尝试使用 papertrail 将模型的更改事件记录在单独的数据库中 我在用着 导轨 4 1 2 Ruby 2 1 纸迹 4 0 0 下面是我在关注点中添加的代码 module Foo class Base lt ActiveReco
  • 在 Pyspark 中将列类型从字符串更改为日期

    我正在尝试将列类型从字符串更改为日期 我咨询过以下人士的答案 如何将 DataFrame 中的列类型从字符串更改为日期 https stackoverflow com questions 36948012 how to change the
  • 删除了配置门户中的团队配置配置文件:*,该怎么办?

    我不小心删除了配置门户中的团队配置配置文件 我现在应该做什么 我有一台安装了 Xcode 4 2 的 MacBook 我还在 熟悉 iOS 配置门户和 Xcode 的过程中删除了 iOS 团队配置配置文件 我没有成功地恢复它 无论是从 Xc
  • 如何使用 TestCafe 和 Yaml 将屏幕截图和视频保存为 Azure Build Pipeline 中的附件?

    我正在尝试在 Azure Devops 中创建一个构建管道 运行在 TestCafe Studio 中创建的测试 保存错误屏幕截图 并保存每次测试的视频 保存测试运行的视频 将测试结果发布到测试运行 将屏幕截图和视频作为附件发布到构建管道和
  • 在经典 ASP 脚本中使用 ADO.NET

    我正在编写一些返回单个值的简单查询 并且我想从经典 ASP 的 ADO 库中获取 ADO NET ExecuteScalar 方法的行为 但是 我不想重新发明轮子 是否可以在经典 ASP 中实例化 ADO NET 的 Command 对象
  • 码头工人。 MySQL 图像。无法更改 my.cnf 文件

    我有这样一个docker compose yml database container name test db image mysql 5 7 volumes docker my cnf etc my cnf environment MY
  • 如何检测 NSString 是否包含特定字符?

    我有一个 NSString 对象 例如 45 0000 现在我想知道这个字符串是否包含 我怎样才能做到这一点 您是否想查找它是否至少包含以下一项 or 您可以使用 rangeOfCharacterFromSet NSCharacterSet
  • 复制没有历史记录的 git 存储库

    我在 GitHub 上有一个私人存储库 我想将其公开 但是 一些初始提交包含我不想公开的信息 硬编码凭据等 在不包含部分或全部提交历史记录的情况下 公开最新提交 我真的不需要或不希望公共存储库中的先前提交 的最简单方法是什么 您可以限制历史
  • 如何在Web应用程序中使复选框只读

    我有一个网格视图 每一行都有一个复选框 当进入编辑模式时 可以选中 取消选中复选框 但我不希望该复选框在任何其他模式下都是可编辑的 用户可能很容易对不反映保存回数据库中的真实值的复选框感到困惑
  • 使用for循环批量重命名文件

    我正在尝试使用 for 循环来重命名文件 Echo Off setlocal enableDelayedExpansion Set Date set mydate DATE 10 4 DATE 4 2 DATE 7 2 Rename fil
  • 拆分逗号分隔的字符串并在 C# 中添加引号 - 优雅的解决方案

    我有一个string看起来像这样 var v 10 14 18 21 并想将其用作如下所示的东西 10 14 18 21 我写了一个函数 它将值分割为comma并将它们作为字符串添加在一起 另外我删除了最后一个 从结果字符串 我把所有东西都
  • DQL 返回实体数组而不是对象

    通常 如果我运行如下所示的 DQL 查询 它将返回实体对象列表 d this gt getDoctrine gt getRepository xxxWebsiteBundle Locations gt createQueryBuilder
  • 为什么用户可以设置新密码,而无需输入与我的批处理代码正确的旧密码?

    我最近写了一个文件夹锁定程序 我唯一的问题是当我需要更改密码时 例如我去部分newpass 该程序似乎不会将旧密码与新密码进行比较 而只是使用给定的任何输入 这违背了拥有密码的目的 因为每个人都可以更改密码 而不是用它解锁文件夹 有人可以仔