英語フランス語スペイン語

OnWorksファビコン

perlsec - クラウド上のオンライン

Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、または MAC OS オンライン エミュレーター上の OnWorks 無料ホスティング プロバイダーで perlsec を実行します。

これは、Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、または MAC OS オンライン エミュレーターなどの複数の無料オンライン ワークステーションの XNUMX つを使用して、OnWorks 無料ホスティング プロバイダーで実行できるコマンド perlsec です。

プログラム:

NAME


perlsec - Perl セキュリティ

DESCRIPTION


Perl は、追加のリソースを使用して実行している場合でも、簡単に安全にプログラミングできるように設計されています。
setuid プログラムや setgid プログラムなどの権限。 ほとんどのコマンド ライン シェルとは異なります。
スクリプトの各行の複数の置換パスに基づいて、Perl はさらに多くの置換パスを使用します。
隠れた障害が少ない従来の評価スキーム。 さらに、
言語にはより多くの組み込み機能があり、外部に依存することが少なくなります(そしておそらく
untrusworthy) 目的を達成するためのプログラム。

SECURITY 脆弱性 CONTACT 情報


Perl にセキュリティ上の脆弱性が見つかったと思われる場合は、電子メールでご連絡ください。
[メール保護] 詳細付き。 これは、サブスクリプションが終了していることを示しています。
アーカイブされていないメーリングリスト。 このアドレスは、Perl のセキュリティ問題にのみ使用してください。
CPAN 上で独立して分散されたモジュール用ではありません。

SECURITY メカニズム そして 懸念事項


汚染 モード
Perl は、と呼ばれる一連の特別なセキュリティ チェックを自動的に有効にします。 汚れ モード、それが
異なる実際のユーザー ID またはグループ ID で実行されているプログラムを検出します。 の
Unix 権限の setuid ビットはモード 04000、setgid ビットはモード 02000 です。 どちらかまたは両方
設定される場合があります。 を使用してテイント モードを明示的に有効にすることもできます。 -T コマンドラインフラグ。
この旗は 強く サーバー プログラムおよびサーバーの代わりに実行されるプログラムに推奨される
CGI スクリプトなどの他の誰か。 テイント モードを一度オンにすると、残りの期間はオンになります。
スクリプト。

このモードでは、Perl は以下と呼ばれる特別な予防措置を講じます。 汚れ チェック 両方を防ぐために
明らかかつ巧妙な罠。 これらのチェックの一部は、次のようなかなり単純なものです。
パス ディレクトリは他の人が書き込みできないこと。 慎重なプログラマーは常に使用してきた
このようなチェック。 ただし、他のチェックは言語自体によって最もよくサポートされます。
特に set-id Perl プログラムの安全性を高めるのに貢献するのはこれらのチェックです。
対応する C プログラムよりも。

プログラムの外部から取得したデータを使用して、外部の何かに影響を与えることはできません
あなたのプログラムは、少なくとも偶然ではありません。 すべてのコマンドライン引数、環境
変数、ロケール情報 (perllocale を参照)、特定のシステム コールの結果
(「readdir()」、「readlink()」、「shmread()」の変数、によって返されるメッセージ
「msgrcv()」、「getpwxxx()」呼び出しによって返されるパスワード、gcos、シェル フィールド)、および
すべてのファイル入力は「汚染されている」としてマークされます。 汚染されたデータを直接使用することはできません。
サブシェルを呼び出すコマンド、またはサブシェルを変更するコマンドで間接的に
ファイル、ディレクトリ、またはプロセス、     フォロー中 例外:

· "print" と "syswrite" の引数は次のとおりです。 汚れがないかチェックされました。

· シンボリックメソッド

$obj->$method(@args);

およびシンボリックサブ参照

&{$foo}(@args);
$foo->(@args);

汚れのチェックは行っておりません。 希望しない限り、これには細心の注意が必要です
制御フローに影響を与える外部データ。 これらを慎重に制限しない限り、
象徴的な値は、人々が関数を呼び出すことができるということです。 外側 Perl コード、たとえば
POSIX::system。この場合、任意の外部コードを実行できます。

· ハッシュキーは 決して 汚れた。

効率上の理由から、Perl はデータが汚染されているかどうかについて保守的な見方をします。 もし
式に汚染されたデータが含まれている場合、部分式は汚染されていると見なされる可能性があります。
部分式の値自体は汚染されたデータの影響を受けません。

汚染は各スカラー値に関連付けられているため、配列の一部の要素や
ハッシュは汚染される可能性がありますが、他のハッシュは汚染されない可能性があります。 ハッシュのキーは次のとおりです。 決して 汚れた。

例:

$arg = シフト; # $arg が汚染されています
$hid = $arg 。 'バー'; # $hid も汚染されています
$line = <>; # 汚染された
$line = ; # これも汚染されています
FOO、「/home/me/bar」を開くか、$!;
$line = ; #まだ汚れている
$path = $ENV{'PATH'}; # 汚染されていますが、以下を参照してください
$data = 'abc'; # 汚染されていない

システム "エコー $arg"; # 不安
システム "/ bin / echo", $arg; # 安全ではないとみなされる
# (Perl は知りません / bin / echo)
システム「エコー $hid」; # 不安
システム "エコー $data"; # PATH が設定されるまでは安全ではありません

$path = $ENV{'PATH'}; # $path が汚染されました

$ENV{'PATH'} = '/ binに:/ usr / bin';
@ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'} を削除します。

$path = $ENV{'PATH'}; # $path は汚染されていません
システム "エコー $data"; # これで安心です!

open(FOO, "< $arg"); # OK - 読み取り専用ファイル
open(FOO, "> $arg"); # OK ではありません - 書き込もうとしています

open(FOO,"echo $arg|"); # よくない
open(FOO,"-|")
または、「echo」、$arg を実行します。 # これもダメ

$shout = `echo $arg`; # 安全ではありません。$shout は汚染されました

$data、$arg のリンクを解除します。 # 不安
umask $arg; # 不安

exec "echo $arg"; # 不安
exec "echo", $arg; # 不安
exec "sh"、'-c'、$arg; #とても不安です!

@files = <*.c>; # 安全ではありません (readdir() などを使用します)
@files = glob('*.c'); # 安全ではありません (readdir() などを使用します)

# どちらの場合でも、glob の結果は汚染されます。
# ファイル名はプログラムの外部から取得されます。

$悪い = ($arg, 23); # $bad が汚染される
$arg, `true`; # 安全ではありません (実際はそうではありませんが)

安全でないことを行おうとすると、次のような致命的なエラーが発生します。
「安全でない依存関係」または「安全でない $ENV{PATH}」。

「XNUMX つの汚染された値が式全体を汚染する」という原則の例外は、
三項条件演算子「?:」。 三項条件を含むコードなので

$result = $tainted_value ? "汚れていない" : "これも汚れていない";

効果的です

if ( $tainted_value ) {
$result = "汚染されていない";
場合} else {
$result = "これも汚れていない";
}

$result が汚染されても意味がありません。

洗濯 検出 汚染された Rescale データ
変数に汚染されたデータが含まれているかどうか、またその使用によりエラーが発生するかどうかをテストするには
「依存関係が安全ではありません」メッセージがある場合は、Scalar::Util の「tainted()」関数を使用できます。
モジュール。近くの CPAN ミラーで利用可能で、Perl に含まれています。
リリース 5.8.0。 あるいは、次の「is_tainted()」関数を使用できる場合もあります。

サブは汚染された {
ローカル $@; # 呼び出し元の値を汚さないでください。
戻る ! eval { eval("#" .substr(join("", @_), 0, 0)); 1 };
}

