⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 taint.t

📁 UNIX下perl实现代码
💻 T
📖 第 1 页 / 共 2 页
字号:
    }}# Some operations using files can't use tainted data.{    my $foo = "imaginary library" . $TAINT;    test 69, eval { require $foo } eq '', 'require';    test 70, $@ =~ /^Insecure dependency/, $@;    my $filename = "./taintB$$";	# NB: $filename isn't tainted!    END { unlink $filename if defined $filename }    $foo = $filename . $TAINT;    unlink $filename;	# in any case    test 71, eval { open FOO, $foo } eq '', 'open for read';    test 72, $@ eq '', $@;		# NB: This should be allowed    # Try first new style but allow also old style.    test 73, $!{ENOENT} ||	$! == 2 || # File not found	($Is_Dos && $! == 22) ||	($^O eq 'mint' && $! == 33);    test 74, eval { open FOO, "> $foo" } eq '', 'open for write';    test 75, $@ =~ /^Insecure dependency/, $@;}# Commands to the system can't use tainted data{    my $foo = $TAINT;    if ($^O eq 'amigaos') {	for (76..79) { print "ok $_ # Skipped: open('|') is not available\n" }    }    else {	test 76, eval { open FOO, "| x$foo" } eq '', 'popen to';	test 77, $@ =~ /^Insecure dependency/, $@;	test 78, eval { open FOO, "x$foo |" } eq '', 'popen from';	test 79, $@ =~ /^Insecure dependency/, $@;    }    test 80, eval { exec $TAINT } eq '', 'exec';    test 81, $@ =~ /^Insecure dependency/, $@;    test 82, eval { system $TAINT } eq '', 'system';    test 83, $@ =~ /^Insecure dependency/, $@;    $foo = "*";    taint_these $foo;    test 84, eval { `$echo 1$foo` } eq '', 'backticks';    test 85, $@ =~ /^Insecure dependency/, $@;    if ($Is_VMS) { # wildcard expansion doesn't invoke shell, so is safe	test 86, join('', eval { glob $foo } ) ne '', 'globbing';	test 87, $@ eq '', $@;    }    else {	for (86..87) { print "ok $_ # Skipped: this is not VMS\n"; }    }}# Operations which affect processes can't use tainted data.{    test 88, eval { kill 0, $TAINT } eq '', 'kill';    test 89, $@ =~ /^Insecure dependency/, $@;    if ($Config{d_setpgrp}) {	test 90, eval { setpgrp 0, $TAINT } eq '', 'setpgrp';	test 91, $@ =~ /^Insecure dependency/, $@;    }    else {	for (90..91) { print "ok $_ # Skipped: setpgrp() is not available\n" }    }    if ($Config{d_setprior}) {	test 92, eval { setpriority 0, $TAINT, $TAINT } eq '', 'setpriority';	test 93, $@ =~ /^Insecure dependency/, $@;    }    else {	for (92..93) { print "ok $_ # Skipped: setpriority() is not available\n" }    }}# Some miscellaneous operations can't use tainted data.{    if ($Config{d_syscall}) {	test 94, eval { syscall $TAINT } eq '', 'syscall';	test 95, $@ =~ /^Insecure dependency/, $@;    }    else {	for (94..95) { print "ok $_ # Skipped: syscall() is not available\n" }    }    {	my $foo = "x" x 979;	taint_these $foo;	local *FOO;	my $temp = "./taintC$$";	END { unlink $temp }	test 96, open(FOO, "> $temp"), "Couldn't open $temp for write: $!";	test 97, eval { ioctl FOO, $TAINT, $foo } eq '', 'ioctl';	test 98, $@ =~ /^Insecure dependency/, $@;	if ($Config{d_fcntl}) {	    test 99, eval { fcntl FOO, $TAINT, $foo } eq '', 'fcntl';	    test 100, $@ =~ /^Insecure dependency/, $@;	}	else {	    for (99..100) { print "ok $_ # Skipped: fcntl() is not available\n" }	}	close FOO;    }}# Some tests involving references{    my $foo = 'abc' . $TAINT;    my $fooref = \$foo;    test 101, not tainted $fooref;    test 102, tainted $$fooref;    test 103, tainted $foo;}# Some tests involving assignment{    my $foo = $TAINT0;    my $bar = $foo;    test 104, all_tainted $foo, $bar;    test 105, tainted($foo = $bar);    test 106, tainted($bar = $bar);    test 107, tainted($bar += $bar);    test 108, tainted($bar -= $bar);    test 109, tainted($bar *= $bar);    test 110, tainted($bar++);    test 111, tainted($bar /= $bar);    test 112, tainted($bar += 0);    test 113, tainted($bar -= 2);    test 114, tainted($bar *= -1);    test 115, tainted($bar /= 1);    test 116, tainted($bar--);    test 117, $bar == 0;}# Test assignment and return of lists{    my @foo = ("A", "tainted" . $TAINT, "B");    test 118, not tainted $foo[0];    test 119,     tainted $foo[1];    test 120, not tainted $foo[2];    my @bar = @foo;    test 121, not tainted $bar[0];    test 122,     tainted $bar[1];    test 123, not tainted $bar[2];    my @baz = eval { "A", "tainted" . $TAINT, "B" };    test 124, not tainted $baz[0];    test 125,     tainted $baz[1];    test 126, not tainted $baz[2];    my @plugh = eval q[ "A", "tainted" . $TAINT, "B" ];    test 127, not tainted $plugh[0];    test 128,     tainted $plugh[1];    test 129, not tainted $plugh[2];    my $nautilus = sub { "A", "tainted" . $TAINT, "B" };    test 130, not tainted ((&$nautilus)[0]);    test 131,     tainted ((&$nautilus)[1]);    test 132, not tainted ((&$nautilus)[2]);    my @xyzzy = &$nautilus;    test 133, not tainted $xyzzy[0];    test 134,     tainted $xyzzy[1];    test 135, not tainted $xyzzy[2];    my $red_october = sub { return "A", "tainted" . $TAINT, "B" };    test 136, not tainted ((&$red_october)[0]);    test 137,     tainted ((&$red_october)[1]);    test 138, not tainted ((&$red_october)[2]);    my @corge = &$red_october;    test 139, not tainted $corge[0];    test 140,     tainted $corge[1];    test 141, not tainted $corge[2];}# Test for system/library calls returning string data of dubious origin.{    # No reliable %Config check for getpw*    if (eval { setpwent(); getpwent(); 1 }) {	setpwent();	my @getpwent = getpwent();	die "getpwent: $!\n" unless (@getpwent);	test 142,(    not tainted $getpwent[0]	          and     tainted $getpwent[1]	          and not tainted $getpwent[2]	          and not tainted $getpwent[3]	          and not tainted $getpwent[4]	          and not tainted $getpwent[5]	          and     tainted $getpwent[6]		# ge?cos	          and not tainted $getpwent[7]		  and     tainted $getpwent[8]);	# shell	endpwent();    } else {	for (142) { print "ok $_ # Skipped: getpwent() is not available\n" }    }    if ($Config{d_readdir}) { # pretty hard to imagine not	local(*D);	opendir(D, "op") or die "opendir: $!\n";	my $readdir = readdir(D);	test 143, tainted $readdir;	closedir(OP);    } else {	for (143) { print "ok $_ # Skipped: readdir() is not available\n" }    }    if ($Config{d_readlink} && $Config{d_symlink}) {	my $symlink = "sl$$";	unlink($symlink);	symlink("/something/naughty", $symlink) or die "symlink: $!\n";	my $readlink = readlink($symlink);	test 144, tainted $readlink;	unlink($symlink);    } else {	for (144) { print "ok $_ # Skipped: readlink() or symlink() is not available\n"; }    }}# test bitwise ops (regression bug){    my $why = "y";    my $j = "x" | $why;    test 145, not tainted $j;    $why = $TAINT."y";    $j = "x" | $why;    test 146,     tainted $j;}# test target of substitution (regression bug){    my $why = $TAINT."y";    $why =~ s/y/z/;    test 147,     tainted $why;    my $z = "[z]";    $why =~ s/$z/zee/;    test 148,     tainted $why;    $why =~ s/e/'-'.$$/ge;    test 149,     tainted $why;}# test shmread{    unless ($ipcsysv) {	print "ok 150 # skipped: no IPC::SysV\n";	last;    }    if ($Config{'extensions'} =~ /\bIPC\/SysV\b/ && $Config{d_shm}) {	no strict 'subs';	my $sent = "foobar";	my $rcvd;	my $size = 2000;	my $id = shmget(IPC_PRIVATE, $size, S_IRWXU);	if (defined $id) {	    if (shmwrite($id, $sent, 0, 60)) {		if (shmread($id, $rcvd, 0, 60)) {		    substr($rcvd, index($rcvd, "\0")) = '';		} else {		    warn "# shmread failed: $!\n";		}	    } else {		warn "# shmwrite failed: $!\n";	    }	    shmctl($id, IPC_RMID, 0) or warn "# shmctl failed: $!\n";	} else {	    warn "# shmget failed: $!\n";	}	if ($rcvd eq $sent) {	    test 150, tainted $rcvd;	} else {	    print "ok 150 # Skipped: SysV shared memory operation failed\n";	}    } else {	print "ok 150 # Skipped: SysV shared memory is not available\n";    }}# test msgrcv{    unless ($ipcsysv) {	print "ok 151 # skipped: no IPC::SysV\n";	last;    }    if ($Config{'extensions'} =~ /\bIPC\/SysV\b/ && $Config{d_msg}) {	no strict 'subs';	my $id = msgget(IPC_PRIVATE, IPC_CREAT | S_IRWXU);	my $sent      = "message";	my $type_sent = 1234;	my $rcvd;	my $type_rcvd;	if (defined $id) {	    if (msgsnd($id, pack("l! a*", $type_sent, $sent), 0)) {		if (msgrcv($id, $rcvd, 60, 0, 0)) {		    ($type_rcvd, $rcvd) = unpack("l! a*", $rcvd);		} else {		    warn "# msgrcv failed\n";		}	    } else {		warn "# msgsnd failed\n";	    }	    msgctl($id, IPC_RMID, 0) or warn "# msgctl failed: $!\n";	} else {	    warn "# msgget failed\n";	}	if ($rcvd eq $sent && $type_sent == $type_rcvd) {	    test 151, tainted $rcvd;	} else {	    print "ok 151 # Skipped: SysV message queue operation failed\n";	}    } else {	print "ok 151 # Skipped: SysV message queues are not available\n";    }}{    # bug id 20001004.006    open IN, "./TEST" or warn "$0: cannot read ./TEST: $!" ;    local $/;    my $a = <IN>;    my $b = <IN>;    print "not " unless tainted($a) && tainted($b) && !defined($b);    print "ok 152\n";    close IN;}{    # bug id 20001004.007    open IN, "./TEST" or warn "$0: cannot read ./TEST: $!" ;    my $a = <IN>;    my $c = { a => 42,	      b => $a };    print "not " unless !tainted($c->{a}) && tainted($c->{b});    print "ok 153\n";    my $d = { a => $a,	      b => 42 };    print "not " unless tainted($d->{a}) && !tainted($d->{b});    print "ok 154\n";    my $e = { a => 42,	      b => { c => $a, d => 42 } };    print "not " unless !tainted($e->{a}) &&	                !tainted($e->{b}) &&	                 tainted($e->{b}->{c}) &&	                !tainted($e->{b}->{d});    print "ok 155\n";    close IN;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -