背景
ある開発者フォーラムに登録しようとしたことがあります。 私は長い間試しましたが、管理者に呪いの供給のほとんどすべてを使用しました。 私は11回目からのみ登録し、誰かのパラノイアと戦うために多くの楽しい時間を過ごしました。
この事件の後、私は、解決時に攻撃の攻撃を引き起こさないが、ハッキングシステムを作成する人々に攻撃の攻撃を引き起こすような、ある種のアンチボットシステムを思いつきました。
研究課題
まず、キャプチャの問題に(もう一度)戻りましょう。 キャプチャの複雑さは、ノイズと歪みを追加することで実現されます。 しかし、これは両刃の剣です。ノイズと歪みを追加するほど、人がキャラクターを推測するのが難しくなるためです。 入力を間違えた場合は、最初からやり直してください。 多くの場合、推測タスクを少なくとも何らかの形で単純化するために、画像を数回更新する必要があります。
現在の実装のフレームワーク内でのみ問題の解決にアプローチする場合、次のクローンを除いて、何もできません。 そして、このクローンには、「親」の遺伝的問題がすべてあります。 私のルールの1つは次のようなものです。「簡単な方法で問題を解決できない場合は、簡単な方法で解決されるようにタスクの条件を変更する必要があります。」
なぜキャプチャが必要なのですか? サーバーへのデータの自動送信を排除します。 ユーザーは何でそれをしますか? フォームを使用します。 しかし、フォームを同じキャプチャにするとどうなりますか?
フォームは、名前付きフィールドのコレクションです。 ノードツリー内の要素の位置を安全に計算し、フィールドをマップし、マッピングに従ってサーバーにデータを送信できるため、フィールド名をabracadabraに置き換えても何も起こりません。 問題は解決しませんが、考えをさらに発展させます。 コード化された名前を持つフィールドをランダムな順序で並べます。 フォームに入力する前に、ユーザーは最初にフィールドの正しい順序を復元してから、フォームに入力して送信します。 このキャプチャの謎は、正しいフィールド順序を取得することです。 順序が正しいことを確認する方法は? フィールドの名前と入力フィールド自体に画像、色、形状などをマークし、アルゴリズムを使用してパズルを組み立てるようにタスクを設定できます。
アルゴリズム
まず、通常のフィールド名の配列を参照順に作成します。 抽象言語を使用して説明します。
formData = [ { name: "first_name" }, { name: "last_name" }, { name: "nick" } ]
名前に基づいて作成されるハッシュを構造に追加し、後で役立つインデックスを追加します。
formData = [
{
name: "first_name",
hash: "0947fh27",
index: 0
},
{
name: "last_name",
hash: "82jj2n4lE2",
index: 1
},
{
name: "nick",
hash: "jf12sjfjI9",
index: 2
}
]
次に、位置が正しくない3つの不正なアレイを作成します。 これをインデックスに単純化します。
fake = [ [ 2, 1, 0 ], [ 2, 0, 1 ], [ 1, 0, 2 ] ]
そして、中央に正しい位置の通常の配列を追加します。 これが最初の場所にないことが重要です。そうすれば、送信する前に何かをする必要があることを理解できます。 はい、誤検知を減らすことができます。
fake = [ [ 2, 1, 0 ], [ 2, 0, 1 ], [ 0, 1, 2 ] , [ 1, 0, 2 ] ]
これはすべて良いですが、今パズルを作る方法? デモンストレーションのために、異なる色の幾何学図形を使用したシンプルなパズルを選びました。 あなたは彼らの半分を収集する必要があります。 通常のデータに、ランダムな数字の半分を追加し、最初の偽配列のインデックスに従ってペアを配置しました。
formData = [
{
name: "first_name",
hash: "0947fh27",
index: 0,
picture: "red_circle_left"
},
{
name: "last_name",
hash: "82jj2n4lE2",
index: 1,
picture: "yellow_triangle_left"
},
{
name: "nick",
hash: "jf12sjfjI9",
index: 2,
picture: "green_circle_left"
}
]
fake [0] = [
{
hash: "jf12sjfjI9",
index: 2,
picture: "green_circle_right"
}
{
hash: "82jj2n4lE2",
index: 1,
picture: "yellow_triangle_right"
},
{
hash: "0947fh27",
index: 0,
picture: "red_circle_right"
}
]
これらの構造をセッションに保存し、HTMLパーツの形成を開始します。 グラフィックを描画するために、私はcssクラスを使用しました。これは、ハッシュではなくインデックスによって画像へのリンクの背景として指定したため、クラッカーに本当の順序についてのヒントはありませんでした。
次のような結果になりました。
.lp0 { background: url( /img/get/?type=l&pos=0) ... }
.lp1 { background: url( /img/get/?type=l&pos=1) ... }
.lp2 { background: url( /img/get/?type=l&pos=2) ... }
.rp0 { background: url( /img/get/?type=r&pos=0) ... }
.rp1 { background: url( /img/get/?type=r&pos=1) ... }
.rp2 { background: url( /img/get/?type=r&pos=2) ... }
スクリプトはセッションからデータを読み取り、通常の配列のフィールドのテキスト記述(type = l)の画像名と、混合配列のフィールド(type = r)の画像名を表示します。
ノードのクラスが左と右の両方の部分で通常の順序で配置されている間、通常の順序でフィールドのテキスト記述とフィールド自体を偽の配列で左の部分を描画します。 フィールド名はハッシュから取得されます。
さらにすべてがJSに関係します。 StateControllerを例として使用しました。これは、フィールドの循環順列の優れた仕事をし、後にデータを収集するタスクを行いました。
ユーザーはフォームを「組み立て」た後、フォームに入力できます。
ただし、フィールドが正しい順序のままになるようにする必要があります。 このためには、jsonが最適です。 必要な構造でデータを収集し、各フィールドの位置を維持し、AJAXリクエストでサーバーに送信します。
サーバーは、単一のjsonフィールドでデータを受信し、セッションから正しいデータ構造に関する「古い」レコードを取得し、ハッシュを使用して2つの配列の比較を開始します。 すべてが順調であれば、要素の値と名前がマップされ、この情報は処理のために後続の機能に送信されます。 すべてが悪い場合は、不適切な動作についてユーザーに通知し、オプションの列挙から自分自身を保護したい場合は、このIPなどから情報を受信するまでの遅延を増やして管理措置を適用します。
出来上がり!
機能デモを見る
問題
それらなしで。 最も重要なものをリストします。
- 実装の複雑さは、従来のキャプチャよりもわずかに高くなります。 統合は初心者にとって難しいでしょう。
- データの位置を保証するために、JSONのみの通常のPOSTまたはGETリクエストでデータを送信することはできません。
- 通常の方法でデータを送信する方法や、AJAXを使用しない方法は想像できません。
- オートコンプリートは暗号化されたフィールド名として機能しません。
- フォーム要素の最小数は3です。 次に、空のブレンデフィールドを導入して外に出なければなりません
セキュリティ強化方法
あなたはそれらを長い間考えることができ、私が見るように、主な方向はさまざまなジグソーパズルを作成することです。 さまざまな謎、さまざまな数字、さまざまな組み合わせの原則を並べ替えることができます。 なぞなぞのテキストをすばやく解析しないために、質問のテキストを画像の形式で作成できます。 しかし、それは別の話です...