安全密码保护批处理

secure password protected batch

我目前正在制作受密码保护的批处理文件, 问题是当我输入 @echo on%@echo on% 时它会显示密码,(一会,但如果你做视频你可以清楚地看到它)。

当我将第 3 行更改为此 if "%pwd%"==somepassword 时,然后再次键入 @echo on 显示密码。

我有一些想法。对于前。使@echo off不可更改,或字符转义,但我不太擅长批处理脚本,所以我无法通过代码编写。

有没有人可以帮我解决这个问题?

@echo off
set /p pwd="Enter password: "
if %pwd%==somepassword (cmd /k) else (exit)

可以使用:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "pwd="

:PwdPrompt
set /P "pwd=Enter password: " || goto PwdPrompt
setlocal EnableDelayedExpansion
if not "!pwd!" == "somepassword" exit /B
endlocal
echo The password is correct!
echo/
pause
endlocal

这里先完整定义了需要的执行环境

  • 关闭命令回显模式和
  • 启用命令扩展和
  • 禁用延迟变量扩展。

接下来显式未定义环境变量 pwd。用户必须输入密码。

系统会提示用户输入密码,只要用户根本不输入字符串,该过程就会循环完成。所以批处理文件不接受任何输入。

然后在进行字符串比较之前启用延迟变量扩展,利用延迟变量扩展来防止用户输入的字符串修改批处理文件代码以执行。

如果比较的两个字符串不相等,则退出批处理文件处理(不一定是命令进程),这会导致 cmd.exe 对两个 [=] 隐式执行 endlocal 两次14=] 在真正退出批处理文件处理之前。

否则,在输入的密码字符串等于批处理文件中的密码字符串时,在使用下一个命令继续批处理文件处理之前,将恢复先前禁用延迟扩展的本地环境。

为了了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • goto /?
  • if /?
  • pause /?
  • set /?
  • setlocal /?

我也强烈建议阅读:


  • 它详细解释了为什么此代码是 fail-safe 和安全的。
  • Single line with multiple commands using Windows batch file
    它详细解释了命令运算符 ||.
  • 的含义

  • 它详细解释了如何使用命令 IF.
  • 进行字符串比较

  • 它详细解释了命令 SETLOCALENDLOCAL.
  • DosTips 论坛主题:ECHO. FAILS to give text or blank line - Instead use ECHO/