Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: xassiz_ en 31 Agosto 2009, 22:28 pm



Título: [F][bat] Pequeño Filtro - by xassiz
Publicado por: xassiz_ en 31 Agosto 2009, 22:28 pm
Bueno, pues hice un pequeñito filtro que no ocupa nada, perfecto para cualquier menu:

Código:
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":

Código:
@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:

Código:
mira&que>bueno<es|este^filtro

Que no dara ningun error:

Salida:

Código:
  Operacion: mira&que>bueno<es|este^filtro
  Resultado:


bytes ;)


Título: Re: [F][bat] Pequeño Filtro - by xassiz
Publicado por: 0x0309 en 2 Septiembre 2009, 06:05 am
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
Código:
@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:

Código:
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í:

Código:
@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


Título: Re: [F][bat] Pequeño Filtro - by xassiz
Publicado por: xassiz_ en 2 Septiembre 2009, 15:11 pm
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?