我需要在客户端网站中使用PHP函数替换掉一大堆PHP超级全局变量,以便从xss攻击中清除超级全局。
以下是原始代码的样子:
echo $_REQUEST['HELLO1'] . ' AND ' . $_REQUEST['HELLO2'];
我需要它看起来像这样:
echo MYCLASS::myfunction($_REQUEST['HELLO1']) . ' AND ' . MYCLASS::myfunction($_REQUEST['HELLO2']);
主要问题,我需要对超过100个文件进行搜索/替换!糟糕!
所以我的解决方案就是这个(在linux shell中):
sudo sed -i 's/\$_REQUEST[.*\]/MYCLASS::myfunction(&)/g' *.php
这很好用 - 因为每行只发生一个“$ _REQUEST”实例...但是有多个实例,它会搞砸并执行此操作:
echo MYCLASS::myfunction($_REQUEST['HELLO1'] . ' AND ' . $_REQUEST['HELLO2']);
答案 0 :(得分:2)
问题在于.*
是贪婪的,并且会找到尽可能长的匹配。要解决这个问题,请使用[^]]*
,以免不小心抓住一组额外的方括号。
sudo sed -i 's/\$_REQUEST\[[^]]*\]/MYCLASS::myfunction(&)/g' *.php
在其他正则表达式方言中,您也可以编写.*?
以使通配符不贪婪,但这似乎不适用于sed(至少在我的版本中没有,甚至不在sed -r
)。
答案 1 :(得分:1)
在Perl中,以下脚本将在您向脚本传递您感兴趣的文件名称的位置
假设脚本是t.pl,你的文件是file.php
输出回file.php
perl t.pl file.php> file.php
输出到另一个文件,这样就不会覆盖原来的文件
perl 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";
}
出口;
答案 2 :(得分:1)
尝试使用此sed命令:
sed -i.bak 's/\$_REQUEST\[\([^]]*\)\]/MYCLASS::myfunction(\1)/g' *.php
或perl:
perl -pe 's/\$_REQUEST\[([^]]*)\]/MYCLASS::myfunction(\1)/g' file.php
答案 3 :(得分:1)
sed 's/\$_REQUEST\[[^]]*\]/MYCLASS::myfunction(&)/g'
答案 4 :(得分:0)
这应该这样做:
sed -i "s/\$_REQUEST\[\([^\x5d]*\)\]/MYCLASS::myfunction(\1)/g" *.php
我在匹配]
时遇到了很多麻烦,所以我用\x5d
进行了抨击。