この機能は、汚染されたデータがシステム内のどこにでも存在するという事実を利用します。
式は式全体を汚染します。 それは誰にとっても非効率的です
演算子を使用して、すべての引数が汚染されているかどうかをテストします。 代わりに、もう少し効率的で、
同じ内部で汚染された値がアクセスされた場合は、保守的なアプローチが使用されます。
式を使用すると、式全体が汚染されていると見なされます。

しかし、汚染の有無をテストするだけでは限界があります。 場合によっては、単にクリアする必要がある場合もあります
データの汚染。 値は、ハッシュ内のキーとして使用することで汚染されない可能性があります。 さもないと
汚染メカニズムをバイパスする唯一の方法は、通常のパターンからサブパターンを参照することです。
表現一致。 Perl は、$1、$2 などを使用して部分文字列を参照すると、
汚染のないパターン、そのパターンを書いたときに自分が何をしているのか分かっていたこと。 それか
これは、少し考えてみるということです。ただ盲目的に何も汚さないようにしないでください。そうしないと、
仕組み全体。 変数に適切な文字のみが含まれていることを確認することをお勧めします(
悪い文字が含まれているかどうかをチェックするのではなく、「良い」という特定の値)。 それは
なぜなら、思いもよらなかった悪いキャラクターを見逃してしまうことが非常に簡単だからです。

データに「単語」文字のみが含まれていることを確認するテストです。
(英字、数字、アンダースコア)、ハイフン、アットマーク、またはドット。

if ($data =~ /^([-\@\w.]+)$/) {
$データ = $1; # $data は汚染されていません
場合} else {
die "'$data' 内の不正なデータ"; # これをどこかに記録します
}

「/\w+/」は通常、シェルのメタ文字と一致しないため、これはかなり安全です。
ドット、ダッシュ、または at は、シェルにとって特別なものを意味します。 「」の使用/.+/" になるでしょう
すべてを通過させますが、Perl はチェックしないため、理論的には安全ではありません。
それか。 教訓は、汚れを取り除くときは、細心の注意を払う必要があるということです。
パターン。 正規表現を使用したデータロンダリングは、 汚れを取り除く仕組み
ダーティ データ (以下で詳しく説明する戦略を使用して、より小さいデータの子をフォークする場合を除く)
特権。

この例では、「use locale」が有効な場合でも $data は汚染されません。
「\w」で一致するものはロケールによって決まります。 Perl はロケール定義を次のようにみなします。
プログラムの外部からのデータが含まれているため、信頼できません。 を書いている場合は、
ロケールを認識するプログラムで、「\w」を含む正規表現を使用してデータをロンダリングしたい、
同じブロック内の式の前に「no locale」を置きます。 perlllocale の「セキュリティ」を参照してください。
さらなる議論と例のために。

スイッチ On   「#!」 LINE
スクリプトを実行可能にすると、それをコマンドとして使用できるようにするために、システムが
スクリプトの #! から Perl にスイッチを渡します。 ライン。 Perl はコマンドラインをチェックします。
setuid (または setgid) スクリプトに指定されたスイッチは、実際には #! に設定されたスイッチと一致します。 ライン。
一部の Unix および Unix に似た環境では、#! に XNUMX つのスイッチ制限が課されます。 行、そうしてください
このようなシステムでは、「-w -U」の代わりに「-wU」のようなものを使用する必要があります。 (この問題
#! をサポートする Unix または Unix に似た環境でのみ発生する必要があります。 そしてsetuidまたはsetgid
スクリプト。)

汚染 モード @株式会社
テイント モード (「-T」) が有効な場合、「.」 ディレクトリが @INC から削除され、
環境変数「PERL5LIB」および「PERLLIB」は Perl によって無視されます。 まだ調整できます
で説明されているように、「-I」コマンド ライン オプションを使用してプログラムの外部から @INC を実行します。
パールラン。 XNUMX つの環境変数は隠蔽されているため無視され、ユーザー
プログラムを実行する場合、それらが設定されていることに気づかない可能性がありますが、「-I」オプションは明らかに設定されています。
目に見えるので許可されています。

プログラムを変更せずに @INC を変更する別の方法は、「lib」プラグマを使用することです。
例えば:

perl -Mlib=/foo プログラム

「-I/foo」ではなく「-Mlib=/foo」を使用する利点は、前者が自動的に
重複したディレクトリは削除されますが、後者は削除されません。

汚染された文字列が @INC に追加されると、次の問題が報告されることに注意してください。

-T スイッチを使用して実行中の require での安全でない依存関係

クリーニング Up あなたの パス
「安全でない $ENV{PATH}」メッセージの場合は、$ENV{'PATH'} を既知の値に設定する必要があります。
パス内の各ディレクトリは絶対ディレクトリでなければならず、その所有者以外は書き込みできないようにする必要があります。
グループ。 実行可能ファイルへのパス名が正しくない場合でも、このメッセージが表示されると驚かれるかもしれません。
完全に資格を持っています。 これは へのフルパスを指定しなかったために生成されました。
プログラム; 代わりに、PATH 環境変数を設定しなかったために生成されます。
安全なものに設定していません。 Perl は次のことを保証できないからです。
問題の実行可能ファイル自体が方向転換して他のプログラムを実行することはありません
これは PATH に依存するため、PATH が設定されていることを確認します。

問題を引き起こす可能性のある環境変数は PATH だけではありません。 なぜなら、いくつかの
シェルは変数 IFS、CDPATH、ENV、および BASH_ENV を使用する可能性があり、Perl はそれらが変数であることをチェックします。
サブプロセスの開始時に空か汚染されていないかのいずれかです。 次のようなものを追加するとよいでしょう
これを setid および汚染チェック スクリプトに追加します。

@ENV{qw(IFS CDPATH ENV BASH_ENV)} を削除します。 # %ENV をより安全にする

また、他の操作でも問題が発生する可能性があります。
汚染された値を使用します。 あらゆるユーザーに対処する場合は、ファイル テストを賢明に使用してください。
指定されたファイル名。 可能であれば、オープンなどを行います After 特別なものを適切にドロップする
ユーザー (またはグループ!) の権限。 Perl では、汚染されたファイル名を開くことはできません。
読んでいるので、印刷するものには注意してください。 汚染メカニズムは、汚染を防ぐことを目的としています。
愚かな間違い、考える必要性を取り除くわけではありません。

Perl は、「system」と「exec」を渡すときにワイルドカードを展開するシェルを呼び出しません。
シェルのワイルドカードを含む文字列の代わりに、明示的なパラメータ リストを使用します。
残念ながら、「open」、「glob」、およびバックティック関数には、そのような代替関数はありません。
呼び出し規約に従っているため、さらにごまかしが必要になります。

Perl は、setuid または setgid からファイルまたはパイプを開くためのかなり安全な方法を提供します
プログラム: 汚れた作業を行う権限を減らした子プロセスを作成するだけです。
あなた。 まず、親と子を接続する特別な「open」構文を使用して子をフォークします。
パイプのそばの子供。 ここで、子はその ID セットとその他のプロセスごとの属性をリセットします。
環境変数、umask、現在の作業ディレクトリなど、元の状態に戻したり、
既知の安全な値。 次に、特別な権限を持たなくなった子プロセスが、
「open」または他のシステムコールを実行します。 最後に、子は自分が管理したデータを渡します。
親にアクセスします。 実行中に子でファイルまたはパイプが開かれたため
親よりも権限が低いため、だまされて何かをすることはありません。
そうすべきではありません。

バッククォートをかなり安全に実行する方法を次に示します。 「exec」がどのように呼び出されるかに注目してください。
シェルが展開できる文字列。 これは、何かを呼び出すための断然最良の方法です。
シェルエスケープの対象となる可能性があります。決してシェルを呼び出さないでください。

英語を使う;
die 「$ をフォークできません!」 定義されていない場合($pid = open(KID, "-|"));
if ($pid) { # 親
その間 ( ) {
#何かをする
}
KIDを閉じる。
場合} else {
私の @temp = ($EUID, $EGID);
私の$orig_uid = $UID;
私の $orig_gid = $GID;
$EUID = $UID;
$EGID = $GID;
# 権限を削除する
$UID = $orig_uid;
$GID = $orig_gid;
# 権限が本当になくなっていることを確認してください
($EUID, $EGID) = @temp;
die 「権限を削除できません」
$UID == $EUID && $GID eq $EGID を除く。
$ENV{パス} = "/ binに:/ usr / bin"; # 最小パス。
# 環境の消毒をさらに検討してください。
実行 'myprog'、'arg1'、'arg2'
さもなければ、「myprog: $! を実行できません!」;
}

同様の戦略は、「glob」によるワイルドカード拡張にも機能しますが、次のように使用できます。
代わりに「readdir」を使用します。

汚染チェックが最も役立つのは、自分はコードを書いていないと確信している場合です。
農場を譲渡するプログラムでは、最終的に農場を使用しない人を必ずしも信頼できるとは限りません。
それをだまして何か悪いことをさせようとすること。 これはセキュリティチェックの一種です
set-id プログラムや、CGI など、他人の代わりに起動されるプログラムに便利です。
プログラム。

ただし、これは、コードの作成者が試行しないことさえ信頼しないのとはまったく異なります。
何か悪いことをすること。 誰かがあなたにプログラムを渡すときに必要なのは、このような信頼です
これまで見たことのないものを見て、「さあ、これを実行してください」と言います。 そのような安全性を確保するには、
Perl ディストリビューションに標準で含まれている Safe モジュールをチェックアウトしたいと考えています。 これ
このモジュールを使用すると、プログラマはすべてのシステム操作が行われる特別なコンパートメントをセットアップできます。
はトラップされ、名前空間へのアクセスは慎重に制御されます。 安全性は考慮すべきではありません
ただし、防弾です。外部コードが無限ループをセットアップするのを防ぐことはできません。
ギガバイトのメモリを割り当てたり、Perl のバグを悪用してホスト インタプリタをクラッシュさせたりすることさえあります。
または予測不可能な行動をする。 いずれにしても、次のような場合は完全に避けたほうがよいでしょう。
セキュリティが本当に心配です。

セキュリティ バグ
システムに特別な権限を与えることから生じる明らかな問題を超えて、
スクリプトのように柔軟で、Unix の多くのバージョンでは、set-id スクリプトは本質的に安全ではありません
最初から正しい。 問題はカーネル内の競合状態です。 その間
カーネルはファイルを開いて、どのインタープリターをいつ実行するかを確認します (now-set-id)
インタプリタが向きを変えてファイルを再度開いて解釈すると、問題のファイルが
特にシステムにシンボリック リンクがある場合は変更されています。

幸いなことに、このカーネルの「機能」を無効にできる場合があります。 残念ながら、
無効にする XNUMX つの方法。 システムは、任意の set-id ビットが設定されたスクリプトを単純に禁止できます。
それはあまり役に立ちません。 あるいは、スクリプトの set-id ビットを単純に無視することもできます。

ただし、カーネルの set-id スクリプト機能が無効になっていない場合、Perl は大声で文句を言います。
set-id スクリプトが安全ではないことを示します。 カーネルの set-id を無効にする必要があります。
スクリプト機能を使用するか、スクリプトの周囲に C ラッパーを配置します。 ACラッパーは単にコンパイルされたものです
Perl プログラムを呼び出すこと以外は何もしないプログラムです。 コンパイルされたプログラムは、
set-id スクリプトを悩ませるカーネルのバグの影響を受けます。 これは簡単なラッパーです。
Cで:

