CGI 2018年03月01日 10:31   編集
時間単位での細かい予定を書き込み、グラフ表示する予定表です。バグなどありましたら、CGIサポート掲示板までお願いします。
スパム投稿対策を追加しました。(2018/01/25)
誰でも入力・閲覧できるが、編集・削除は入力者のみというモードを追加しました。(2017/03/29)
続きを読む
counter:6,950
迷惑投稿対策 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:5,759
迷惑投稿対策 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:7,248
迷惑投稿対策 2017年03月03日 21:03   編集
掲示板の迷惑投稿を防ぐ方法としては、ロボットではなく人が投稿していることを確かめるため、ロボットには読めないはずの画像による文字を読ませて入力させたり、複数の画像から質問に該当するものを選択させたり、掲示板に投稿する利用者に一手間かけさせるものが多い。
ここでは、なるべくユーザーに余計な手間をかけさせず、スパムを防止する有効な方法がないものか考えていきたいと思う。

投稿ID方式

フォームに隠しパラメータを仕込んでおいて、その値を送ってこない投稿は不正投稿としてブロックするという対策法は昔からある。しかしフォームのhtmlを解析しているのか、正しい隠しパラメータを送信してブロックを回避するスパム投稿は多いので、これだけではあまり効果のある対策とはいえない。フォーム表示のたびにランダムな値に変更しても同様だ。
しかし、最近これに投稿までの時間を計測して、あまりに早いものはスパムとして判断してブロックするという対策がどこかで紹介されていた。
続きを読む
counter:7,319
2017年02月28日 16:37   編集
タイトル
投稿者
編集パスワード
コメント
添付
キーワード
[1] [2] [3] [4] [5] [6] 過去ログ 投稿順に表示 スレッドごとに表示
  • マルチアップロードの削除について 2019-09-17 01:17:41 高橋正之  返信  編集
    お世話になっております、マルチアップロードを利用させていただき、5年ほどとなります。
    昨日、なぜかはっきりしていませんが、ファイル名が化けてしまい、ffftpで強制的にファイルの削除作業をしていましたが、どうしても削除できないファイルが存在したため、管理者機能のファイル管理機能で該当のファイルを個別で削除したところ、どうやら更新日が30日以前のファイルがすべて削除されてしまいました。
    特にバックアップをしていなかったので、自前で戻すことができない状態になってしまいました。
    削除したファイルはdelete.001というファイルに記載されておりましたが、なにか裏技で削除したファイルを復旧することはできませんでしょうか。
  • Re:詳細予定表について 2018-03-26 18:06:03 貴田  返信
    ありがとうございます!先程再設置しました。
    今後ともよろしくお願い致します。
  • Re:詳細予定表について 2018-03-02 12:08:27 管理人  返信  編集
    ずいぶん遅くなりましたが、スパム対策を追加したver.1.22をアップしました。
    CGI/詳細予定表
  • Re:詳細予定表について 2017-10-05 13:55:09 管理人  返信
    >少し前から外部からスパムメールのような予定を入れられてしまうようになり困っております。(※添付ファイルをご参照ください)
    >マスターのパスワードを使って全て削除しましたが、今後も同様の事が続くと結構面倒なので、何か対策をしていただけると幸いです。
    >宜しくお願い致します。

    そういえばスパム対策というのはほとんどしていませんでした。
    貴田さんところのようなスパムを防ぐには
    ●「予定名」へのURLの記述、タグの使用を禁止
    ●「メモ」のタグの使用を禁止
    ●時間指定の無い投稿の拒否
    ●ダミーフォームへの入力があった場合拒否
    などで対策できそうです。
    しばらくお待ちください。
  • 詳細予定表について 2017-10-03 10:09:31 貴田  返信  編集
    お世話になっております。
    以前詳細予定表のカスタムを依頼した者です。おかげさまで業務もスムーズにまわり大変満足しております。
    少し前から外部からスパムメールのような予定を入れられてしまうようになり困っております。(※添付ファイルをご参照ください)
    マスターのパスワードを使って全て削除しましたが、今後も同様の事が続くと結構面倒なので、何か対策をしていただけると幸いです。
    宜しくお願い致します。
    eVRwcUewUX.jpg

  • Re:KENT-WEBが配布してる【COSMO GATE】について 2018-02-28 14:31:44 管理人  返信  編集
    >KENT-WEBが配布してる【COSMO GATE】という、- パスワード制限掲示板 -を設置しようとしています。
    KENT-WEBサポート掲示板で質問されていた方ですか?
    KENT-WEBのCGIについての質問ならKENT-WEBのサポート掲示板で聞いてください。
  • KENT-WEBが配布してる【COSMO GATE】について 2018-02-21 10:04:12 N.  返信  編集
    KENT-WEBが配布してる【COSMO GATE】という、- パスワード制限掲示板 -を設置しようとしています。

    URLを入力して、ID&PWを入力する画面まではたどり着けるのですが、
    ID&PWを入力して、入室しようとすると、

    【ERROR!
    open err: secret_file】

    という画面が出て、入室する事が出来ません。

    掲示板のURLは、
    【http://www.the--cherrys.com/cgi-bin/ura/ura.cgi】

    ID&PWは、共に【test】です。

    設定ファイル<init.cgi>の中に、

    # 隠しファイルのフルパス【サーバパス】
    # → HTMLファイルの場合はサーバパスで記述
    # → CGIファイルの場合は、http:// からのフルパスで記述
    $cf{secfile} = "http://www.the--cherrys.com/cgi-bin/ura/ura.cgi";

    # 隠しファイルの種類
    # 0 : HTML
    # 1 : CGI
    # 2 : その他(目的のURLに単純にジャンプするだけ)
    $cf{secet_type} = 1;

    という項目があるのですが、
    cgiなので、

    $cf{secet_type} = 1;

    # 本体ファイルURL【URLパス】
    $cf{gate_cgi} = 'http://www.the--cherrys.com/cgi-bin/ura/ura.cgi';

    と設定しております。

    なぜ、入室出来ないのかが、わからなくて、困っています。

    ご教授、お願い致します。




  • Re:詳細予定表の当日へのジャンプ 2017-09-22 10:32:43 ichi  返信  編集
    当日のアンカー位置にジャンプするようになりました。ありがとうございました。
    月の後半などでスクロールしなくて済むのはとてもラクです!

  • Re:詳細予定表の当日へのジャンプ 2017-09-21 17:14:41 ichi  返信  編集
    早速のご対応ありがとうございます。試してみます!

    >書き換えたschedule.cgiです。
    >解凍してschedule.cgiを上書きしてみてください。
  • Re:詳細予定表の当日へのジャンプ 2017-09-21 17:09:51 管理人  返信
    書き換えたschedule.cgiです。
    解凍してschedule.cgiを上書きしてみてください。
    schedule.zipschedule.zip  114dl

  • Re:詳細予定表の当日へのジャンプ 2017-09-21 17:04:44 管理人  返信
    >URLの末尾にアンカー名をその都度付けてアクセスするのは煩雑なので、URLのschedule.cgiにアクセスしたときに自動的に当日のアンカー位置にジャンプさせたいのですが・・。
    その必要がないようにschedule.cgiにアクセスしたときにschedule.cgi?year=2017&month=9&day=21#d21
    にリダイレクトするのが前記の改修です。

    schedule.cgiにアクセスした場合、ブラウザに表示されるURLはどうなっているでしょうか。
    schedule.cgiのままならリダイレクトに失敗しているということになりますが。
  • Re:詳細予定表の当日へのジャンプ 2017-09-21 15:53:03 ichi  返信  編集
    ご回答ありがとうございます。
    123行目に記述を追加してみましたが、ページを開いたときに当日の欄へのジャンプはしませんでした。
    あまりCGIに詳しくないもので、お教えいただきたいのですが、実際にジャンプ動作をさせるにはこの他に記述が必要なのでしょうか?
    URLの末尾にアンカー名をその都度付けてアクセスするのは煩雑なので、URLのschedule.cgiにアクセスしたときに自動的に当日のアンカー位置にジャンプさせたいのですが・・。

    >各日の欄には"d7"、"d21"のようにname属性がついているので、URL末尾に
    >schedule.cgi#d21などアンカー名を追加すれば、当日欄へジャンプできますが、
    >きょうが何日かということは、CGIの方で取得する必要がありますね。
    >
    >今思いつく方法としては、
    >日付の指定が無い場合、当日の引数とアンカー名を追加してリダイレクトするぐらいでしょうか。
    >
    >schedule.cgiの今日の日付を取得したあと、123行目あたりに
    >
    if (!$in{'year'} && !$in{'month'} && !$in{'day'}) {
    >ツ黴€ツ黴€ツ黴€ツ黴€&redirect($script . qq(?year=$yearT&month=$monthT&day=$mdayT#d$mdayT));
    >ツ黴€ツ黴€ツ黴€ツ黴€exit;
    >}
    >
    >を追加すればいいと思います。

  • Re:詳細予定表の当日へのジャンプ 2017-09-21 14:27:08 管理人  返信
    すみません。遅くなりました。

    >詳細予定表を開いたときに、当月の一番Topから表示されますが、当日が月の途中の場合はスクロールしなければなりません。
    >当日の欄へジャンプする機能があると便利だなと思うのですが、ご検討よろしくお願いします。
    >P.S.
    >もし、ソースの記述を追加などすれば実現できるのであれば、お教え下さい。

    各日の欄には"d7"、"d21"のようにname属性がついているので、URL末尾に
    schedule.cgi#d21などアンカー名を追加すれば、当日欄へジャンプできますが、
    きょうが何日かということは、CGIの方で取得する必要がありますね。

    今思いつく方法としては、
    日付の指定が無い場合、当日の引数とアンカー名を追加してリダイレクトするぐらいでしょうか。

    schedule.cgiの今日の日付を取得したあと、123行目あたりに
    if (!$in{'year'} && !$in{'month'} && !$in{'day'}) {
    ツ黴€ツ黴€ツ黴€ツ黴€&redirect($script . qq(?year=$yearT&month=$monthT&day=$mdayT#d$mdayT));
    ツ黴€ツ黴€ツ黴€ツ黴€exit;
    }

    を追加すればいいと思います。
  • 詳細予定表の当日へのジャンプ 2017-09-14 18:59:54 ichi  返信  編集
    詳細予定表を開いたときに、当月の一番Topから表示されますが、当日が月の途中の場合はスクロールしなければなりません。
    当日の欄へジャンプする機能があると便利だなと思うのですが、ご検討よろしくお願いします。
    P.S.
    もし、ソースの記述を追加などすれば実現できるのであれば、お教え下さい。
  • サポート掲示板移動しました 2017-02-28 16:48:05 管理人  返信  編集
    サポート掲示板をBBSプラグインで作成した掲示板に移動しました。ログも移動しました。
  • Re: マルチアップローダーのアップロードエラーについて 2017/02/24 13:17 管理人  返信  編集
    特定の時間だけエラーになるということは、回線の問題の可能性が高いと思います。
    エラーが出ているときは他のインターネットも遅くなっていないでしょうか。
    共有回線だったら、他の人がたくさん使う時間帯になると遅くなるということが考えられます。
    遅くなりすぎるとタイムアウトでエラーになることもあると思います。
  • Re: マルチアップローダーのアップロードエラーについて 2017/02/23 23:01 とペコちゃん  返信
    追記です。

    店舗によっては、夜の時間帯(21~22時)はアップロードに時間がかかって、エラーになるようです。

    お昼の時間は全く問題なくアップロードできたりするようです。

    ちなみに全店ひかり回線を導入しております。
  • マルチアップローダーのアップロードエラーについて 2017/02/23 21:46 とペコちゃん  返信
    はじめまして。マルチアップローダーを3年ほど使っております。

    系列の飲食店が4店舗あり、それぞれのお店のPOSデータをバックアップする用途として使っております。


    最近、ファイル(15MB程度)をアップロードする際に、エラーが起こりなかなかアップロードされないことが増えてきました。それも各店で一斉に起こっています。アップロードできるときもあり、その規則性がよくわかりません。

    3年ほど前のバージョンのマルチアップローダーを使っておりましたので、先日最新のものを導入しなおしましたが、
    それでもエラーが多発しております。

    サーバーはロリポップです。サーバーの容量はまだ1/5程度しか使っておりませんので、容量不足というわけでもなさそうです。

    バージョンアップの方法は、古いバージョンを更新する形ではなく、最新のものを新規に設置しなおしました。

    ブラウザはクロームを使用しており、IEで試しても同じ結果になりました。

    原因としてどういったことが考えられますでしょうか?



  • Re: 詳細予定表の動作環境について 2017-02-28 16:36:45 管理人  返信  編集
    Perlの新しいバージョンでは、jcode.plでエラーが出るようです。
    このzipファイルを解凍してできたjacode.plを
    schedule/libディレクトリにコピーし、
    57行目の

    require './lib/jcode.pl';

    require './lib/jacode.pl';

    と書き換えてみてください。
    jacode.zipjacode.zip  110dl

  • Re: 詳細予定表の動作環境について 2017/01/31 20:39 管理人  返信  編集
    Perl5.24ですか。
    こちらの環境では5.10とか5.16とかしかないので、
    今のところ現象を確認できていません。

    どのように動かなくなったのか教えてもらえますか。
    エラーメッセージが出ているなら、そのメッセージはどうなっていますか。
[1] [2] [3] [4] [5] [6] 過去ログ 投稿順に表示 スレッドごとに表示
counter:17,605
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:12,000
PHP Perl 2016年12月21日 14:36   編集
perlで書いていたCGIを、PHPしか動かないサーバーで使う必要に迫られ、PHPに書き換えた。その際の注意すべき点をまとめた。

変数

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

お知らせ

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

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


最近の更新


公開しているスクリプト

PHP

2022/10/13 23:44:14
2022/10/06 02:05:17
2022/10/03 20:20:09
2022/03/22 20:03:05

CGI

2018/03/01 10:31:55
2016/08/26 12:24:17

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

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

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

最近更新した記事


公開しているCGIなど

2022/10/13 23:44:14
2022/10/06 02:05:17
2022/10/03 20:20:09
2022/03/22 20:03:05
2018/03/01 10:31:55
2016/08/26 12:24:17
CGIについてのお問い合わせはCGIサポート掲示板

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

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

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

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

    また削除しなくても、極端に小さくしたり、配色の具合等により表示を見えにくくしてしまう行為も実質的な削除行為となります。
  • プログラムを改造して利用することは自由です。
    プログラムを改造し再配布することについては、今のところ想定していません。
  • すべてのプログラムが、すべての環境で動作する事は保証していません。
  • 当サイトのプログラムを利用した事によるいかなる損害も作者は一切の責任を負いません。
  • 作者に著しく不利益があると判断した場合には一方的にプログラムの使用を中止していただくことがあります。
  • 設置に関する質問はすべてCGIサポート掲示板でお受けします。直接メールによるサポートは行なっておりません。
  • この「利用規定」は予告なく改編・加筆を行うことがあります。
counter:6,091
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:6,366
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:5,108
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:4,560
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:4,456
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:7,444
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:6,254
2016年08月22日 12:19   編集
インストールされているプラグインの一覧です。

[A]
access
アクセスの多い順にページ名を一覧表示
[B]
bbs
掲示板を作成する

bbs

掲示板を作成する
■ファイルアップロード、返信、過去ログ生成、隠しパラメータ送信によるスパム投稿対策、スライドロックによるスパム投稿対策
オプションは[[bbs('lock=1|max_log=100|item=thread')]]のように指定

指定できるオプション

form
form=up(フォームを上に表示) form=down(フォームを下に表示)
item
デフォルトの記事表示順を指定
item=time(投稿順) item=thread(スレッドごとに表示)
max_log
現行ログの保存数。これを超えると過去ログに移動。
例 max_log=50
max_past
過去ログに保存する記事数。これを超えると過去ログファイルを新たに作成。
例 max_past=100
page_line
1ページに表示する記事数。これを超えると次のページに表示
例 page_line=10
lock
スライダで投稿ボタンをロックする lock=1で表示する
例 lock=1
perm_tag
許可するタグ。複数ある場合は;(セミコロン)で区切る。
有効になるのはタグ名だけを<>で囲った場合とその閉じタグだけ。styleなどは指定できない。
例 perm_tag=pre;h1
nameless
投稿者名未入力で投稿した場合、表示される名前を指定。'id'にすると、日付とIPアドレスを元にしたIDを表示
例 nameless=id
titleless
タイトル未入力で投稿した場合、表示されるタイトルを指定。
例 titleless=タイトルなし
hide_bbs
デフォルトでフォームと投稿内容を隠す hide_bbs=1で隠す
例 hide_bbs=1
show_text
添付したtextファイルの内容を表示する show_text=txt;phpのように表示するテキストファイルの拡張子を指定する。複数ある場合は;(セミコロン)で区切る
例 show_text=txt;log

使用例

[[bbs('lock=1|nameless=id')]]
タイトル
投稿者
編集パスワード
コメント
添付

bbs_count
bbsプラグインの最新投稿をチェックして、投稿数をカウント
[C]
calendar
カレンダーを表示し、予定などを保存します。
categories
カテゴリーの一覧を表示する
comment
1行コメントフォームを表示
comment2
commentプラグインに記事の再編集機能を追加
comment3
comment2プラグインにファイル添付機能を追加
[D]
debug
デバッグ用情報を出力
diff
差分表示
[E]
edit
編集リンクを表示する
[F]
files
記事のファイル情報を表示する
footnote
脚注を表示する
[G]
get_id
記事のIDを取得
[H]
help
記事の入力ルールを簡単に説明します
history
更新履歴を表示する
[L]
listup
記事の一覧を表示する
[N]
navi
同じカテゴリーまたは同じタイトルの前後の記事のリンクを表示する
next_link
同じカテゴリーの前後の記事のリンクを表示する
[P]
plugins
プラグインの一覧と説明、使用例を表示する。
[R]
readmore
「続きを読む」を表示する
recent
最近更新された記事の一覧を表示する
[S]
sample
ここにプラグインの説明を記述
search
検索フォームを表示して検索する
search_image
記事に添付された画像のサムネールを一覧表示する
show_load_time
読み込み時間を表示
show_new
ファイルが更新されたらnew!表示する。
counter:10,917
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:5,382
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:5,859
Shade 2012年12月16日 20:13   編集
投稿者
コメント
counter:4,709