※ ChatGPTを利用し、要約された質問です(原文:cryptの動作)
cryptの動作についての要約文・タイトル・ハッシュタグ
このQ&Aのポイント
cryptの動作に関しての質問文について要約すると、cryptがサーバーによって異なる動作をする可能性があるかどうかや、特定の条件下で不正な結果が返される場合があるかどうかを尋ねるものです。
この質問文では、特定の条件下で$in{'pass'}に何も入っていない状態で&decryが1を返すサーバーが存在することを指摘しています。
一方、質問文の作成者自身の環境では、$in{'pass'}が空でも正しい結果が返されることを確認しています。
cryptがサーバーによって動作が異なるというのはありうるでしょうか。
cryptが使えないサーバーがあるというのは聞いたことがあるのですが、
if(!&decry("abcd" ,$in{'pass'})){print "不正";}
のときに$in{'pass'}に何も入ってない(つまり"")のときになぜか&decryの返り値が1になるサーバーがあるようなのです。しかもおかしなことに、$in{'pass'}になんらかの文字が入っていると"不正"という文字がでるそうなのです。(しかし「abcd」の暗号化文字列がくると不正とは表示されない)
しかし私の環境(WinXP【phpdev4 + Active Perl】 と @nifty)では、そんなことはありません。$in{'pass'}=""; でもちゃんと不正と出ます。
私が使っている暗号化と、照会の処理の関数は以下の通りです。
**********************************************
sub encry {
srand();
@salts = ( "A".."Z", "a".."z", "0".."9", ".", "/" );
$salt = $salts[int(rand(64))] . $salts[int(rand(64))];
return crypt($_[0], $salt);
}
sub decry {
return($_[1] eq crypt($_[0], $_[1]));
}
***********************************************
お礼
>事前に$in{'pass'}=""の場合をチェックしてはじくべきかと。 osamuyさんのおっしゃるとおり事前に$in{'pass'}=""を検出する方法で対策する形に致しました。 >crypt()の第2引数として空文字列を渡す事自体が想定されてないので、結果がどうなるかは、そのサーバ次第という事で。 やはりそうだったのですか・・・、ずっとどこがいけないのか悩んでいただけに、それがわかっただけでもほっとしました。 ご解答ありがとうございます。