MD5の値が異なる

このQ&Aのポイント
  • MD5によって生成された値が予想と異なる理由について質問です。
  • test.cgiとtest2.cgiでMD5の値が一致しない問題について相談です。
  • エンコードなどの問題によって、test.cgiとtest2.cgiで生成されるMD5の値が異なることについて質問です。
回答を見る
  • ベストアンサー

MD5の値が異なる

MD5のマニュアルを読み、自分なりに下記のように解釈したのですが、 思ったように動作してくれません。なぜでしょうか。 そもそも考え方が間違っていますでしょうか? どうぞよろしくご指導願います。 【test.cgi】でtest.cgi?name=hogehoge&tel=031234xxxxを受け取り、 $name = $query_form->param('name'); $tel = $query_form->param('tel'); $digest64=md5_base64($name,$tel); $param="name=".$name."&tel=".$tel."&digest64=".$digest64; をtest2.cgiのパラメタとしてtest2.cgiへ 【test2.cgi】でtest2.cgi?name=hogehoge&tel=031234xxxx&digest64=NSKBL6fmS/msCw6e/KXm3wを受け取り、 $name = $query_form->param('name'); $tel = $query_form->param('tel'); $digest64_before = $query_form->param('digest64'); $digest64_after=md5_base64($name,$tel); としたとき、$digest64_beforeと$digest64_afterの値が同じであれば OKだと思うのですが、 $digest64_beforeにはnullが $digest64_afterには実際にtest.cgiで求めたダイジェストとは別の値が入っています。 エンコードとかよくわからないのですが、そのあたりの問題でしょうか? よろしくお願いいたします。

  • Perl
  • 回答数1
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • nipotan
  • ベストアンサー率59% (134/227)
回答No.1

一応、手元で確認してみました --- use strict; use CGI; use Digest::MD5 'md5_base64'; { my $query_form = CGI->new('name=hogehoge&tel=031234xxxx&digest64=NSKBL6fmS/msCw6e/KXm3w'); my $name = $query_form->param('name'); my $tel = $query_form->param('tel'); my $digest64_before = $query_form->param('digest64'); my $digest64_after = md5_base64($name, $tel); print 'Content-Type: text/plain'."\n\n"; print $digest64_before."\n"; print $digest64_after."\n"; } --- まずローカル (ターミナルや DOS 窓) で実行してみてください。 同じ結果は得られると思います。 原因はなんだろうな?と考えたんですが、そもそも、それを実行するサーバはなんでしょうか? CGI としての動作がおかしいのでは?と思うんです。 環境がわからないと何ともいえませんが、恐らく一部の httpd において、/ (スラッシュ) が入る QUERY_STRING を PATH_INFO として扱うために、QUERY_STRING がフラッシュされてしまっているのかも知れません。 とりあえず、test.cgi 側で、以下の関数を追加してください。 --- sub urlescape{ my $str = shift; $str =~ s/([^\w ])/'%'.unpack('H2', $1)/eg; $str =~ tr/ /+/; $str; } --- そして、 > $param="name=".$name."&tel=".$tel."&digest64=".$digest64; としている箇所を $param = urlescape("name=".$name."&tel=".$tel."&digest64=".$digest64); として実行してみたらいかがでしょうか。 そもそも > をtest2.cgiのパラメタとしてtest2.cgiへ としている箇所も、どうやってパラメタとしているのかが気になるところではありますが。(「$digest64_beforeにはnullが」ってので、少し気になります。)

