Bueno, pues hice un pequeñito filtro que no ocupa nada, perfecto para cualquier menu:
for %%a in ("^","&","<",">","|") do (set "op=!op:%%~a=^%%~a!")
Limpia los caracteres especiales ^, &, <, >, |..
Como vemos hace falta setlocal enabledelayedexpansion, un pequeño ejemplo usado en una "mini calculadora":
@echo off
:: Mini calculadora creada por xassiz para explicar el uso
:: de un pequeño filtro de variables.
setlocal enabledelayedexpansion
:ini
cls&echo.
set "op="&set/p "op= Escribe tu operacion: "
for %%a in ("^","&","<",">","|") do (set "op=!op:%%~a=^%%~a!")
if not defined op (goto:ini)
set "res="
set/a "res=%op%">nul 2>&1
cls&echo.
echo. Operacion: %op%&echo. Resultado: %res%
pause>nul
goto:ini
Podemos inyectar:
mira&que>bueno<es|este^filtro
Que no dara ningun error:
Salida:
Operacion: mira&que>bueno<es|este^filtro
Resultado:
bytes ;)
está bastante bueno, eso si podrías añadir la coma.
Y siempre asignar con las comillas, mira lo que pasa con la variable z por no encerrarla: con el texto: &calc
@echo off
setlocal enabledelayedexpansion enableextensions
:prompt
set "t="
set /p t=Texto:
if not defined t (goto :prompt)
for %%a in ("^","&","<",">","|",",") do (set "t=!t:%%~a=^%%~a!")
if not defined t (goto :prompt)
set "v=%t%"
set z=%t%
echo.t=%t%
echo.v=%v%
echo.z=%z%
goto :prompt
Es decir, tu filtro está muy bueno, pero debes indicar esto de las asignaciones para que no haya problemas.
Pero, aún da problemas por ejemplo en un if:
setlocal enabledelayedexpansion enableextensions
:prompt
set "t="
set /p t=Texto:
if not defined t (goto :prompt)
for %%a in ("^","&","<",">","|",",") do (set "t=!t:%%~a=^%%~a!")
if not defined t (goto :prompt)
if "%t%"=="texto" (echo.Escribio texto)
goto :prompt
si escribes una comilla, se produce un error.
Para el uso que le estás dando, es un buen filtro, pero si utilizas las variables para otras cosas, como dentro de un if, no es un filtro completo.
En todo caso este tema ya está solucionado, básicamente usando expansión retardada en la mayoría de los casos no necesitas escapar ningún carácter.
Mira, como queda así:
@echo off
:: Mini calculadora creada por xassiz para explicar el uso
:: de un pequeño filtro de variables.
setlocal enabledelayedexpansion
:ini
cls&echo.
set "op="&set/p "op= Escribe tu operacion: "
set/a "res=!op!"
cls&echo.
echo. Operacion: !op!&echo. Resultado: !res!
pause>nul
goto:ini
Te recomiendo leas el artículo de las inyecciones batch, ahí expliqué prácticamente todo.
http://foro.elhacker.net/scripting/inyecciones_batch-t263688.0.html
Si, las comillas si las entiendo, ya viste que las use en mi codigo ^^
Tu manual tambien lo leyera, y tu antiguo articulo tambien ::)
Pero aun no me quedo muy claro el porque de !variable! en vez de %variable% para evitar inyecciones =/
Gracias 0x0309 ;)
PD: Que diferencia hay a poner los dos setlocal a quitar enableextensions?