jbt424 has asked for the wisdom of the Perl Monks concerning the following question:

I need to create a Perl CGI script that will accept a single parameter as input. The parameter will be a fully qualified URL and the script will redirect the browser to the URL that has been passed as the parameter. The method is a GET and not a POST.

The browser address bar will accept the full script with the URL parameter like this: http://webserver/cgi-bin/myscript.pl?URL=http://www.google.com I am new to Perl. I stole this code but it does not do a GET and I think I am using a bad example or one that does not apply to what I need to do: I resolved my issue and code is below.

#!/usr/local/bin/perl use strict; use warnings; use CGI qw(:standard); use CGI::Carp qw(warningsToBrowser fatalsToBrowser); use DBI; use URI::Escape; use strictures; use CGI; use URI; my $q = new CGI ; my $url = "httpcandy"; # Process an HTTP request #my @values = $q->multi_param('form_field'); my $value = $q->param('param_name'); print "Content-type: text/html\n\n"; #print "<pre>\n"; # #foreach my $key (sort keys(%ENV)) { # print "$key = $ENV{$key}<br/>"; #} #print "</pre>\n"; my $requested = URI->new( CGI::url() ); $requested->query( $ENV{QUERY_STRING} || $ENV{REDIRECT_QUERY_STRING} ) if url_param(); #print header(), # start_html(), # h1("requested:"), # blockquote($requested), # h1("url:"), # blockquote($value), # h1("nothing else"), # # end_html(); # if ($value =~ /http/) { print "<META HTTP-EQUIV=refresh CONTENT=\"1;$value\">\n"; } else { print "<META HTTP-EQUIV=refresh CONTENT=\"1;URL=http://$value\">\n" +; }; exit;

Replies are listed 'Best First'.
Re: Perl CGI redirect
by FreeBeerReekingMonk (Deacon) on May 26, 2015 at 14:53 UTC

    The variables you give after the ? are usually send as %ENV variables. Why not try to print them all and see if your webserver is like that?

    #!/usr/local/bin/perl print "Content-type: text/html\n\n"; print "<pre>\n"; foreach $key (sort keys(%ENV)) { print "$key = $ENV{$key}<br/>"; } print "</pre>\n";

    Now, you seem to want to use CGI, in that case, you get them in param, and you can iterate over them, as described in this previous post:
    Best way to parse CGI params

    You can then use:

    my $q = new CGI; if ($q->param("URL")) { ... }

    There is also something called Tainted mode, which you should use once your testcode is working, because what If the string after the ? is 2Mb big? or an invalid url etc.

      The variables you give after the ? are usually send as %ENV variables. Why not try to print them all and see if your webserver is like that?

      Trying to parse the query parameters out of %ENV vars yourself is an "ancient" method of doing things, which should no longer be recommended. The OP is already using CGI, which is a much better way of getting the parameters.

      There is also something called Tainted mode, which you should use once your testcode is working, because what If the string after the ? is 2Mb big? or an invalid url etc.

      Using taint mode is generally a good idea but it won't directly help with the two examples you mention. See perlsec.

      FreeBeer, I will owe you a 12 pack. I will seriously ship it. I am not sure I understand completely, I was able to print out all the variables in your suggested code, but what is the intent? REQUEST_METHOD = GET And..if I take your code, what am I supposed to substitute? Remember that the URL needs to by dynamic so that I can enter any web address in the browser web address.
      my $q = new CGI; if ($q->param("URL")) {....}
      How do I call my .pl script in the browser to call on the URL I am requesting? Is it like this?
      http://webserver/cgi-bin/myscript.pl?URL=http://www.google.com

        Sorry for the delay, I was afk. Ah, yes. Let me present you with working code. Go to chapter 3-6 of

        http://www.cgi101.com/learn/ch3/text.html

        You would call it like http://www.cgi101.com/book/ch3/get.cgi?firstname=hello&lastname=world
        and you can read it like my $var1 = param("firstname"); $var2 = param("lastname")
        Source for both the webpage and the perl CGI and a working example are on that tutorial page.
        For more information just peruse: CGI Programming