[F][bat] Pequeño Filtro - by xassiz

Iniciado por xassiz_, 31 Agosto 2009, 22:28 PM

0 Miembros y 1 Visitante están viendo este tema.

xassiz_

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 ;)



YXVuIGVyZXMgbWF0YWRvIHBhcmEgcG9uZXJ0ZSBhIGRlc2NpZnJhciBlc3RvIHhE

0x0309

#1
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

xassiz_

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?



YXVuIGVyZXMgbWF0YWRvIHBhcmEgcG9uZXJ0ZSBhIGRlc2NpZnJhciBlc3RvIHhE