#define REAL_PATH "/path/to/script"
メイン(AC、AV)
文字 **av;
{
execv(REAL_PATH, av);
}

このラッパーをバイナリ実行可能ファイルにコンパイルしてから、 it あなたのスクリプトではなく
setuid または setgid。

近年、ベンダーは、この固有のセキュリティ バグのないシステムを供給し始めています。
このようなシステムでは、カーネルが set-id スクリプトの名前を渡して開くと、
インタプリタは、干渉の対象となるパス名を使用するのではなく、代わりにパス名を渡します。
/ dev / fd / 3。 これはスクリプト上ですでに開かれている特別なファイルであるため、
悪意のあるスクリプトが悪用する競合状態。 これらのシステムでは、Perl をコンパイルする必要があります
「-DSETUID_SCRIPTS_ARE_SECURE_NOW」を使用します。 の 構成 Perl を構築するプログラムは次のことを試みます
これは自分で判断できるため、自分で指定する必要はありません。 多くの
SysVr4 および BSD 4.4 の最新リリースでは、カーネル競合を回避するためにこのアプローチが使用されています。
条件。

保護 あなたの プログラム
Perl プログラムに対してソースを非表示にする方法は、さまざまなレベルで多数あります。
「セキュリティ」のこと。

まず第一に、しかし、あなたは することはできません ソースコードがしなければならないので、読み取り許可を奪う
コンパイルおよび解釈するために読み取り可能である。 (それはCGIが
ただし、スクリプトのソースは Web 上の人々でも読むことができます。) したがって、
ソーシャルフレンドリーな 0755 レベルの権限。 これにより、ローカル システム上のユーザーが
ソースだけを参照してください。

これをセキュリティ上の問題と誤解する人もいます。 プログラムが安全でない場合
それらの不安を利用する方法を知らない人々に依存しているのですが、それはそうではありません
安全。 多くの場合、誰かが安全でないものを判断して悪用する可能性があります。
ソースを見ずにそれらを。 隠蔽によるセキュリティ、あなたの情報を隠すことの名前
バグを修正する代わりにバグを修正するのは、実際にはほとんどセキュリティではありません。

ソース フィルター (CPAN の Filter::* または
Perl 5.8 以降の Filter::Util::Call および Filter::Simple)。 でもクラッカーならできるかもしれない
それを解読します。 以下で説明するバイトコードコンパイラとインタプリタを使用してみることもできますが、
クラッカーはそれを逆コンパイルできるかもしれません。 ネイティブコードコンパイラを使用してみることができます
以下に説明しますが、クラッカーによって分解される可能性があります。 これらのポーズはさまざまな程度です
あなたのコードを入手しようとする人々にとっては困難ですが、それを決定的に隠すことは誰にもできません
(これは Perl だけでなく、すべての言語に当てはまります)。

あなたがあなたのコードから利益を得る人々を心配しているなら、肝心なのはそれです
制限付きライセンスだけがあなたに法的安全を与えるでしょう。 ソフトウェアのライセンスを取得し、
「これは未公開のプロプライエタリソフトウェアです。
XYZ Corp. これにアクセスしても、それを使用する許可が与えられるわけではありません。」
あなたのライセンスの文言が法廷で有効であるかどうかを確認するには、弁護士に相談する必要があります。

Unicode
Unicode は新しく複雑なテクノロジであるため、特定のセキュリティを見落としがちです。
落とし穴。 概要については perluniintro を、詳細については perlunicode を参照してください。また、「セキュリティ」
特にセキュリティへの影響については、perlunicode の「Unicode の影響」を参照してください。

アルゴリズム的 複雑 攻撃
Perl の実装で使用される特定の内部アルゴリズムは、以下を選択することによって攻撃される可能性があります。
時間かスペース、またはその両方を大量に消費するように、入力は慎重に行ってください。 これはできる
いわゆる 否定 of サービス (DoS) 攻撃。