関連するQ&A

  • 固定パスでアップロードする場合

    通常ファイルをアップロードする場合、 test.html ---------------------------------------- <form action="upload_test.cgi" method="post" enctype="multipart/form-data"> <input type="file" name="filename" > <input type="submit" value="送信" > </form> ---------------------------------------- upload_test.cgi ---------------------------------------- my ($query,$filename,$mimetype); $filename = $query->param('filename'); $mimetype = $query->uploadInfo($filename)->{'Content-Type'}; ---------------------------------------- ・・・こんな感じに cgi 側でアップしたいファイルの フルパスを受け取ると思いますが、 test.html で、ファイル名をその際選択せずに、 固定の( できれば hidden で ) textタイプ <input type="text" name="filename" value="C:\Documents and Settings\xxxx\デスクトップ\UP.htm" > という具合で upload_test.cgi にうまくファイルのフルパスを渡すにはどうしたらいいのでしょうか。

    • ベストアンサー
    • Perl
  • Formでの値の取得後、変数での表示ができない

    環境は; RedhatLinux7.1.2 Apache PHP PostgreSQL(今回は関係ないかな) 問題は、フォームにて値を渡した後$xxxxとして変数として表示できるはずなのにできないことです。 ちなみにPostの代わりにGetで行うとアドレス部分に確かに値が渡されたことが認められます。 同じファイルをPHPが使用できるレンタルサーバーで試したところ問題はありませんでした。 **** form.html ***** <form name="a" action="test.php" method="post"> <input type="text" name="a"> <input type="submit" value="submit" name="submit"> </form> **** test.php **** <? print $a; ?> 何が悪いのか全くわからないので、どうぞよろしくお願いします。

    • ベストアンサー
    • PHP
  • Perl BBS 掲示板 改行処理

    改行処理について教えてください。 今まで書き込み処理で unshift @DATA, "$tm,$FORM{'name'},$FORM{'title'},$FORM{'text'}\n"; としていたのですが、これを use CGI; my $form = new CGI; my $NAME = $form->param('name'); my $TITLE = $form->param('title'); my $TEXT = $form->param('text'); unshift(@DATA,"$tm,$NAME,$TITLE,$TEXT\n"); に変更しました。 すると sub loadFormdata が聞かなくなり、 改行処理他が対応しなくなってしまいました、 この場合、 loadFormdataの部分のどこを変えればよいでしょうか? |------書き込み処理------| sub printdata{ use CGI; my $form = new CGI; &loadFormdata(); open(FILE, "<$FILE"); eval{ flock(FILE, 1) }; @DATA = <FILE>; close FILE; my $tm = time; my $NAME = $form->param('name'); my $TITLE = $form->param('title'); my $TEXT = $form->param('text'); unshift(@DATA,"$tm,$NAME,$TITLE,$TEXT\n"); while(@DATA > $MAX) { pop @DATA; } open(FILE, ">$FILE") or die("error :$!"); eval{ flock(FILE, 2) }; print FILE @DATA; close FILE; } |------改行処理他------| sub loadFormdata { my ($query, $pair); if($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; } foreach $pair (split(/&/, $query)) { my $key = ("$NAME,$TITLE,$TEXT"); my ($key, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; $value =~ s/&/&amp;/g; $value =~ s/</&lt;/g; $value =~ s/>/&gt;/g; $value =~ s/\x0D\x0A\s*/<br>/g; $value =~ s/\s+/ /; $FORM{$key} = $value; } }

    • ベストアンサー
    • Perl
  • Flush 起動変数

    下記サイトを参考にして、htmlからflushに値を送って、flushで表示したいと考えています。 http://oshiete1.goo.ne.jp/qa2964016.html 現在、htmlで下記コードを記したのですがflushに渡した値(hogehoge)全く表示されません。 <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width=600 height=300> <param NAME="movie" VALUE="test1.swf"> <param NAME="bgcolor" VALUE="#000000"> <param NAME="LOOP" VALUE=true> <param NAME="quality" VALUE="high"> <param name="FlashVars" value="test=hogehoge"/> </object> html側に問題があるのかflush側に問題があるのか切り分けもできずにおります。 どなたか原因と対処をご存じの方がいらっしゃいましたら、ご教示いただければと思います。 宜しくお願いします。

    • ベストアンサー
    • HTML
  • Perl の use strict に付いて

    ●HTML <html><head> <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> <title>テスト5(UTF-8)</title> </head> <body> <form action="test5.cgi" method="post" > <input type="text" name="f1" value="" size="80"> <button type="submit" >送信</button> </form> </body></html> —————————————————————————————————————— ●Perl #!/usr/bin/perl #use strict; ※問題の行1 use warnings; use CGI; print "Content-type: text/html\n\n"; print "<meta charset=\"UTF-8\">\n"; # POST / GET パラメータを取得------------------------- my $q = new CGI; # パラメータ名を指定して取得する my $param1 = $q->param('name1'); my $param2 = $q->param('name2'); # FORM値の取得----------------------------------- # 全てのパラメータを取得する for my $param_name ($q->param) { print $param_name . ' = ' . $q->param($param_name) ; print "<br>\n"; ${$param_name} = $q->param($param_name); ※問題の行2 } #------------------------------------------------- print "テスト<hr>\n"; print "$f1<br>\n"; exit; —————————————————————————————————————— 【質問】 「※問題の行1」+「※問題の行2」 = エラー 「※問題の行1」のみ = 正常に動きます 「※問題の行2」のみ = 正常に動きます 「※問題の行1」の「use strict; 」と 「※問題の行2」の「${$param_name} = $q->param($param_name); 」 をどう書き換えれば、二つとも記述したまま正常に動くのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • テキストボックスの値のチェック

    テキストボックスの値が未記入であったときに、submitボタンを押したときのジャンプ先のページを変えたいときはどのようにすれば良いのでしょうか? <input type="text" name="Test" size="25"> ↑ これが未記入の時は、 <form action="http://aaa.html" method="post" name="test"> にジャンプして、もし値が入っているときは、 <form action="http://bbb.html" method="post" name="test"> にジャンプさせるっていう感じにしたいのですが... 宜しくお願いします。

  • JavaScriptの値を、cgiに渡す方法を教えてください。

    JavaScriptの値を、cgiに渡す方法を教えてください。 jsファイルの変数に、テキストボックスの入力値が入っています。 それを、cgiに渡して、その変数の値を、ファイルに 書込みたいと考えています。 __test.html_________ <head><script src="keep.js"></script></head> <form name="f1" action="keep.js"> <input type="text" name="a_text"> <input type="button" value="クリック" onclick="keep()"> </form> _________________________ ___keep.js_______________ function keep() { var a_text = document.f1.a_text.value; ■この変数「a_text」をcgiファイルに渡したいです。 } __________________________ __●.cgi_______________ ■なんだかの方法で、上記keep.jsの変数、a_textを取得して、 この●.cgiでファイルをopenして、a_textの値を 書込みたいです。 ______________ よろしく、お願いします。

  • javascriptでCGIに値を渡したいのですが、テキストエリアの値で改行コードが消えてしまいます。教えて下さい。

    javascriptでCGIに値を渡したいのですが、テキストエリアの値で改行コードが消えてしまいます。教えて下さい。 別窓ページにてtest.cgiを呼び出し、そのCGIに値を渡したいのですが、 一応値はテキスト形式で渡せるのですが、テキストエリアで入力したものの 改行コードが消えてしまいます。何か良い方法があれば、教えて下さい。 <FORM name="test" ACTION="javascript:test_window_open('/cgi-bin/test.cgi?bikou='+document.test.bikou.value);"> : : <TEXTAREA rows="8" cols="50" name="bikou"></TEXTAREA>

  • LWPでPOST送信した後に送信先に移動したい

    LWPで別サーバーのtest.cgiに以下のようなコードで POST送信しています。 use HTTP::Request::Common; use LWP::UserAgent; $query="param1=dummy"; $ua = LWP::UserAgent->new(); $req = HTTP::Request->new(POST => "http://xxx.xxx.xxx/test.cgi"); $req -> content_type('application/x-www-form-urlencoded'); $req -> content($query); $res = $ua->request($req); $success = $res -> is_success; if(!$success){ die("error"); } $con = $res -> content; この場合、$conにtest.cgiの出力が入るだけで、 URLのhttp://xxx.xxx.xxx/test.cgiに遷移することはできません。 HTMLのformタグでPOST送信したときのように、 POSTでデータを送信してかつ、その送信先に移動するということはできるのでしょうか。 LWPでなくてもいいです。 要するにHTMLのformタグでのPOST送信を手動ではなく、自動で行いたいわけですが、 <form action="http://xxx.xxx.xxx/test.cgi" method="post"> <input type="hidden" name="param1" value="dummy"> </form> このようなタグのあるHTMLを表示して、 JavaScriptでonLoadでsubmitすればできるのですが、 JavaScriptを使っているとSSLの場合にセキュリティのアラートがでる場合があるので、 できればPerlだけでできないかと思ったのです。

  • データを送るのと値を渡すのを同時に行いたい

    a hrefでデータを送るのと値を渡すのを同時に行いたいのですがどうすればいいのでしょうか。 下記のa hrefでのデータを送りに<a href="http://www.localhost/hoge.php?name=papa&age=30"> のような固定された値を受け渡したいのですがどのようにすてばいいのでしょうか <form name="form1" action="test" method="post"> <input type="hidden" name="str" value="aaa"> <A HREF="javaScript:form1.submit();">ここの書き方がわかりません</A> <form>