• 締切済み

フォーム入力をファイルに書き出す場合のセキュリティ

メールフォームで入力された項目を csvファイルなどでサーバに残しておきたいです。 フォームの項目は名前、メールアドレスなど一般的なものです。 フォームの入力データをcgi-lib.plを使って my %input; &ReadParse(\%input); $Name = $input{'name'}; のようにして受け取っています。 csvをopen関数を使って書き残そうと思っています。 セキュリティ上問題はないでしょうか。 open関数はセキュリティ上注意しなければいけないと聞いたので 心配です。 お願いします。

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

みんなの回答

  • maura
  • ベストアンサー率46% (48/104)
回答No.1

”OSコマンドインジェクション”の事でしょうか。 詳しいことは このキーワードでぐぐってみてはどうでしょう

inpu25
質問者

補足

早速の回答ありがとうございます。 OSコマンドインジェクションでググッてみました。 調べてみたところ、ファイルに書き出すときは open(OUT, ">$filename"); のようにして開けば問題なさそうなんですが、 この処理で問題ないでしょうか。

関連するQ&A

  • perl フォームの入力値のチェック セキュリティ

    フォームの入力値のチェック方法についての質問です。 名前、電話番号、Eメール、住所、注文商品、数量の入力フォームです。 入力値の取得は、ライブラリ「cgi-lib.cgi」を利用しています。 (以下perlのソース) #!/usr/bin/perl -T #入力値の取得 require 'cgi-lib.cgi'; &ReadParse(*form); $name = $form{'name'}; $tel = $form{'tel'}; $email = $form{'email'}; ・・・・以下同様の処理が続くだけなので省略 #サブルーチンを利用して入力値をチェック $name = &Wash($name); $tel = &Wash($tel); $email = &Wash($email); ・・・・以下同様の処理が続くだけなので省略 #サブルーチン部分 sub Wash{ if($_[0] =~ /^([^|><\/]+)$/){return $_[0];} elsif($_[0] eq undef){return "未入力";} else{return undef;} } (perlのソース ここまで) としてから、通常の処理に入るようにしてみたのですが セキュリティー上の問題があれば教えてください。 入力値から、コマンドやスクリプトが実行(XSS)されてしまう可能性はありますか? お願いします。 またメタ文字が見つかった場合の処理についてですが とりあえずよくわからないので。「undef」を返して いるのですが、他に良い方法があれば教えてください。

    • ベストアンサー
    • CGI
  • PerlのCGIでフォームのテキスト配列をPerlで取得するには?

    フォームで通常は同じ名前のデータを取得することは無いのですが 表計算のように同じ名前の場合、データの取り出し方がわかりません。 以下、通常の1件の場合のソースです。 #!/usr/bin/perl $| = 1; use strict; our %in; use CGI::Carp qw(fatalsToBrowser); use CGI qw(:standard); require 'jcode.pl'; require 'cgi-lib.pl'; # #-----分岐----- &ReadParse; # 配列でない場合 my $namae = $in{'namae'} print "$namaeで名前が1件表示される"; # これをフォームで namaeが配列になった場合、 #<input type="text" name ="namae"> #<input type="text" name ="namae"> #<input type="text" name ="namae"> # のような場合、3件取得する場合 exit; __END__

    • ベストアンサー
    • CGI
  • フォームデータのcsv保存について

    お世話になります。フォームに入力されたデータを csvファイルに保存するというcgiの作成をしています。 初めてcgiを作成するので、書籍の真似をして作成した のですが、おかしいデータが保存されてしまいます。 質問の項目数は5個で以下のとおりです <FORM ACTION="./ans1.cgi" METHOD="POST"> 名前:<br> <input type="text" name="name" size=30> <br> 1:<br> <input type="text" name="a1" size=30> <br> 2:<br> <input type="text" name="a2" size=30> <br> 3:<br> <input type="text" name="a3" size=30> <br> 4:<br> <input type="text" name="a4" size=30> <br> <INPUT type="submit" value="送 信"> <INPUT type="reset" value="リセット"> <BR> </FORM> cgiの中身です。 #! /usr/bin/perl require './cgi-lib.pl'; $answer = 5; $ansfile = "kotae.csv"; &ReadParse(*in); $name = $in{'name'}; for($n = 1; $n <= $answer; $n++ ) { $a[$n] = $in{"a$n"}; } open (FILE,">>$ansfile"); flock (FILE,2); print (FILE "\"", $name); for($i = 1; $i <= $answer; $i++ ) { $a[$i] = ~ s/\"/""/g; print FILE "\"\,\""; print FILE $a[$i]; } print FILE "\"\n"; flock(FILE,8); close(FILE); print "Content-type: text/plain\n\n"; print "<HTML><BODY>\n"; print "tesuto"; print "</body></HTML>"; exit; csvファイルの中身を見ると、最初の列には、項目1で 記入したデータが入ってますが、項目2以降 は4294967295と数字が入ってます。どうも1個目の回答 欄のデータはちゃんと取得されてるのですがそれ以降の が取得されていないみたいです。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • cgi-lib.plのReadParse関数

    あるパールからcgi-libを呼び出して、ReadParse関数を使おうとするとInternal Server Errorがでてしまいます。 パールの中身は #!/usr/local/bin/perl require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse(*in); です。 そこで3行目と5行目の行頭に#をつけて飛ばすとパールは正常に動きます。 これってcgi-lib.plのReadParse関数がいけないんでしょうか? ダウンロードしたまま何も変更していないのに..... ちなみにサーバーのパールのバージョンは5.004のようです。

    • ベストアンサー
    • CGI
  • &ReadParseでフォームの値が取れない

    require "./cgi-lib.pl"; ・ print << "END"; <FORM method="POST" action="$self"> <TABLE border="0" cellspacing="6" width="600"> <TR> <TD valign="top" width="116">■メッセージ(※)</TD> <TD colspan="3" width="371"><TEXTAREA rows="10" cols="50" wrap="soft" name="message">$message</TEXTAREA></TD></TR> <TR> <TD valign="top" align="right" colspan="2"><INPUT TYPE="file" NAME = "file" size ="50"></TD> </TR> </TABLE> <INPUT TYPE=HIDDEN NAME=mycmd VALUE=do_write> <INPUT TYPE=HIDDEN NAME=time VALUE="$time"> <INPUT type="submit" value=" 送 る "> <INPUT type="reset" value="やり直す"> </FORM>・ ・ ・ ・ sub do_write { &ReadParse; $message = $in{'message'}; これでmessageの値が取れるはずなのですが、空のようです。同じプログラムで使えてたときもあったのですが、いじっているうちにReadParseが機能しなくなりました。といっても、cgi-libの中をいじったわけではありません。 確実にmessageフォームの中身を取る方法があったら 教えてください。 あるいは原因を探る方法でも結構です。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • フォームからデータを取得してテキストファイルに保存して表示する際の質問

    CGIかなりの初心者です。 infoseek iswebでcgi-lib.plを使って、フォームからデータを取得してテキストファイルに保存してまたそのファイルから読み込んで表示するだけのプログラムを作っているのですが、アクセスするたびにテキストファイルが空になってしまいます。以下のソースなのですが、間違いを指摘していただけないでしょうか? 尚、ひとまず、フォームの項目は3つあり、そのうちの最後だけが0か1か選択でき、他は0しか選択できないようにしています。 #!/usr/bin/perl require "cgi-lib.pl"; print "Content-type: text/html;\n\n"; # 値をテキストファイルから読み込む open (IN,"test.txt"); $aaa = <IN>; close (IN); $h = substr($aaa,0,1); $i = substr($aaa,1,1); $k = substr($aaa,2,1); print " <html> <head> <title>テスト</title> </head> <body> $h$i$k <br> <form method=\"post\" action=\"test.cgi\"> データ1<br><input type=\"radio\" name=\"h\" value=\"0\" checked=\"checked\">0<br> データ2<br><input type=\"radio\" name=\"i\" value=\"0\" checked=\"checked\">0<br> データ3<br><input type=\"radio\" name=\"k\" value=\"0\" checked=\"checked\">0<br> <input type=\"radio\" name=\"k\" value=\"1\">1<br> <input type=\"submit\" value=\"送信\"> </form> "; &ReadParse(*form); # フォームの値を取得 $fh = $form{"h"}; $fi = $form{"i"}; $fk = $form{"k"}; # 値をテキストファイルに書き出す @faaa = ("$fh","$fi","$fk"); open (OUT,"> test.txt"); print OUT @faaa; close (OUT); print " </body> </html> ";

    • 締切済み
    • CGI
  • ソートとフォームデータの格納について

    perlを勉強して恥を承知で困っています。 先日、こちらで質問し大いに助けてもらったのですが 不甲斐ないながらどうすれば良いのか分からず、アドバイスを求めています。 ・使用言語:perl ・目的:htmlから「名前」「スコア」を入力し、 スコアが降順(高い順)に名前とスコアを表示する ランキングcgiの作成 ・現状の進行度 score.html #名前とスコアを入力するhtml ranking.cgi #ソートし、入力されたスコアをランキングに組み込む cgi-lib.plをDL ・分からない事 ソートする時、スコアを降順にするにしても、 名前をどうやってスコアと一緒に連れてソートするのか、 cgi-lib.plは(ranking.)cgiに設置すればいいのでしょうか? どうかご教授賜りたく候。 score.html --------------------- <html> <head> <title>テスト</title> </head> <body> <form action="request/ranking.cgi " METHOD="post"> 名前 : <input type="text" name="NewName"><br> スコア: <input type="text" name="NewScore"><BR> <input type="submit" value="送信"> </form> </body> </html> ranking.cgi --------------------- #!/url/local/bin/perl #データの格納 my %input; &ReadParse(\input); $nn = $input{'NewName'}; $ns = $input{'NewScore'}; #ソート my @v = {100,200,300}; my @k = sort{$b <=> $a;} @v; #受け取ったスコアとランキングとの比較 if($ns > @k[1]){ @k[3] = @k[2]; @k[2] = @k[1]; @k[1] = $ns; }elsif($ns =< @k[1] && $ns > @k[2]){ @k[3] = @k[2]; @k[2] = $ns; }else($ns =< @k[2] && $ns > @k[3]){ @k[3] = $ns; } #出力 print "結果\n" for(my $i=0;$i<@k;$i++){ print "$i位: $k[$i]<BR>\n"; }

  • cgi-lib.plの&ReadParse();の()の中

    cgi-lib.plのReadParseを使う時、  require 'cgi-lib.pl';  &ReadParse(*---); こんな風に書きますよね? ()の中はどういう意味なんでしょうか? 何でもいいんですか?

    • ベストアンサー
    • Perl
  • クエリーをキーなしで?

    http://www.****.com/index.cgi?num=1 ↑今現在、こういった形で運用しているのですが、これを短縮して、 http://www.***.com/1 でも動くようにしたいと思っています。 これを実現させる為には .htaccessの変更が必要になるのでしょうか? あと、キー(num)も省略したいのですが、 require './cgi-lib.pl'; my %input; &ReadParse(\%input); $number = %input; こんな感じで合っていますでしょうか? よろしくお願いします。

    • ベストアンサー
    • CGI
  • CGIでフォームからの入力内容を表示されない。

    初歩的な質問ですみません。 自宅サーバを使っています。 ■ActivePerl 5.8.8 Build 822 ■httpd142p ------------------------------ ■httpd142p ┗■cgi-bin  ┣■cgi-lib.pl  ┣■test.cgi  ┗■test.html ------------------------------- CGIは動作します。 一行目のパスもあっています。 --------------------------- 【test.cgi】 #!C:/perl/bin/perl #require './cgi-lib.pl'; #&ReadParse(*MYDATA) print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<TITLE>RESULT</TITLE>\n"; print "<BODY>\n"; print "氏名 = $MYDATA{'simei'}\n\n"; print "住所 = $MYDATA{'jyusyo'}\n"; print "</BODY>\n"; print "</HTML>\n"; exit; -------------------------------- 【test.html】 <HTML> <HEAD> <TITLE>TEST</TITLE> </HEAD> <BODY> <P> <FORM ACTION="test.cgi" METHOD="POST"> 氏名:<INPUT TYPE="text" NAME="simei"> 住所:<INPUT TYPE="text" NAME="jyusyo"> <INPUT TYPE="submit" VALUE="送信"> <INPUT TYPE="reset" VALUE="リセット"> </P> </FORM> </BODY> </HTML> ---------------------------------- ■実行結果 氏名 = 住所 = ---------------------------------- どなたかご教授ください。

    • ベストアンサー
    • CGI

専門家に質問してみよう