· ハッシュ アルゴリズム - Perl で使用されるようなハッシュ アルゴリズムはよく知られています。
ハッシュ関数に対する衝突攻撃に対して脆弱です。 このような攻撃には、
同じバケットに衝突するキーのセットを構築すると非効率になります
行動。 このような攻撃は、多くの場合、使用されるハッシュ関数のシードを発見することに依存します。
キーをバケットにマッピングします。 次に、そのシードを使用してキー セットをブルート フォース攻撃します。
サービス拒否攻撃を開始するために使用される可能性があります。 Perl 5.8.1 では、に変更が導入されました。
Perl をそのような攻撃に対して強化し、その後の Perl 5.18.0 ではこれらの機能が追加されました。
強化され、追加の保護が追加されました。

この記事の執筆時点では、Perl 5.18.0 は十分に強化されていると考えられています。
ハッシュ実装に対するアルゴリズムの複雑さに対する攻撃。 これは主に次のことによるものです
次の対策により攻撃が軽減されます。

ハッシュシードのランダム化
どのようなシードで攻撃キーセットを生成するかを分からなくするため
なぜなら、このシードはプロセスの開始時にランダムに初期化されるからです。 これは上書きされる可能性があります
PERL_HASH_SEED 環境変数を使用する方法については、perlrun の「PERL_HASH_SEED」を参照してください。
この環境変数は、項目がどのように保存されるかではなく、実際にどのように保存されるかを制御します。
「キー」、「値」、「それぞれ」によって提示されます。

ハッシュトラバーサルのランダム化
ハッシュ関数でどのシードが使用されるかに関係なく、「キー」、「値」、
「each」は、ハッシュごとにランダムな順序でアイテムを返します。 挿入によるハッシュの変更
そのハッシュの反復順序が変更されます。 この動作は次の方法でオーバーライドできます。
Hash::Util の「hash_traversal_mask()」を使用するか、PERL_PERTURB_KEYS を使用します。
環境変数については、perlrun の「PERL_PERTURB_KEYS」を参照してください。 この機能に注意してください
キーが格納される実際の順序ではなく、キーの「表示される」順序を制御します。
インチ

バケットオーダーの摂動
アイテムが特定のハッシュ バケットに衝突するとき、アイテムがチェーンに格納されている順序に従って
Perl 5.18 では予測できなくなりました。 これは難しくする意図があります
衝突を観察するためです。 この動作は、
PERL_PERTURB_KEYS 環境変数。perlrun の「PERL_PERTURB_KEYS」を参照してください。

新しいデフォルトのハッシュ関数
デフォルトのハッシュ関数は、より難しくする目的で変更されました。
ハッシュシードを推測します。

代替ハッシュ関数
ソース コードには、選択できる複数のハッシュ アルゴリズムが含まれています。 我々が・・・ながら
デフォルトの Perl ハッシュは攻撃に対して堅牢であると考えられるため、ハッシュを含めました
フォールバック オプションとして Siphash を機能させます。 Perl 5.18.0リリース時
Siphash は暗号強度が高いと考えられています。 これはデフォルトではありません
デフォルトのハッシュよりもはるかに遅いです。

特別な Perl をコンパイルしない限り、まったく同じ動作を得る方法はありません。
Perl 5.18.0 より前のバージョン。 最も近いものを取得できるのは、設定することです
PERL_PERTURB_KEYS を 0 に設定し、PERL_HASH_SEED を既知の値に設定します。 私たちはしない
上記のセキュリティ上の考慮事項により、運用環境での使用にはこれらの設定を推奨します。

パール 持っています 決して 保証 どれか 発注 of   ハッシュ キー、注文はすでに完了しています
Perl 5 の存続期間中に数回変更されました。また、ハッシュ キーの順序も変更されました。
広告掲載オーダーと履歴の影響は常に受け続けており、今後も受け続けます
ハッシュの存続期間中に行われた変更の数。

