我相信这个Perl脚本是安全的。可以改进吗?

时间:2014-07-27 19:11:40

标签: regex perl security

我有以下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;

1 个答案:

答案 0 :(得分:6)

是的,您的代码很好(忽略perlspeak中的错误,DOS攻击等),假设speak特有的唯一参数以{{1}开头}}

但它可以改进。

  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'));
    
  2. 也不需要启动shell。

    use String::ShellQuote qw( shell_quote );
    
    $text =~ s/^-+//;
    system(shell_quote('/.../speak', $text, '-w', 'hope.wav'));
    
  3. 如果您的die if $text =~ /\x00/; $text =~ s/^-+//; system('/.../speak', $text, '-w', 'hope.wav'); 支持speak,您甚至可以使用

    --