Files and Safe IO
Path Validation
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_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";
$path ← notes.txt, $status ← (empty)
4my $path→ notes.txt = "notes.txt"; #@path="../secret", "report.csv"5my $status→ (empty);$status ← safe path
10 $status = "reject extension";11} else {12 $status→ safe path = "safe path";13}print "path=$path ";
15print "path=$pathnotes.txt\n";16print "status=$statussafe path\n";outputpath=notes.txt status=safe path
$path ← ../secret, $status ← (empty)
4my $path→ ../secret = "../secret";5my $status→ (empty);$status ← reject parent path
7if ($path../secret =~ /\.\./) {8 $status→ reject parent path = "reject parent path";9} elsif ($path !~ /\.txt$/) {print "path=$path ";
15print "path=$path../secret\n";16print "status=$statusreject parent path\n";outputpath=../secret status=reject parent path
$path ← report.csv, $status ← (empty)
4my $path→ report.csv = "report.csv";5my $status→ (empty);$status ← reject extension
8 $status = "reject parent path";9} elsif ($pathreport.csv !~ /\.txt$/) {10 $status→ reject extension = "reject extension";11} else {print "path=$path ";
15print "path=$pathreport.csv\n";16print "status=$statusreject extension\n";outputpath=report.csv status=reject extension