2011-04-29 8 views
3

여기에 doosey가 있습니다. 나는 리눅스 껍데기를 처음 접해 보았으므로 나를 맨손으로했다 ...Linux SED 검색은 한 줄에 여러 줄을 바꿉니다.

나는 클라이언트 웹 사이트에서 xss 공격으로부터 슈퍼 전역을 제거하기 위해 만든 PHP 함수로 전체를 대체해야한다.

echo MYCLASS::myfunction($_REQUEST['HELLO1']) . ' AND ' . MYCLASS::myfunction($_REQUEST['HELLO2']); 

주요 문제는, 내가/검색을 할 이상에 교체 할 필요가 : I는 다음과 같이 할 필요

echo $_REQUEST['HELLO1'] . ' AND ' . $_REQUEST['HELLO2']; 

: 여기

처럼 원래의 코드가 보일 수 있습니다 것입니다 100 파일! Yikes!

그래서 내 솔루션은이 (리눅스 쉘에서)이었다

sudo sed -i 's/\$_REQUEST[.*\]/MYCLASS::myfunction(&)/g' *.php 

이 좋은 작품으로 긴 것과 같이 "$ _REQUEST는"그러나 여러 인스턴스와 함께 ... 줄에 발생하는 하나의 인스턴스 만, 그것은 나사를 위로하고 다음과 같이하십시오 :

echo MYCLASS::myfunction($_REQUEST['HELLO1'] . ' AND ' . $_REQUEST['HELLO2']); 

나는 지금 내 머리카락을 꺼내고 있습니다!

모든 Linux 셸 전문가가 저를 도와 줄 수 있습니까?

sed -i "s/\$_REQUEST\[\([^\x5d]*\)\]/MYCLASS::myfunction(\1)/g" *.php 

내가 ] 일치 문제를 많이했다, 그래서 나는 \x5d와 펀트했습니다

답변

1

이 나오지 명령을보십시오 :

sed -i.bak 's/\$_REQUEST\[\([^]]*\)\]/MYCLASS::myfunction(\1)/g' *.php 

또는 펄 : 내가 "-e 표현 # 1을 얻고있다

perl -pe 's/\$_REQUEST\[([^]]*)\]/MYCLASS::myfunction(\1)/g' file.php 
+0

이것은 Perl 스크립트보다 훨씬 빠릅니다. 감사합니다! –

+0

당신도 환영합니다, 나는 똑같은 대답을 할 수 있도록 perl 1 라이너를 제공했습니다. – anubhava

+0

그래도 하나의 문제가 있습니다. $ _REQUEST [ ''] WITH $ _REQUEST (" ')를 대체하는 방법을 대체합니다. –

0

이 그것을해야한다.

+0

, 문자 43 : 1 \ 잘못된 참조 's; 명령의 –

+0

''/ * $ REQUEST \ [\ ([^ \]] [^ \]] *) \]/....' – shellter

2

.*은 욕심이 많아 가능한 한 가장 오래 걸릴 수 있습니다. 이 문제를 해결하려면 대신 [^]]*을 사용하십시오. 실수로 여분의 대괄호 세트를 차지하지 않도록하십시오.

sudo sed -i 's/\$_REQUEST\[[^]]*\]/MYCLASS::myfunction(&)/g' *.php 

다른 정규식 방언에서 당신은 또한 와일드 카드가 아닌 욕심 수 있도록 .*?를 작성할 수 있지만,이 나오지도 (적어도조차 sed -r 내 버전에서)에서 작동하도록 나타나지 않습니다.

+0

도와 주셔서 감사합니다. 흥미 롭습니다. 대답은 작동하지 않습니다. 우리는. *을 시도하고 있습니다. ks! –

+0

귀하의 답변이이 문제를 해결하는 데 도움이 된 것 같습니다. 감사. –

1

스크립트 당신이
에 관심이있는 파일의 이름을 전달 곳 펄에서 다음 스크립트가 작동 스크립트가 t.pl라고 할 수 있습니다 및 파일은 파일을 다시 file.php
출력입니다 에 .php
펄 t.pl file.php> file.php 다른 파일에 출력
당신이 덮어 쓰지 않도록 원래
펄 t.pl file.php> another_file.PHP

#!/usr/bin/perl 

$FILE_NAME = $ARGV[0]; 

open (FILE_NAME) or die ("Could not open FILE_NAME information file: $FILE_NAME \n"); 
@file_contents = <FILE_NAME>; 
close (FILE_NAME); 


foreach $line (@file_contents) { 
     chomp($line); 
     $line =~ s/\$_REQUEST\[.*?\]/MYCLASS\:\:myfunction\($&\)/g; 
     print $line." \n"; 
} 

종료;

+0

내가 sed를 사용하지 않았기 때문에 솔루션 마크를 얻었는지 확신 할 수 없지만이 Perl 스크립트가 효과가있어 기쁘다. – Troy

1

sed 's/\$_REQUEST\[[^]]*\]/MYCLASS::myfunction(&)/g'

관련 문제