CGI 2018年03月01日 10:32   編集
時間単位での細かい予定を書き込み、グラフ表示する予定表です。バグなどありましたら、CGIサポート掲示板までお願いします。
スパム投稿対策を追加しました。(2018/01/25)
誰でも入力・閲覧できるが、編集・削除は入力者のみというモードを追加しました。(2017/03/29)
続きを読む
counter:22,557
迷惑投稿対策 2017年05月22日 16:34   編集
Clip Board改造版のサンプルとして設置している掲示板に、また新しいタイプのスパムが来ているようだ。こちらも調査したい。
まだ投稿キーも搭載されていない頃のバージョンをベースに改造したものだったが、改造版投稿キーに入れ替えていたので、そこそこスパムはブロックできていたようだ。オリジナルのClipboardの最新版に更新した上で、URLを引き継ぐためにディレクトリ名とcgiのファイル名は以前のclip/clip.cgiに戻した。改造版の方もとりあえずディレクトリ名を変更して残しておくことにする。

掲示板(YY-BOARD)と同様に、ひらがなチェック、投稿IDチェック、ダミーフィールド処理を追加し、どの処理が有効かログを残すことにする。

掲示板2の方はアクセスが少ないが、投稿IDを送ってこないというタイプのスパムがいるようだ。これは初めてのケースだ。投稿キーはクリアし、スタイル指定で隠したダミーフォールドの値は送ってきているのに、hiddenを指定したinputタグに気づかないのも不思議だが、単純にオリジナル掲示板CGIで送られるはずの値を送っているだけかもしれない。
いずれにしても、新しいタイプではなく、むしろ古いタイプのスパムのようだ。投稿IDを送ってこないので、時間を計測する必要も無く、その時点で拒否するだけで済むので対策は簡単だ。
と思っていたら、掲示板の設定ミスで投稿IDがフォームにセットされていなかったことが判明^^;
ひらがなチェックや投稿キー、ダミーフィールドにも引っかからず、投稿IDだけで拒否していたスパムもあるようなので、気になる。ダミーフィールドに引っかからないということは、HTMLを見ていないという可能性も残っているが。

それと、フォームにアクセスせず、いきなり投稿してくるタイプがあることも拒否ログを見てわかった。

こちらの掲示板はスパム投稿の頻度は低いが、たまに来るものの中に投稿ID、ダミーフィールドどちらも突破してくるスパムがある。やはりJavaScriptを使わざるを得ないか。
counter:19,481
迷惑投稿対策 2017年03月24日 20:53   編集

リンク元 ユーザーエージェント

スパム投稿の動向を分析するためで環境変数でリンク元やユーザーエージェントをログに残してみたが、こうした情報もスパムかどうか判定するヒントになるかもしれない。
リンク元はPerlの場合、環境変数$ENV{'HTTP_REFERER'}で得られる。たとえばこのページのリンクから掲示板にアクセスしたら
http://shade-search.com/sts/term/term.php
がHTTP_REFERERになる。いったん掲示板を開いて掲示板の他のページから移動した場合は掲示板CGIのURL たとえば
http://shade-search.com/sts/fsw/yybbs/yybbs.cgi?type=2
のようなものになるはずだ。
続きを読む
counter:18,108
迷惑投稿対策 2017年03月03日 21:03   編集
掲示板の迷惑投稿を防ぐ方法としては、ロボットではなく人が投稿していることを確かめるため、ロボットには読めないはずの画像による文字を読ませて入力させたり、複数の画像から質問に該当するものを選択させたり、掲示板に投稿する利用者に一手間かけさせるものが多い。
ここでは、なるべくユーザーに余計な手間をかけさせず、スパムを防止する有効な方法がないものか考えていきたいと思う。

投稿ID方式

