我有以下Perl脚本。一个人可以(现在不是因为我把它拿下来)ping一个像
这样的网址http://www.joereddington.com/testsound/getsound.pl?text=hello%20mum
然后找到该文件
http://www.joereddington.com/testsound/hope.wav
是一个电脑声音的录音,上面写着“你好妈妈”。
#!/usr/bin/perl
use strict;
use warnings;
use CGI qw(:standard -debug);
my $text = param('text');
$text =~ s/[^0-9a-zA-Z\s]//g;
print "Content-type: text/html\n\n";
system("/home8/projedf4/tts/espeak-1.48.04-source/src/speak \"$text\" -w hope.wav");
我有点担心让用户可能利用注入攻击等。我相信我已经做了足够的线
$text =~ s/[^0-9a-zA-Z\s]//g;
因为我只是简单地从字符串中提取所有可能造成损害的内容。
但这够了吗?我甚至可以走到
$text =~ s/[^0-9a-zA-Z\s\.,]//g;
答案 0 :(得分:6)
是的,您的代码很好(忽略perl
,speak
中的错误,DOS攻击等),假设speak
特有的唯一参数以{{1}开头}}
但它可以改进。
无需删除这么多字符。
-
或
sub shell_quote {
return map {
die if /\x00/;
my $lit = $_;
$lit =~ s/'/'\\''/g;
"'$lit'"
} @_;
}
$text =~ s/^-+//;
system(shell_quote('/.../speak', $text, '-w', 'hope.wav'));
也不需要启动shell。
use String::ShellQuote qw( shell_quote );
$text =~ s/^-+//;
system(shell_quote('/.../speak', $text, '-w', 'hope.wav'));
如果您的die if $text =~ /\x00/;
$text =~ s/^-+//;
system('/.../speak', $text, '-w', 'hope.wav');
支持speak
,您甚至可以使用
--