1

I am reading this document to learn Perl's taint mode => http://www.webreference.com/programming/perl/taint/index.html

It is mentioned one way of clean tainted value,

Another more obscure way to clean tainted values is to use them as a hash key; since hash keys themselves are never considered tainted

I do not quite understand what means "use them as a hash key", and why hash key as never treated as tainted. Appreciate if anyone could help?

thanks in advance, Lin

4

3 に答える 3

8

あなたは本当にその声明に注意を払うべきではありません. これが意味することは、これをtaintモードで実行すると

my $fname = <>;
chomp $fname;
open my $fh, '>', $fname;

ファイル名に汚染された値を使用しているため、プログラムは停止します。しかし、その値をハッシュキーとして保存すると、次のようになります

my $fname = <>;
chomp $fname;
my %data;
$data{$fname} = 1;
open my $fh, '>', $_ for keys %data;

その後、コードは正常に実行されます。

この理由は、汚染された値に関する知識とは関係ありませんが、ハッシュのキーはスカラー値ではなく、内部の Perl ハッシュ構造内に格納されている単純な文字列にすぎないためです。Perl のスカラー値 (スカラー変数、ハッシュ値、配列値など) は、実際の内容だけでなく、値の状態と性質に関する情報を含む、はるかに複雑なデータ構造であり、汚染されているとしてフラグを立てることができるのはこれらだけです。対照的に、ハッシュ キーは単なる文字列であり、ステータス情報を保持することはできません。

したがって、私が言ったように、Perl のこの欠点を認識することは別として、ドキュメント内のこのステートメントを無視する必要があります。

于 2013-01-20T15:03:14.693 に答える
6

汚染チェックを回避するのは怪しい方法のようです。これは非常に愚かなことです。汚染チェックは、スクリプトで危険なことをしていないことを確認するためにあります。この場合、安全でないソースからのデータを最初に検証せずに使用します。

ここに例があります。ここのシバンの-Tスイッチは、汚染チェックをオンにするものです。

#!/usr/bin/perl -T
use strict;
use warnings;

chomp(my $foo = <>);
#my %a; $a{$foo} = 1;
#($foo) = keys %a;
open my $fh, ">", $foo or die "cant open $foo: $!";

このコードは終了し、エラーが発生します。

foo.pl 行 11、<> 行 1 で -T スイッチを使用して実行中のオープンでの依存関係が安全ではありません。

コメント化された行がコメント化されていない場合は、そこに任意のテキストを入力しても、汚染が解除されることなく正常に実行されます。

前述のように、セキュリティ対策を回避するため、これは悪い考えです。

于 2013-01-20T15:11:43.810 に答える
1

ハッシュキーは、汚染などを追跡する舞台裏の魔法を備えた完全なスカラー構造ではありません。ハッシュキーは生の文字列です。値をハッシュキーとして使用すると、Perlがスカラーで行うすべての簿記が失われます。これについては、 Perlのマスターの「セキュアプログラミングテクニック」の章でかなり話します。

于 2013-01-21T15:43:24.947 に答える