また、ハッシュ要素の順序はランダム化される可能性がありますが、これは「疑似
注文する」べきです リストをランダムにシャッフルするようなアプリケーションに使用できます (使用
「List::Util::shuffle()」については、Perl 以来の標準コア モジュールである List::Util を参照してください。
5.8.0; または CPAN モジュール「Algorithm::Numerical::Shuffle」)、または生成用
順列 (CPAN モジュール「Algorithm::Permute」などを使用するか、
"Algorithm::FastPermute")、または任意の暗号化アプリケーション用。

結合ハッシュには、独自の順序付け攻撃やアルゴリズムの複雑さに対する攻撃が存在する可能性があります。

· 正規表現 - Perl の正規表現エンジンはいわゆる NFA (非
決定論的有限オートマトン)、これはとりわけ、むしろ
正規表現を使用すると、時間とスペースの両方が簡単に大量に消費されてしまいます。
いくつかの方法で一致します。 正規表現を注意深く作成すると役に立ちますが、
多くの場合、実際にできることはあまりありません (書籍「Mastering Regular Expressions」は、
必読です。perlfaq2 を参照してください)。 スペース不足は Perl によって明らかになります
メモリが不足しています。

· ソート - 5.8.0 より前の Perls で使用されるクイックソート アルゴリズム。 ソート()
この関数は不正な動作をさせるのが非常に簡単なので、多くの時間がかかります。
Perl 5.8.0 以降では、別のソート アルゴリズムであるマージソートがデフォルトで使用されます。
マージソートは入力に対して不正な動作をすることはできません。

見るhttp://www.cs.rice.edu/~scrosby/hash/> 詳細およびコンピュータ サイエンスについては
アルゴリズムの複雑さに関する教科書。

onworks.net サービスを使用してオンラインで perlsec を使用する


無料のサーバーとワークステーション

Windows と Linux のアプリをダウンロード

  • 1
    AstrOrzPlayer
    AstrOrzPlayer
    AstrOrz Player は無料のメディア プレーヤーです。
    ソフトウェア、WMP および VLC に基づく部分。 の
    プレーヤーはミニマリスト スタイルで、
    XNUMX を超えるテーマ カラー、および
    B ...
    AstrOrzPlayer をダウンロード
  • 2
    モビスタート
    モビスタート
    Kodi Movistar + TV es un ADDON para XBMC/
    Kodi que 許可ディスポンナー デ ウン
    IPTV のロス サービスの復号化機能
    モビスター インテグラド エン ウノ デ ロス
    メディアセンターマ...
    movistartv のダウンロード
  • 3
    Code :: Blocks
    Code :: Blocks
    Code::Blocks は無料のオープンソースです。
    クロスプラットフォームの C、C++、および Fortran IDE
    最も厳しいニーズを満たすように構築されています
    そのユーザーの。 それは非常に設計されています
    伸びる…
    コードをダウンロード::ブロック
  • 4
    中に
    中に
    中または高度な Minecraft インターフェイス
    データ/構造追跡は、
    Minecraft の概要を表示する
    実際に作成することなく、世界。 それ
    できる ...
    ダウンロード
  • 5
    MSYS2
    MSYS2
    MSYS2 はツールのコレクションであり、
    を提供するライブラリ
    使いやすい建築環境、
    ネイティブ Windows のインストールと実行
    ソフトウェア。 それは...
    MSYS2 をダウンロード
  • 6
    libjpeg-ターボ
    libjpeg-ターボ
    libjpeg-turbo は JPEG 画像コーデックです
    SIMD 命令 (MMX、SSE2、
    NEON、AltiVec) によるベースラインの加速
    JPEG の圧縮と解凍
    x86、x8...
    libjpeg-turbo のダウンロード
  • 詳細»

Linuxコマンド

Ad