フォームに隠しパラメータを仕込んでおいて、その値を送ってこない投稿は不正投稿としてブロックするという対策法は昔からある。しかしフォームのhtmlを解析しているのか、正しい隠しパラメータを送信してブロックを回避するスパム投稿は多いので、これだけではあまり効果のある対策とはいえない。フォーム表示のたびにランダムな値に変更しても同様だ。
しかし、最近これに投稿までの時間を計測して、あまりに早いものはスパムとして判断してブロックするという対策がどこかで紹介されていた。
続きを読む
counter:21,891
2017年02月28日 16:37   編集
タイトル
投稿者
編集パスワード
コメント
添付
preタグが使用できます。タグ内に入れられるのはタグ名と/のみです。
キーワード
[1] [2] [3] [4] [5] [6] 過去ログ 投稿順に表示 スレッドごとに表示
  • Re:PHP掲示板の警告エラーログ 2024-07-18 12:14:26 管理人  返信  編集
    >浅知恵で _blank を検索し、3,384行目を _top にしてみたんですが、ダメでした。

    これは
    target=\"_blank\"
    ごと消せばOKです
  • Re:PHP掲示板の警告エラーログ 2024-07-18 11:28:27 flipflop  返信  編集
    >発生するはずのないエラーに対応するというのも変ですね。
    おっしゃるとおりです。何でそうなるのかを知りたいと思っても、知識がないので諦めます。
    エラーは ほうっとこうかなと思ったのですが、昨日のログにも500もの警告エラーがあったので、ご提案の3行に書き替えてみました。

    たとえば下記のリファラですが、これにアクセスするとエラーが出ていたことは確認しています。
    https://flipflop.ie-t.net/flipflop_php/bbs.php?id=s1yBiFzkwt&id2=Http%3a%2f%2fWww.Google.Com&res=1&noform=s1yBiFzkwt&item=thread
    ご提案の3行を書き替えてみましたら、エラーが出ませんでした。(他のリファラも同じでした)

    お忙しいところ ありがとうございます。
    警告エラーとは言え、一度で何百行の生成するログなのでスッキリしました。
    今後ともよろしくお願いします。

    ■何度もお聞きするのも気が引けますので、このスレッドで勘弁してください。
    記事のリンクを同じ窓(タブ)で開きたいのですが、簡単な書き替えで済むのであれば お手すきのときにでも お教えください。
    浅知恵で _blank を検索し、3,384行目を _top にしてみたんですが、ダメでした。
    よろしくお願いします。
  • Re:PHP掲示板の警告エラーログ 2024-07-18 01:09:07 管理人  返信  編集
    やはりid2の値がURLのようなものになっていたようですね。
    少なくともbbs.phpの動作ではid2の値になるのは英数字のみで構成される記事IDということになります。
    手動で編集すれば可能ですが...

    id id2 res noform item をGET送信しているということはおそらく返信リンクをクリックしたときのURLだと思われますが、
    外部からロボットで投稿しようとしたわけでもなさそうですね。

    		if (req('id2') && preg_match('/^' . req('id2') . '/',$file)) {

    		$req_id2 = req('id2');
    $req_id2 = preg_replace('|/|','\/',$req_id2);
    if ($req_id2 && preg_match('/^' . $req_id2 . '/',$file)) {

    などに変更すればid2内に/が含まれていた時のエラーは回避できると思いますが、
    発生するはずのないエラーに対応するというのも変ですね。
  • PHP掲示板の警告エラーログ 2024-07-17 18:30:09 flipflop  返信  編集
    ご迷惑をおかけします。
    line 2789 で [fcgid:warn] が出た 7月15日のログをお送りします。
    こうしてみると、変な URL のような気がします。
    「id2=Http%3a%2f%2fWww.Google.Com」のように通常の閲覧アクセスだと見かけない URLが記載されています。
    WEBで調べてみると、IP自体は「Low Risk」ということなんですけど、イレギュラーなアクセスなんでしょうか?

    ■7月15日のエラーログ
    [Mon Jul 15 02:59:10.540541 2024] [fcgid:warn] [pid 3255896:tid 140007645886208] [client 185.***.***.**:27322] mod_fcgid: stderr: PHP Warning: preg_match(): Unknown modifier '/' in /var/www/clients/client492/web914/web/flipflop_php/bbs.php on line 2789, referer: https://flipflop.ie-t.net/flipflop_php/bbs.php?id=s1yBiFzkwt&id2=Http%3a%2f%2fWww.Google.Com&res=1&noform=s1yBiFzkwt&item=thread

    なお、7月12日と15日のログをピックアップして こちらのサポート掲示板に投稿しようとしたのですが、URL個数の関係で投稿できませんでしたので、必要であれば以下のURLでお目通しください。
    (追記)12日のアクセスログのリクエストの中にも変なURLが紛れ込んでいました。
    https://flipflop.ie-t.net/ffphp_v1062/bbs.php?id2=uCmCnOc7ZUAH#bbs_uCmCnOc7ZUAH
  • PHP掲示板の警告エラー 2024-07-17 07:13:08 flipflop  返信  編集
    >その際のreferer:は記録されていませんでしょうか?
    エラーログから そのアクセスログを特定すればアクセスしたURLがわかると思いますので、その内容を報告します。(できれば2,3件)
  • Re:PHP掲示板の警告エラー 2024-07-16 23:48:50 管理人  返信  編集
    エラーログを確認いただいているようですが、
    その際のreferer:は記録されていませんでしょうか?
    referer:でどういうURLにアクセスしていたかわかるかと思います。
  • Re:PHP掲示板の警告エラー 2024-07-16 23:10:02 flipflop  返信  編集
    返信ありがとうございます。
    >特定の記事のタイトルをクリックしたときに出るとか再現性はありますか
    先ほど すべての記事のタイトルをクリックしてエラーログを確認しましたが、fcgid:warn のログは出ませんでした。
    まともな閲覧では警告エラーは出ないようです。
    以前 この警告エラーが出たときのアクセスログを特定し、リクエストしたURLをコピーしてブラウザに表示させたことがあり、そのときに同じエラーが出たことを覚えています。
    通常のブラウザ閲覧で再現できないとなれば、これまでのログや新たに警告エラーが出たときに、アクセスログとエラーログを対比させたりして、何らかの糸口を探ってみます。
    何らかの共通点などがありましたら、再度ご相談させてください。
    どうも単なるブラウザでの閲覧では出ないのでは・・・と思っているのですが・・・
    (追記)
    今回エラーの出た ffmlb_php/bbs.php のほうは、記事引用もありえないので$show_artcle_link を無効にして様子を見てみます。
    もう一つのほうはそのまま有効しておき、様子を見ます。
  • Re:PHP掲示板の警告エラー 2024-07-16 21:21:38 管理人  返信  編集
    id2を指定したときでないと2,782行目は実行されないので、$show_artcle_linkを有効にして
    記事タイトルのリンクをクリックしたときに出るエラーでしょうか?
    その場合bbs.php?id2=fS6OxuUH2bQ2#bbs_fS6OxuUH2bQ2
    というようなURLでid2の値をGET送信していますが、
    調べてみるとこの値にスラッシュが入っているとエラーが出るようです。
    PHP Warning: preg_match(): Unknown modifier '/' 
    というようなエラーが出る場合はid2の値の末尾に/が入っている場合のようです。
    記事IDにはもともと/は入っていないので通常はエラーにはならないはずですが、
    特定の記事のタイトルをクリックしたときに出るとか再現性はありますか
  • PHP掲示板の警告エラー 2024-07-15 11:26:24 flipflop  返信  編集
    掲示板でお世話になっています。バージョンアップありがとうございます。
    こちらの掲示板でエラーログについて教えていただくことは可能でしょうか。
    対象スクリプト:PHP掲示板 v1.062
    (エラーログ)
    [Fri Jul 12 06:46:30.769308 2024] [fcgid:warn] [pid 2093358:tid 140400200652544] [client ***.***.**.***:43931] mod_fcgid: stderr: PHP Warning: preg_match(): Unknown modifier '/' in /var/www/clients/client492/web914/web/ffmlb_php/bbs.php on line 2789

    エラーログ指摘の2,789行(オリジナルでは 2,782行です)
    if (req('id2') && preg_match('/^' . req('id2') . '/',$file)) {

    自己アクセスで同じエラーを出してみようとしても、なかなか出ません。
    普段のアクセスでは出ないので、特殊なアクセスの仕方でしか出ないのであれば、ほっとこうかと思っています。
    [fcgid:warn]ですから 気にするほどのエラーでもないのですが、ご意見をお聞かせいただければありがたいです。

    急ぎませんので よろしくお願いいたします。
  • 記事固定リンク 2024-06-25 16:45:30 flipflop  返信  編集
    bbs.php と init.php を入れ替えて ver1.062を使ってみました。
    タイトル部分の記事固定リンクですが、記事の 引用や Index を作ったり 便利に使えてます。
    これまでは、ご指導いただいたとおり「編集」のリンクを一旦エディタに貼って修正しないといけなかったんですが、面倒がなくなって助かっています。
    ありがとうございます。
  • Re:PHP掲示板の編集日時について 2024-04-08 18:09:13 flipflop  返信  編集
    ありがとうございます。
    さっそく追記したところ、日付が更新されなくなりました。
    今後ともよろしくお願いいたします。

  • Re:PHP掲示板の編集日時について 2024-04-08 12:34:35 管理人  返信  編集
    再編集の場合の処理
    bbs.phpの1239行目あたりに

    $tm = $tmp[1];

    を追加すると編集日時が更新されなくなると思います。

  • PHP掲示板の編集日時について 2024-03-31 09:14:48 flipflop  返信  編集
    お世話になっています。
    PHP掲示板を使わせていただき ありがとうございます。

    記事を編集すると、新規で投稿した日時が編集日時に置き換わるわけですが、
    修正や追記等を含め、編集時にそれが置き換わらないような使い方をしたいと思います。
    あまり手数がかからない修正で可能であれば、お教えいただきたく存じます。
    急ぎませんのでよろしくお願いいたします。
  • 回答ありがとうございます。 2024-01-29 11:59:41 flipflop  返信  編集
    早速のご回答 ありがとうございます。
    (1)aタグ使用ということで了解です。
    (2)了解です。半角の!を全角で書けば回避できますし、タグが使えるメリットのほうが大きいので問題ありません。
    >コメントアウトを記述してコメントアウトしたくない場合があるということですか?
    はい。備忘メモ的に使っていますので、たとえば以下のような記述の場合 そのままテキストで表示されればいいかなと思ったものですから。
    <style type="text/css">
    <!-- ※「!」は全角で記述していますが、実際は半角の「!」です
    *******
    -->
    </style>
    (3)
    >FrontPageやMenuを作成した場合は(中略)$index_typeの設定は無視される仕様になっていたと思います。
    そうでしたか。了解です。何となく「3」を選択してもカテゴリ表示にならないなぁと感じていました。
    ご説明ありがとうございます。
    今後ともよろしくお願いします。
    (2024.01.29記事訂正)
  • Re:用語集作成で3点お教えください 2024-01-28 01:16:01 管理人  返信  編集
    元々用語集作成用ということで書いた関係でちょっと癖があるため、いずれも対応は難しそうです

    (1)他の記事のタイトルを自動リンクしているということと、タグの記述を許可している関係で処理が複雑になるので、URLは自動リンクしないようにしています。
    リンクを張る場合はaタグを記述することになると思います。

    (2)コメントアウトしたい場合もあるので、コメントアウトは普通にコメントアウトします
    コメントアウトを記述してコメントアウトしたくない場合があるということですか?

    (3)管理者設定ページで$index_typeを2に指定すると、デフォルトのインデックスが検索、3に指定するとカテゴリーになりますが、
    この場合も用語集作成用ということで、インデックス表示のみで特定の記事は表示されない状態になります。
    FrontPageやMenuを作成した場合は用語集よりブログ風に使う場合を想定して
    $index_typeの設定は無視される仕様になっていたと思います。
  • 用語集作成で3点お教えください 2024-01-27 21:15:25 flipflop  返信  編集
    お世話になっています。flipflopと申します。
    自分用の備忘メモとして「用語集作成」をダウンロードし、何とか使えるところまで仕上がって30項目ほど入力しました。
    https://flipflop.ie-t.net/ff_term/term.php
    その経過のなかで、わかりかねた3点について質問させていただきます。
    (1)URLは自動リンクにはなりませんが、仕様上 aタグで記述することでよろしいでしょうか。(自動リンクするとメモ用途に便利なのですが・・追記 21:14)
    (2)<!ーー と ーー>(念のため全角で書きました) のコメントアウトが効いてしまいますが、回避方法があればご教示ください。いまは「半角!」を全角で記述して回避しています。
    (3)アクセスページの件です。
    ・・・/term/term.php
    へアクセスしたときに
    カテゴリ表示で、かつ右側にFrontPageも表示されているページにしたいのですが、簡単ではないでしょうか。
    だいぶ込み入った修正であれば私には荷が重いので、スクリプトが出力したURLで済ませようと思っています。
    以上3点です。ご面倒をおかけしますが、急ぎませんのでよろしくお願いいたします。
  • Re:返信後と編集後の「フォームを隠す」のリンク 2024-01-06 22:31:56 flipflop  返信  編集
    返信ありがとうございます。
    以下の1行を投稿フォーム内に追記したので、差し当たり 問題ありません。
    <a href="./bbs.php?hide_form=1">■投稿フォームを隠す</a>
    年始にお時間をとらせてしまいました。
    今後ともよろしくお願いいたします。
    (2024.01.05 投稿追記)
    URLの掲載数を5つぐらいにしたいのですが、簡単な修正で済むのであればお教えください。面倒な場合はスルーしていただいて結構です。
    上記↑ 自己解決しました。
  • Re:返信後と編集後の「フォームを隠す」のリンク 2024-01-05 01:08:49 管理人  返信  編集
    確かに想定通りに動いていないようです。
    フォームを隠すか表示するかというのはクッキーに保存していて、
    隠す設定の時に「フォームを表示する」リンクを表示し、
    表示する設定の時に「フォームを隠す」リンクを表示すしていますが
    返信や編集時には隠す設定の場合でもフォームを表示する必要があるので
    この場合はこれらのリンクは表示しないようにしていたつもりだったのに表示されていますね。
    そしてフォームを隠す設定の場合に編集、返信が完了した際にはフォームを隠す状態に戻るはずが
    ファイルを添付した場合はフォームが表示されたままになり、その際に「フォームを隠す」リンクが表示されない状態になっているようです。
    ほかのページに移動したりすると、フォームは非表示になり、「フォームを表示する」リンクが表示されることになりますが、
    ここは本来投稿完了時にこの表示になるべきですね。

    そのうち修正したいと思います

    >某CGI配布サイトのサポートでお世話になったflipflopと申します。
    >新年で申し訳ありませんが、アドバイスをいただきたく投稿しました。
    >PHP掲示板で、新規投稿時は問題ないのですが、画像貼付を伴った返信と編集のとき、フォームの上部に「フォームを隠す」リンクが表示されず、貼付画像のファイル名だけが表示されます。
    >仕様なのであきらめようかと思いつつも、新規投稿のように表示されれば便利なので、どのファイルにどのように追記すればいいのかをお聞きしたかったのです。
    >CGIなら何とか見つけられるような気がするのですが、PHPは初めてなのでどうにもなりませんでした。
    >急ぎませんので、お手すきのときにでもアドバイスいただければ幸いです。
    >よろしくお願いします。
    >https://flipflop.ie-t.net/flipflop_php/bbs.php
  • 返信後と編集後の「フォームを隠す」のリンク 2024-01-03 23:00:38 flipflop  返信  編集
    某CGI配布サイトのサポートでお世話になったflipflopと申します。
    新年で申し訳ありませんが、アドバイスをいただきたく投稿しました。
    PHP掲示板で、新規投稿時は問題ないのですが、画像貼付を伴った返信と編集のとき、フォームの上部に「フォームを隠す」リンクが表示されず、貼付画像のファイル名だけが表示されます。
    仕様なのであきらめようかと思いつつも、新規投稿のように表示されれば便利なので、どのファイルにどのように追記すればいいのかをお聞きしたかったのです。
    CGIなら何とか見つけられるような気がするのですが、PHPは初めてなのでどうにもなりませんでした。
    急ぎませんので、お手すきのときにでもアドバイスいただければ幸いです。
    よろしくお願いします。
    https://flipflop.ie-t.net/flipflop_php/bbs.php
  • Re:multiupload.cgi 2023-11-10 22:39:04 管理人  返信  編集
    これは上書きアップデートした場合でしょうか?
    時間をおいてもう一度試してみるとどうでしょうか

    >エラー
    >multiupload.cgi_bck.cgiが開けません。
    >ブラウザの[戻る]ボタンを押して前の画面に移動してください.
[1] [2] [3] [4] [5] [6] 過去ログ 投稿順に表示 スレッドごとに表示
counter:49,720
CGI Perl 2017年02月08日 13:13   編集
perlのバージョンが新しくなったらCGIが動かなくなったという書き込みがサポート掲示板にあった。
Perl5.24ということだが、ローカルでCGIのテストに使っているXamppは最新版でもPerlのバージョンはは5.16なので、5.24での動作が確認できない。

Perlを5.24にアップデート

単体ではWindows用ActivePerlの5.24が公開されている。
Xamppの環境でこのActivePerlが使えるのかわからないが、取りあえずインストールしてみる。
XamppでPerlがインストールされているC:\xampp\perlに直接インストールしたいところだが、ダウンロードしたActivePerlのインストーラーはインストール先を変更できないようだ(それとも見落としたか?)
また、64bit版のインストーラーを使ったので、C:\Perl64というフォルダにインストールされてしまう。
取りあえずこれをXamppでインストールされたC:\xampp\perlフォルダにコピーすることにする。C:\xampp\perlは別名に変更してバックアップしておき、C:\Perl64の中身をすべてC:\xampp\perlにコピーしてみた。
これだけでうまくいくはずないよなと思ってCGIを実行してみると、あっさりと動いてしまって拍子抜けした。
続きを読む
counter:31,195
PHP Perl 2016年12月21日 14:36   編集
perlで書いていたCGIを、PHPしか動かないサーバーで使う必要に迫られ、PHPに書き換えた。その際の注意すべき点をまとめた。

変数

perlの場合は、変数のタイプによって頭につける文字が違う。スカラー変数は$、配列は@、ハッシュは%というように。一方PHPの場合は、すべて$をつけることになるので、一見しただけでは変数に何が保存されているのかわかりにくいという問題がある。
また、perlでは、変数のタイプが違うと、同じ名前をつけることができる。たとえば、$data@data%dataを同時に別の変数として扱える。PHPではこれはできないので、perlからPHPへの移行の際には、まずこれに注意が必要だ。
続きを読む
counter:27,319
CGI 2016年08月26日 12:24   編集

お知らせ

プライベートディレクトリの利用者がトレンドマイクロのセキュリティソフトを使用している場合、プライベートディレクトリへのログイン情報が外部に漏れる恐れがあります。対策を施したver.1.0に更新をお願いします。

受験戦争の過熱を抑えるためか、最近ではテストの偏差値を出さない学校が増えたようです。
しかし、試験の点数だけでは、成績が上がったのか下がったのか、イマイチわかりにくくて困る場合もあります。
こういうときはやはり偏差値がわかると便利です。
続きを読む
counter:22,515
2016年08月22日 21:32   編集


最近の更新

2024年11月12日
2024年08月06日

公開しているスクリプト

PHP

2024年11月12日
2024年08月06日
2022年10月03日
2022年03月22日

CGI

2018年03月01日

counter:25,268
迷惑投稿対策 2016年08月22日 20:11   編集
トレンドマイクロのセキュリティソフトをインストールしていると、アクセスしたWEBサイトのURLがすべてトレンドマイクロに送られてしまうということがわかりました。
パスワードでアクセス制限されたページも、URLにパスワードが含まれているとそれも送られてしまうため、セキュリティ上大きな問題になります。

これは、悪意のあるプログラムが仕掛けられているWebページへのアクセスをブロックするというWebレピュテーションという機能を有効にすると、こうなるようです。

Webレピュテーションの仕組みは、
  1. WebレピュテーションをいれたユーザーがWebを閲覧すると、そのURLがすべてトレンドマイクロのサーバーに送られる。
  2. そのURLへトレンドマイクロのロボットがアクセスして安全かどうか調べる。
  3. URLが安全かどうかの情報がサーバーのデータベースに送られる。
  4. ユーザーがWebにアクセスしようとすると、データベースに問い合わせて、危険と判断されたらブロックする。
というもののようです。
続きを読む
counter:14,300
2016年08月22日 12:24   編集
名前は "Shade検索"Wiki となっていますが、Shade関係の記事はほとんどなくて、自作のCGIなどをひっそりと紹介するサイトになってます。

最近更新した記事

2024年11月12日
2024年08月06日

公開しているCGIなど

2024年11月12日
2024年08月06日
2022年10月03日
2022年03月22日
2018年03月01日
CGIについてのお問い合わせはCGIサポート掲示板

counter:15,652
CGI 暗号 2016年08月22日 12:22   編集
パスワードを保存する必要のあるCGIでは、生のパスワードのまま保存するより、ハッシュ化したほうが安心ということでこれまですべてcrypt関数でハッシュ化した上で保存していました。
このcrypt関数は手軽に使えて便利なのですが、有効なパスワードの文字数が8文字までという制限があります。

たとえば、「password123」というパスワードをcryptでハッシュ化して保存すると、9文字以降は無視されるため、「password」でも、「password012」でも正しいパスワードと認識されてしまいます。

Digest::MD5モジュールを使う

これは、やはりマズイので、何とかできないか調べてみました。
続きを読む
counter:20,559
CGI 2016年08月22日 12:21   編集
このサイトで公開しているプログラムはフリーソフトです。個人・法人に限らず利用者は自由に使用することができますが、著作権は放棄していません。
  • 利用者はプログラムの著作権表示を削除する事は出来ません。必ず「見える」位置に表示してください。

    また削除しなくても、極端に小さくしたり、配色の具合等により表示を見えにくくしてしまう行為も実質的な削除行為となります。
  • プログラムを改造して利用することは自由です。
    プログラムを改造し再配布することについては、今のところ想定していません。
  • すべてのプログラムが、すべての環境で動作する事は保証していません。
  • 当サイトのプログラムを利用した事によるいかなる損害も作者は一切の責任を負いません。
  • 作者に著しく不利益があると判断した場合には一方的にプログラムの使用を中止していただくことがあります。
  • 設置に関する質問はすべてCGIサポート掲示板でお受けします。直接メールによるサポートは行なっておりません。
  • この「利用規定」は予告なく改編・加筆を行うことがあります。
counter:20,199
PHP 暗号 2016年08月22日 12:20   編集
パスワードをハッシュ化する場合、perlでは、crypt関数を使うと有効な文字列が8文字までという制限が有るため、MD5モジュールを使ってハッシュ化していたが、PHPの場合は逆にcryptを使った方が強度は高いようだ。
ハッシュ化の目的は、サーバー上に保存したパスワードが万一漏洩しても、元のパスワードが知られないようにするためで、この場合復号する必要は無い。ハッシュ化されたパスワードと元のパスワードを照合して、ハッシュ化されたものが元のパスワードから生成されたものであることがわかりさえすればいい。
PHPでmd5()関数を使うと、ハッシュ値と呼ばれる32桁の16進数に変換される。
$str = 'abcd';
$md5 = md5($str);
echo $md5;
実行結果
e2fc714c4727ee9395f324cd2e7f331f
たとえば上記のように「abcd」という文字列をmd5でハッシュ化すると、「e2fc714c4727ee9395f324cd2e7f331f」という文字列が得られる。
「abcd」とハッシュ化された文字列は1対1の対応で、「abcd」を何度md5でハッシュ化しても「e2fc714c4727ee9395f324cd2e7f331f」になる。
このハッシュ値から元の文字列を得る方法はない。つまり「e2fc714c4727ee9395f324cd2e7f331f」から元の「abcd」を得ることはできないということが、秘匿性を守る根拠になっている。
ところが、ハッシュ値のデータベースから元の値を得るモジュールなるものが存在するらしい。
続きを読む
counter:15,058
PHP 2016年08月22日 12:20   編集
日付のログを残す必要がある場合、あまり考えずにtime()関数で得られるエポック秒をそのまま保存していたが、エポック秒は2038年問題を起こすらしい。

2038年問題

エポック秒とは1970年1月1日午前0時0分0秒からの経過秒のことで、1秒ごとに1増えている。そしてこのエポック秒は符号付き整数値という形式になっているが、この符号付き整数値の最大値が2147483647で、2038年1月19日午前3時14分8秒にこれを超えてしまう。
2038年にならなくてもエポック秒同士の計算をしてその結果が最大値2147483647を超えるとエラーを起こすことになる。最大値を超えるとマイナスになってしまうというケースもあるようだが、Xamppを使用したローカル環境でテストしてみると、最大値を超えるとintegerではなくfloat値と判断され、エポック秒を使う関数では、float値を想定していないのでエラーになる。

日付フォーマット

エポック秒のままログに保存するのはやめた方が良さそうだが、すでに保存されているログをすべて修正するのも面倒だ。時間ログとして保存されている数値が符号付き整数値になっている場合は、エポック値として処理し、そうでない場合は新しいフォーマットとして処理することにする。

とりあえず、time()を使っている部分はdate_createやDateTimeを使って書き換えたが、setcookie関数にもエポック秒を渡すことになっているのが面倒。
指定しなければ、ブラウザを閉じるまで有効なクッキーということになるらしいが、それではクッキーの意味が無い。

このようにエポック秒でしか得られないもの、指定できないものもあるようなので、完全にエポック秒を使わないというのは難しそうだ。エポック秒を64bit整数値で扱うようになれば、最大値が桁違いに増えるため実質的に問題はなくなりそうだ。32bitのままでも符号付きから符号なし整数値で処理できれば、扱える年数が数十年延びる。おとなしくPHPの仕様の変更を待つ方がいいかも知れない。
今のところ注意すべきは日付の足し算をする場合、エポック秒のままで計算すると上限を超えてしまうおそれがあるということだ。たとえば2016年の25年後を計算したら超えてしまう。引き算も結果が1970年以前になるとエラーになる。このため、こうした計算をする場合はdate_createやDateTimeを使ってtimeオブジェクトを生成した方がいい。
counter:18,623
PHP 2016年08月22日 12:20   編集

ソート

  • 連想配列の値でソート
asort($array); // 昇順
arsort($array); // 降順
  • 連想配列のキーでソート
ksort($array); // 昇順
krsort($array); // 降順
  • シュウォーツ変換風ソート
perlで
my @keys = (keys %count);
@keys = map {$_->[0]} sort {$a->[3] <=> $b->[3]} map {[$_, split /_/]} @keys;
phpだと、前準備が必要だが
$keys = array_keys($counts);
$sort = array();
foreach ($keys as $i) {
$tmp = explode('_',$i);
$sort []= $tmp[3];
}
array_multisort($sort,SORT_ASC,SORT_NUMERIC,$keys);
のような感じ

サクラエディタでphpに変換

pp(****) → "****"
qq\((.+?)\)
"$1"
ハッシュを連想配列に変更
$hash{'***'} → $hash['***']
(\$[^$!(){]+?)\{(.+?)\}
$1[$2]
文字列中の配列の表記を変更
mode=$in['graph_mode']&amp; → mode=" . $in['graph_mode'] . "&amp;
=(\$in\[.+?\])
=" . $1 . "
正規表現の表記を変更
$str =~ /$ptn/ → preg_match('/$ptn/',$str)
(\$.+) =~ (\/.+\/)
preg_match('$2',$1)
counter:16,206
Shade 2016年08月22日 12:19   編集

メンテナンスフリー

一応ここのメインコンテンツの プラグイン・スクリプト検索CGI は、管理人がいなくても機能し続けるシステムを目指して、リンク切れ自動チェック機能を追加し、さらにリンク切れを検出して30日後に登録を抹消する機能も追加したが、思わぬ誤算が。
リンク切れが検出されて30日たった登録は確かにトップページのリンク切れ一覧から消え、抹消されたように見えるが、検索するとまだ登録に残っている。
どうもログファイル破損対策の自動リカバリー機能が誤動作しているようだ。
初期の頃頻繁にログファイルが壊れるというトラブルがあったため、急激にログファイルの容量が減ったら、自動的にバックアップファイルでリカバリーするという機能をつけていたのだ。
リンク切れ自動抹消機能は、リンク切れから30日以上経過した登録をまとめて削除することにしていたが、リンク切れが検出された日時が近い場合、一度に複数の登録が抹消される可能性がある。
そうするとログファイルの容量が急に減ったと判断されて、自動復旧が作動してしまう。
このため、登録を抹消するのは一回に1件のみにすることにした。(ver.4.092)

掲示板スパム対策

これで検索CGIの方はほとんどメンテナンスいらずになったと思うが、実は一番メンテナンスの手間がかかっているのは掲示板のスパム投稿。
プラグイン・スクリプト検索とWeb検索で5個の掲示板があって、それぞれスパム投稿対策をとっているが、やはり数か月ごとぐらいに投稿されてしまう。一度投稿されると似たようなタイプのスパム投稿が何度か続く。
スパム投稿と対策は常にイタチごっこの関係で、新たな対策をしてしばらくは効果があっても、そのうちその対策をかいくぐるような新手のスパムが出てくる。
現在ウチの掲示板で取っている対策は
  1. URL羅列拒否
  2. 日本語を含まない投稿拒否
  3. 投稿キー
    投稿フォームにランダムな数値の画像を表示し、それを入力しないと投稿できないという仕組み。
    ランダムに色やフォントを変えたり、ノイズを混入する改訂版の方が防止効果が高いようだが、ということは、画像ファイルをパターン認識しているのか。
  4. IPアドレス拒否モジュール
    ウチで公開しているモジュール。
    一時、いろいろなURLの書き込みスパムが集中して、URLを調べたところ、ドメイン名はいろいろだが、IPアドレスは一緒という書き込みが多かったので、スパム投稿のドメイン名からIPアドレスを抽出し、そのIPアドレスのドメインはすべて拒否してしまおうというものだ。
    しばらくは効果があったが、最近は短時間でIPアドレスを変えて投稿してくるケースもあるので、片っ端からIPアドレスを拒否してもきりがない。
最近のスパム拒否のテクニックとして自動投稿なので、フォームにアクセスして投稿するまでの時間が短いので、その時間を計測して短すぎるものははじくというのがあった。
counter:16,365
2016年08月22日 12:19   編集
基本的にテキスト装飾はhtmlのタグで直接記述します。管理者設定で許可されたタグが使用できます。

見出し

見出しはh1、... h4タグを使うことを想定しています。見た目の変更はbbs.cssで行うことになります。
<h1>h1タグによる見出し</h1>
<h2>h2タグによる見出し</h2>
<h3>h3タグによる見出し</h3>
<h4>h4タグによる見出し</h4>

h1タグによる見出し

h2タグによる見出し

h3タグによる見出し

h4タグによる見出し

タグ

許可されているタグはすべて有効になります。文字参照で記述しても有効になるので、ご注意ください。

<abc>ABC</abc>のように登録されていないタグは文字参照で表示されます。
preタグ内では許可されているタグを含めてすべてのタグが文字参照で表示されます。
<div style="color:red;">許可されているタグ</div>
<font style="color:blue;">許可されていないタグ</font>
<abc>許可されていないタグ</abc>
同じものをpreタグの外に出すと
許可されているタグ
<font style="color:blue;">許可されていないタグ</font>
<abc>許可されていないタグ</abc>

改行

「改行を<br />に変換する」
をチェックしていると、フォーム中の改行を
<br />
に変換して記事の改行に反映させます。ただし、行の最後が閉じタグ ">" あるいはプラグインの記述に使う "]]" の場合は変換されません。
<table>
<tr><td>テーブル</td></tr>
</table>

<table><br />
<tr><td>テーブル</td></tr><br />
</table><br />
のようになると変だからです。

添付ファイル

画像などの添付ファイルは記事ごとにアップロードします。
「投稿」ボタンを押してファイルをアップロードすると、ファイルのサムネールの上にそのファイルの埋め込みタグが表示されるので、それをコピーして貼り付けます。
画像ファイルの場合、imgタグにwidth属性を指定しますが、オリジナルの画像の幅となっています。大きすぎてはみ出すような場合は、適当な数値に変更してください。

添付ファイルは記事ごとに管理されますが、埋め込みタグは記事に関連づけられたディレクトリへ保存されたファイルのパスを指定しているだけなので、他の記事に埋め込んでもそのまま使えます。
counter:14,664
PHP 2016年08月22日 12:19   編集
ローカル環境で、PHPで表示したHTMLからPDFを出力するためにmpdfモジュールを使用しているが、「﨑」、「髙」など特定の文字が文字化けしてしまう。
それを回避するためのメモ。

まずhttp://www.mpdf1.com/mpdf/index.php?page=Downloadから最新版のmpdfをダウンロード。
xamppにPHPのモジュールとしてインストールすることも出来るが、webサーバーにはmpdfがインストールされてない場合もあるので、
そういう場合でも使用できるよう、ほかのPHPファイルなどと同様にhtdocs内に保存した。
mpdfを使用するPHPで使用する前にmpdfをインクルードして使用することになる。

たとえば、実行するPHPファイルと同じディレクトリ内に./includeディレクトリを作り、その中にmpdfを入れた場合、以下のような関数でmpdfが利用できる。

function mpdf_preview($url,$file) {
require_once('./include/mpdf/mpdf.php'); // ①mpdf.phpを読み込む
$html = file_get_contents($url); // ②URLが$urlのhtmlの内容を取得する。
$html = mb_convert_encoding($html,"SJIS-win","EUC-JP");
// ③なぜかEUC-JPからUTF-8に直接変換すると「﨑」などが文字化けするので、いったんSJIS-winに変換する。
$html = mb_convert_encoding($html,"UTF-8","SJIS-win");
// ④mpdfを使う前にUTF-8に変換しておかないとエラーが出る場合があるので、UTF-8に変換する。
$mpdf = new mpdf('ja+aCJK');
$mpdf->WriteHTML($html);
if ($file) {
$mpdf->Output($file,'F'); // ⑦ファイル名$fileを指定してPDFファイルを保存する。
} else {
$mpdf->Output(); // ⑧$fileを指定しない場合は、ブラウザに表示するのみ
}
}

となる。
  1. まず、①でmpdfが使えるように mpdf.php を読み込む。
  2. file_get_contents($url) で、$url(フルパス)で表示されるhtmlの文字列を取得して$htmlに保存する。
  3. その文字列$htmlをmpdfに渡してPDFに変換するわけだが、そのまま渡すとエラーになる場合があるので、$htmlはUTF-8に変換する必要がある。
    mb_convert_encodingで文字コードを変換する。
    PHPをEUC-JPで書いている場合、
    $html = mb_convert_encoding($html,"UTF-8","EUC-JP");
    としたくなるが、こうすると例の「﨑」とか「髙」が文字化けする。
    PHPをSJISで書いている場合は
    $html = mb_convert_encoding($html,"UTF-8","SJIS");
    としたくなるが、これも﨑」、「髙」が文字化けする。
    これは
    $html = mb_convert_encoding($html,"UTF-8","SJIS-win");
    としなければならないらしい。EUC-JPも文字化けしない指定名があればいいのだが、わからなかったので、EUC-JPの場合は、
    $html = mb_convert_encoding($html,"SJIS-win","EUC-JP");
    $html = mb_convert_encoding($html,"UTF-8","SJIS-win");
    のように、いったんSJIS-winに変換して2段階でUTF-8に変換すると、文字化けを解消できた。
ちなみにHTMLで表示する場合は、文字コードを変換した場合、charsetなどを変換した文字コードに変更してやる必要があるが、PDFにする場合、そのままでUTF-8に変換しても問題ないようだ。このへんはどうなっているのかよくわからない。
counter:17,142
2016年08月22日 12:19   編集
インストールされているプラグインの一覧です。

[A]
access
アクセスの多い順にページ名を一覧表示
[B]
bbs
掲示板を作成する
bbs_count
bbsプラグインの最新投稿をチェックして、投稿数をカウント
[C]
calendar
カレンダーを表示し、予定などを保存します。
categories
カテゴリーの一覧を表示する
comment
1行コメントフォームを表示
comment2
commentプラグインに記事の再編集機能を追加
comment3
comment2プラグインにファイル添付機能を追加
[D]
diff
差分表示
[E]
edit
編集リンクを表示する
[F]
footnote
脚注を表示する
[G]
get_id
記事のIDを取得
[H]
help
記事の入力ルールを簡単に説明します
history
更新履歴を表示する
[L]
listup
記事の一覧を表示する
[N]
navi
同じカテゴリーまたは同じタイトルの前後の記事のリンクを表示する
[R]
readmore
「続きを読む」を表示する
recent
最近更新された記事の一覧を表示する
[S]
search
検索フォームを表示して検索する
search_image
記事に添付された画像のサムネールを一覧表示する
show_load_time
読み込み時間を表示
show_new
ファイルが更新されたらnew!表示する。
spam_check
bbsプラグインのスパム投稿をチェック
counter:67,064
CGI 2016年08月22日 10:57   編集

ベーシック認証

ユーザー専用ディレクトリに直接アクセスされるのを防ぐため、オプションで.htaccessによるベーシック認証機能を追加できるようにしました。.htaccessに対応しているサーバーでのみ使用可能です。
ブラウザから直接専用ディレクトリにアクセスしてファイルをダウンロードする必要はなくなったので、すべてのユーザーからのアクセスを拒否するように変更してもよかったのですが、登録ユーザー名とパスワードでアクセスできるという仕様はそのままです。しかし、まず使う必要はないし、普段は特に意識する必要はありません。

.htaccessが使えないサーバーでは、せめてディレクトリの中身の一覧が見られないように、ディレクトリ作成時に中にindex.htmlを作成する $make_index を1にしておいた方がいいでしょう。
ユーザー登録で作成される専用ディレクトリ名がランダムな文字列で生成されるのも、外部から直接専用ディレクトリにアクセスされにくくするためです。

.htaccessと.htpasswd

ベーシック認証に必要な.htaccessと.htpasswd はユーザー登録、修正時にCGIが自動的に作成するので、通常は特に意識する必要はありませんが、簡単に仕組みを説明しておきます。
.htaccess をおいたディレクトリと、その下層ディレクトリにベーシック認証が有効になります。
.htaccess 内には、このディレクトリにはベーシック認証が必要ですということと、認証に照合するパスワードを書いたファイルへのパスが書かれています。

たとえば、ユーザー1の設定ディレクトリ(ユーザー1がアクセスできる最上層のディレクトリ。以下ルートディレクトリと呼ぶ)が./upload/dir1だとすると、このディレクトリ内に.htaccessに置きます。
.htaccess内には、ユーザー1のパスワードの保存先を記入することになります。
パスワードの保存先は専用のディレクトリ内にします。外から存在がわからないように名前をランダムな文字列にします。このディレクトリ内はアップロード用ディレクトリ内と同じディレクトリ構成にして、該当ディレクトリ内に.htpasswdを作成します。
.htpasswdにはユーザーIDとパスワードを書き込みます。
multiupload/ multiupload.cgi
|
+--- upload / (ユーザー2のルートディレクトリ)
| |
| +--- .htaccess (パスワードファイルへのパス
| | jhf5S30j78vc/upload/.htpasswd)
| |
| +--- dir1 / (ユーザー1のルートディレクトリ)
| |
| +--- .htaccess (パスワードファイルへのパス
| jhf5S30j78vc/upload/dir1/.htpasswd)
+--- jhf5S30j78vc /
|
+--- upload /
|
+--- .htpasswd (ユーザー2のパスワード保存)
|
+--- dir1 /
|
+--- .htpasswd (ユーザー1のパスワード保存)
このユーザー1のルートディレクトリより、上層のディレクトリをルートディレクトリに設定されたユーザー(たとえば./uploadをルートディレクトリにするユーザー2)にとっては、ユーザー1のルートディレクトリ(./upload/dir1)はサブディレクトリに相当します。

下層ディレクトリには、認証無しでアクセスできるようにしたいのですが、下層の.htaccessの設定が優先されるらしいので、./uploadに.htaccess を置いて、jhf5S30j78vc/uploadに.htpasswdを置くだけではアクセスできません。

このため、ユーザー設定時にルートディレクトリの下層に他のユーザーのルートディレクトリがある場合は、その下層ディレクトリに相当する.htpasswd にもパスワードを保存することにしました。
逆に設定したユーザーのルートディレクトリの上層のディレクトリをルートディレクトリとするユーザーがいたら、そのパスワードも.htpasswd に保存する必要があります。
multiupload/ multiupload.cgi
|
+--- upload / (ユーザー2のルートディレクトリ)
| |
| +--- .htaccess (パスワードファイルへのパス
| | jhf5S30j78vc/upload/.htpasswd)
| |
| +--- dir1 / (ユーザー1のルートディレクトリ)
| |
| +--- .htaccess (パスワードファイルへのパス
| jhf5S30j78vc/upload/dir1/.htpasswd)
+--- jhf5S30j78vc /
|
+--- upload /
|
+--- .htpasswd (ユーザー2のパスワード保存)
|
+--- dir1 /
|
+--- .htpasswd (ユーザー1とユーザー2のパスワード保存)
.htpasswd に保存するパスワードですが、ローカルサーバで実験したときはcryptしたパスワードでは照合できず、生のパスワードでないとダメでした。
このため、わざわざ別に生のパスワードを保存する処理を追加していたのですが、その後Web上でテストしてみると、cryptしたパスワードで大丈夫なことがわかりました。
結局生のパスワードは保存しないですむことになりました。
.htpasswdも直接見られる心配はないのかもしれませんが、パスワード保存ディレクトリは、管理者パスワード生成時に自動的にランダムな文字列のディレクトリ名を作成するようにしています。
counter:14,277
CGI 2016年08月16日 15:04   編集

お知らせ

ユーザーがトレンドマイクロのセキュリティソフトを使用している場合、アクセス制限ページのログイン情報が外部に漏れる恐れがあります。対策を施したver.1.12に更新をお願いします。

需要がどれくらいあるかわかりませんが、ファイルの更新時間を変更するCGIを公開しました。
私の場合は、掲示板などのログファイルの更新時間を変更するのに使っています。
なぜ、ログファイルの更新時間を変更する必要があるかというと、スパム投稿対策のためです。ウチの検索サイトでは、掲示板などのログファイルの更新時間をチェックして、何日以内の更新だったら new! 表示したりしています。当然ながらスパム投稿の場合でもログファイルが更新されると new! 表示されます。
スパムを削除してもログファイルの更新時間は元には戻りません。(スパムを削除した時間にさらに更新されるだけです。)
そうすると、スパムを削除してログの中身は元の状態に戻っているのに new! 表示だけが残ってしまうことになります。
これはやはり具合が悪いので、こういう場合は更新時間変更CGIでログファイルの更新時間を、スパムが投稿される元の時間に戻すようにしています。

また、最近はWEB上ではなく、パソコン内のファイルの更新時間を変更したいというケースもあるので、ローカル環境でも使いやすいよう改修したものを公開することにしました。テキストボックスに入力したディレクトリに移動できるようになっています。日本語のフォルダやファイルにもアクセスできるようです。(すべて大丈夫かわかりませんが)

web上での使用も考えて、簡単なアクセス制限機能もつけています。このCGIはファイルの更新時間を変更することしかできませんが、使い方によっては見えてはいけないファイルも見えてしまうという危険があるからです。WEB上に設置する場合、極力わかりにくいパスワードを設定してください。
ver.1.12 2013/03/14
ログイン後の認証を一時ファイルによる認証に変更。
ver.1.1 2011/06/17
秒単位まで編集できるようにしました。
パスワードは「guest」です。サンプルなので、ディレクトリの移動に制限をかけています。

設置

ダウンロードしたファイルを解凍したら、time_stamp.cgi1行目の
#!/usr/local/bin/perl
をサーバーに合わせて変更してください。

パスワード制御するなら(24行目がmy $use_pass = 1;なら)
25行目の
my $pass = '';
にパスワードを入れてください。
修正は以上です。あとはサーバーにアップロードしてtime_stamp.cgiのパーミッションを適当に設定してください。

使い方

  • 更新時間を変更したいファイル名をクリックすると、変更フォームが現れます。「指定した時間に変更する」を選んで、日時を変更し、「タイムスタンプ修正実行」ボタンを押すと更新時間が変更されます。
    「現在に変更する」を選んだ場合は、現在の時間に更新されます。

  • ディレクトリ名をクリックするとそのディレクトリに移動します。ディレクトリ名クリックはそのディレクトリへの移動に割り当てているので、ディレクトリの更新時間変更はとりあえずできません。

  • ファイル名、ファイルのサイズ、最終更新時間でソートできます。たとえば、名前をクリックするとファイル名を昇順でソートします。もう一度名前をクリックすると降順でソートします。
    サイズ、最終更新時間のソートも同じように2度続けてソートすると表示順を逆にします。
  • フォルダとファイルは分けて表示しますが、フォルダを先に表示したり、ファイルを先に表示したりすることができます。
存在しない日付や時間への変更はできませんが、存在してもUNIX元年(1970年1月1日)より前や、2038年1月19日以降の日付には変更できません。
・・・と思っていたら、いつの間にか1970年以前や2038年以降への変更もできるようです。PHPと同様にサーバーのPerlも64bit化されているのかもしれません。
counter:21,779
Shade 2012年12月16日 20:13   編集
投稿者
コメント
counter:13,307