Validate a path string before using it for IO.

path validation Path validation rejects names that do not fit the program's rules.

Path Validation

path
path_validation.pl
Replay: real traced execution (multi-file project)
use strict;
use warnings;

my $path = "notes.txt";
my $status;

if ($path =~ /\.\./) {
    $status = "reject parent path";
} elsif ($path !~ /\.txt$/) {
    $status = "reject extension";
} else {
    $status = "safe path";
}

print "path=$path\n";
print "status=$status\n";
use strict;
use warnings;

my $path = "../secret";
my $status;

if ($path =~ /\.\./) {
    $status = "reject parent path";
} elsif ($path !~ /\.txt$/) {
    $status = "reject extension";
} else {
    $status = "safe path";
}

print "path=$path\n";
print "status=$status\n";
use strict;
use warnings;

my $path = "report.csv";
my $status;

if ($path =~ /\.\./) {
    $status = "reject parent path";
} elsif ($path !~ /\.txt$/) {
    $status = "reject extension";
} else {
    $status = "safe path";
}

print "path=$path\n";
print "status=$status\n";
  1. $path ← notes.txt, $status ← (empty)

    4my $path→ notes.txt = "notes.txt"; #@path="../secret", "report.csv"5my $status→ (empty);
  2. $status ← safe path

    10    $status = "reject extension";11} else {12    $status→ safe path = "safe path";13}
  3. print "path=$path ";

    15print "path=$pathnotes.txt\n";16print "status=$statussafe path\n";
    outputpath=notes.txt
    status=safe path
  1. $path ← ../secret, $status ← (empty)

    4my $path→ ../secret = "../secret";5my $status→ (empty);
  2. $status ← reject parent path

    7if ($path../secret =~ /\.\./) {8    $status→ reject parent path = "reject parent path";9} elsif ($path !~ /\.txt$/) {
  3. print "path=$path ";

    15print "path=$path../secret\n";16print "status=$statusreject parent path\n";
    outputpath=../secret
    status=reject parent path
  1. $path ← report.csv, $status ← (empty)

    4my $path→ report.csv = "report.csv";5my $status→ (empty);
  2. $status ← reject extension

    8    $status = "reject parent path";9} elsif ($pathreport.csv !~ /\.txt$/) {10    $status→ reject extension = "reject extension";11} else {
  3. print "path=$path ";

    15print "path=$pathreport.csv\n";16print "status=$statusreject extension\n";
    outputpath=report.csv
    status=reject extension