質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

4回答

1735閲覧

Formでの連続送信を制御したい

tanpopochan

総合スコア18

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2016/10/10 09:48

###前提
Amigo databaseというPerlで制作された汎用データーベースを利用し、
会員にIDとパスワードを発行し、会員情報を更新して頂くホームページを運営しております。
http://www.cgi-search.info/search/script30.html

###発生している問題
ホームページ内に情報の更新順番に並ぶコンテンツがあり、
先頭に表示されると情報の露出度が高まるために
なんらかのマクロ的プログラムを利用し、毎秒毎に更新を行う会員が出て参りました。
それに対し自力で情報を更新している会員から不満が出ており、
また全会員が同じ様な自動更新を始めると当方のサーバに悪影響が出るおそれがあると考え、

  1. ユーザ毎に一日何回まで、と数値を割り振り、回数を超えるとその日は更新が出来なくなる
  2. 一度更新を行うと、その後数時間経過しないとフォームの送信が行えなくなる

上記のうちどちらかの対策を行う必要が出て参りました。

案1はPerlにてプログラムを書く必要があるかと思いますが、自分には見当もつかない状態です。
(また一日ごと更新回数を初期値に戻す、というのもcronを使う必要があると思われ、大掛かりなものとなりそうです)
案2はJavaScriptにて比較的行えるのではないか、と予想していますが見当つかないのは案1と同様です。

###試したこと
http://www.nishishi.com/javascript/2007/button-disabled.html
案2はこちらを参考にしてできるのではないか…と考え試行錯誤中です。

###ご相談内容
上記案1と案2、どちらが問題なく簡単に実装できそうでしょうか?
また、他により簡単な対応策などございますでしょうか?

それではどうぞ、よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ユーザーはログインして更新しているのですよね?
更新日時を保存しておき、頻繁な更新者にはスパム扱いの警告を出し
数度の警告後ユーザーアカウントのロック、それでも攻撃してくるようなら
アカバンすればよいでしょう。

逆に有効な情報を更新してくれるユーザーの可能性もあるので
日時ではなく日付順で更新してくれた人を表示し、同日に更新した人は
ランダムで表示するくらいがちょうどいいかもしれませんね

投稿2016/10/11 01:26

yambejp

総合スコア114839

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tanpopochan

2016/10/11 05:39

お知恵をお貸し下さりありがとうございます。 仰る通り、まずは会員様へ頻繁な更新は止める様警告を出してみます。 日時順で並べ、同日更新内でランダムとする件についてもどの様に行うか調査を行います。 ありがとうございました。
guest

0

サーバーに一番負荷がかからないのは fail2ban の利用 ですね。

必須事項

  • サーバーのRoot 権限を所有していること
  • fail2ban がインストール可能な環境であること
  • FireWall でアクセス制御を行えること。
  • tanat さんの処理で判別可能なこと (fail2ban 用の error_log の出力)

一読

DoS攻撃/DDoS攻撃からサーバーを守る方法(fail2banのススメ)

投稿2016/10/10 11:46

編集2016/10/10 11:46
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tanpopochan

2016/10/11 05:28

お知恵をお貸し下さり、ありがとうございます。 サーバのroot権限を持っていないため、ご教示頂いたfail2banを利用する事は出来ませんがサーバの移動も考え、運営を続けていきます。 ありがとうございました。
guest

0

ツールで更新しているユーザに、ボタンを無効にする対策はほとんど意味が無いです。
やはりサーバサイドで何らかの対策が必要になります。
並び順が必ずしも更新順である必要がなければランダムにするというのも1つの手かと。

投稿2016/10/10 11:21

fromageblanc

総合スコア2724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tanpopochan

2016/10/11 05:13

お知恵をお貸し下さりありがとうございます。 ボタンを無効にすればクリックできないし更新できなくなる、と考えたのですが…甘い考えでした。 更新順表示をやめランダム表示とする事も視野に入れ、検討を続けて参ります。 ありがとうございました。
guest

0

ベストアンサー

今回のケースでは、案1でも案2でもJavascroptで実装することについては「全く」効果がないと思われます。

通常、自動で更新処理を行うような場合、Javascriptは評価せず、直接POSTするようなケースが多いためです。

更新のタイミングでファイルなりDBなりに最終更新時間とユーザIDを保存しておき、2回目以降の更新では前回の更新時間との差分を確認し、更新が早すぎたらエラーをするような処理をサーバサイド(更新を行っている部分のperl)で実装するのが一般的かと思います。

投稿2016/10/10 11:11

tanat

総合スコア18713

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/10/10 11:33

その実装の場合、更新されないだけでサーバーに同じ程度負荷がかかりますよ。
tanat

2016/10/10 11:44

一般的に更新処理はとても重いので、更新前にその可否のチェックをかけることで処理は確実に軽くなります。 また、本データの更新が穏やかになる事で、表示順ソートにおいてクエリキャッシュが効く(実装次第です)様になるので、全体データ表示も軽くなることが期待されますね。
tanat

2016/10/10 11:49

更新処理に辿り着く前に、画像認証や2段階認証を使ってツールによる自動化を出来なくするのも効果的だとは思われますが、この方法はツールでの突破が不可能になるわけではないので、この場合でもサーバサイドで何らかの制限を行うことが必須になります。
tanpopochan

2016/10/11 05:09

お知恵をお貸し下さり、ありがとうございます。 formからの<input type="submit">を使った送信ボタンを一度クリックするとその後数時間クリックできなくなる=送信できなくなればいいかと考えておりましたが 直接POSTする様なツールを使っている場合もある、という事なのですね。 その場合、例えばcookieを利用して会員のIPアドレスを取り、同じIPアドレスでの更新が続いた場合に「一定の時間をおいてください」等のメッセージを表示させる、という事でも同じ様にPOSTされてしまいますでしょうか? 度々申し訳ありません。
tanat

2016/10/11 07:29

そうですね。ツールを使ってる場合、 フォームを表示しているページで何を行っているかは関係無いので、 極端な話、フォームの表示ページは存在しなくても問題ありません。 そのため、 更新処理のPOST先(<form action=xxxのxxx部分)のスクリプトで対応する必要があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問