2013-04-01 2 views
0

이 vbs에서 'inp'변수를 job.bat라는 이름의 일괄 처리로 전달하는 방법을 알려주십시오. 실제로 (echo % 2)를 에코 할 때 job.bat, 나는 INP가 제대로 전달되지 않습니다 것을 알 수 있습니다. 프롬프트 명령 뷰 INP 및 VBS에서 검색되지 값을. 감사합니다인수를 사용하여 VBScript에서 변수로 전달 변수

For Each listElement In xmlDoc.selectNodes("document/Lists/list") 
msgbox "toto" 
inp=listElement.selectSingleNode("entry").text 
out= listElement.selectSingleNode("output").text 
jeton= listElement.selectSingleNode("token").text 

dim shell 
set shell=createobject("wscript.shell") 
shell.run "job.bat ""a file"" **inp** " 
set shell=nothing 
Next 

답변

2

나는 당신이 찾고있는 것은이 생각합니다.

shell.run "job.bat ""argfile.ext"" " & inp 

그러나, Ansgar Wiechers은 위험한 XML 파일이 임의의 명령을 실행할 수 있기 때문에 그의 보안 위협이 될 수 있습니다. 배치 파일 인수를 캡슐화하고 의도하지 않은 결과를 방지하려면 개체의 ShellExecute method으로 전환하는 것이 좋습니다.

For Each listElement In xmlDoc.selectNodes("document/Lists/list") 

    msgbox "toto" 
    inp = listElement.selectSingleNode("entry").text 
    out = listElement.selectSingleNode("output").text 
    jeton = listElement.selectSingleNode("token").text 

    set shell=CreateObject("Shell.Application") 
    shell.ShellExecute "job.bat", """a file"" " & inp, "path\to\batfile\", "runas", 1 
    set shell=nothing 

Next 
+0

감사합니다. 그것은 밖으로 일한다! – tamo

2

여러 가지 다른 언어와는 달리 VBScript를 문자열 내부 변수를 확장하지 않습니다. 그 때문에, 문자열

"job.bat ""a file"" inp " 

inp는 리터럴 문자열 "inp", 변수 inp 아닌 값입니다. @rojo 제안 같은 변수의 값을 가진 문자열을 생성하려면 기본 문자열과 변수를 연결하는이 :

shell.run "job.bat ""a file"" " & inp 

나는, 그러나, 몇 가지 안전 조치없이이 일을 권하고 싶지 않다. 한 가지는 공백이 들어갈 경우를 대비하여 인수 주위에 항상 큰 따옴표를 넣어야합니다. 나는 일반적으로 쿼드 따옴표 투성이가되는 지시를 방지하기 위해이에 대한 인용 기능을 사용 : 또한 항상 쉘 명령에 전달되는 모든 사용자 입력에 살균 적용해야

Function qq(str) : qq = Chr(34) & str & Chr(34) : End Function 

'... 
shell.run "job.bat " & qq("a file") & " " & qq(inp) 

. 그렇지 않으면 사용자가 foo & del /s /q C:\*.*과 같은 것을 입력하여 혼란을 야기 할 수 있습니다. 일반적으로 입력 문자열에 잘 알려진 문자 만 허용하고 나머지 문자는 모두 안전 문자 (예 : 밑줄)로 바꿉니다. 정규 표현식을 사용하면 다음과 같이 표현할 수 있습니다.

Set re = New RegExp 
re.Pattern = "[^ a-z0-9äöü.,_$%()-]" 
re.Global = True 
re.IgnoreCase = True 

inp = re.Replace(inp, "_") 
+0

+1 철저히 조사하십시오. 그래도 뭔가 궁금해. 'ADODB.Command' 객체를 사용하면 매개 변수화 된 쿼리를 수행 할 수 있습니다 - cmdObj.commandText = "INSERT INTO table (col1, col2) VALUES (?,?)"'그리고 cmdObj.parameters (0) .value = "val1"'및'cmdObj.parameters (1) .value = "val2"'를 사용하여 SQL 주입 공격을 방지합니다. 'shell.run' 명령을 빌드하는 것과 같은 다른 것들을 위해 매개 변수화 된 쿼리를 작성하는 동일한 규칙을 적용 할 수 있습니까? – rojo

+0

내가 아는 것은 아닙니다. 잠재적으로 해로운 문자를 "제거"하는 일종의 탈출 함수가 필요하지만 VBScript (또는 일반적인 COM 개체)에 내장 된 함수/메서드에 대해서는 알지 못합니다. –

+1

실제로, 방금 테스트를 실시했는데,'Shell.Application' 오브젝트의 [ShellExecute 메소드] (http://ss64.com/vb/shellexecute.html)가 성공적으로 공격을 차단하기 위해 인수를 캡슐화 한 것처럼 보입니다. 다시 설명합니다. 'wsh.shell'의'run' 메소드보다 안전 할 수도 있습니다. – rojo

관련 문제