1

次のようなデータ行がある場合:

1, 2, 3

すべての列の合計であるチェックサム値 1 + 2 + 3 = 6 を作成できます。この値を 4 番目の列の行に格納できます。

1, 2, 3, 6

次に、列の合計がチェックサム値と一致しない場合に、列の値が誤って変更されていないかどうかを確認するプログラムを作成できます。

さて、これをさらに一歩進めたいと思います。前に説明したように、データの最後の列が前の列の合計である、誰でも読み取り/書き込みアクセスできる値のテーブルがあるとします。

1, 2, 3, 6

誰かがこっそりと 3 番目の列の値を変更したいとします。

1, 2, 9, 6

チェックサムは簡単に再現できるため、この行が改ざんされていないように見えるように、チェックサム値を 1 + 2 + 9 = 12 に変更するだけです。

1, 2, 9, 12

ここで私の質問は、より洗練されたチェックサム値を作成して、卑劣な個人がチェックサムを無効にせずにこの種の変更を行うことができないようにするにはどうすればよいかということです。おそらく、行の最初の 3 つの値を指定して、次のようなもう少し洗練されたチェックサムを与えることができるブラックボックス exe を作成できます。

a^2 + b^2 + c^2

しかし、このロジックは卑劣なユーザーには知られていませんが、値をブラック ボックス exe に入力して、有効なチェックサムを取得することができます。

テーブル内のすべての行が改ざんされていないことを確認する方法についてのアイデアはありますか? 私が回避しようとしている方法は、作成中のプログラムを使用して正当に変更されるたびにテーブルのコピーを保存することです。これは可能ですが、非常に洗練されていない解決策のようです。もっと良い方法があるはずですよね?

4

4 に答える 4

1

ユーザーは、テーブルへの無制限の書き込みアクセス権を持つべきではありません。一般的な CRUD 操作用に sproc を作成することをお勧めします。これにより、どのフィールドを変更できるかを制御できるようになり、主張する場合は、CRC()チェックサムまたはその他の検証を更新できます。

これは大きなプロジェクトになるため、現時点では実用的ではないかもしれませんが、これが実行されるべき方法です。

于 2013-01-10T22:20:15.687 に答える
1

「プログラムを実行しているユーザーに異なるセキュリティ許可のセットを与えるにはどうすればよいですか?」と尋ねているようです。これを行う方法は、プログラムがユーザーとは異なるセキュリティ コンテキストで実行されていることを確認することです。これを行う方法は、プラットフォームによって異なります。

複数のマシンがある場合は、クライアント サーバー アーキテクチャを実行すると役立ちます。サーバーを介して制御された API を公開し、データベースのセキュリティ資格情報を持っています。そうすれば、ユーザーは任意のリクエストを行うことができなくなります。

あなたがクライアント マシンの管理者であり、ユーザーがそうでない場合、別のプロセスで同様のことを実行できる場合があります。たとえば、UNIX のデーモン。Windows の DCOM では、このようなことができると思います。

もう 1 つの方法は、ストアド プロシージャを介して API を公開し、テーブルへの直接アクセスではなく、ストアド プロシージャへのアクセスのみを許可することです。

限定された API へのアクセスを制御するだけでは不十分な場合があります。たとえば、ゲームのハイスコアを格納するテーブルを考えてみましょう。ClaimHighScoreユーザーが任意の値を入力できるのであれば、APIを介してのみアクセスできることは問題ではありません。ゲームでのこれの解決策は通常複雑です。私が聞いた唯一のアプローチは、ゲームの初期状態を与えるシード値と、タイムスタンプ付きの一連の入力に関して API を定義することです。次に、サーバーは基本的にゲームをシミュレートしてスコアを検証する必要があります。

于 2013-01-10T20:44:52.070 に答える
1

基本的な計算を使用すると、チェックサムが無効になります:

a^2 +b^2 +c^2  

a=0,b=0,c=2  = checksum 4
a=2,b=0,c=0  = checksum 4

ユーザーに一連の「読み取り専用」データが必要な場合は、マテリアライズド ビューの使用を検討してください。具体化されたビューは、計算を事前に計算します。つまり、有効なデータを計算し、それをユーザーに提供しますが、プログラムはバックグラウンドで変更を行うことができます。

さらに、これが特権が存在する理由です。たとえば、読み取り専用アクセスなどのデータベースを変更できないアカウントのみを提供すると、誰かがデータを改ざんする問題が軽減されます。また、悪意のあるユーザーがデータを改ざんするのを完全に防ぐことはできません。一時的に退屈したりブロックされたりすることを期待して、悪意のあるユーザーがいくつかのフープを飛び越えるだけです。

セキュリティの特効薬はありません。できることは、次の機能で構成される多層防御の考え方を使用することです。

広範なロギング、
責任の分担、
ジョブ ローテーション、
パッチ管理、
ログの監査 (ロギングと併用しますが、実際には誰かがログを読み取る必要があります)、
HIPS システム (ホスト侵入防止システム) の実装
、データベースへの外部接続の拒否

リストは非常に広範囲に及ぶ可能性があります。

于 2013-01-10T20:10:04.117 に答える
0

あなたの質問はデータベースへの悪意のあるエントリに基づいていますが、MOD11を使用すると、不正確な値や間違った値を見つけることができます。

次の MySQL ステートメントとSQLfiddleはこれを示しています。

SELECT id, col1, col2, col3, col4, checknum,
9 - MOD(((col1*5)+(col2*4)+(col3*3)+(col4*2) ),9) 
AS Test FROM  `modtest` HAVING checknum =Test
于 2013-01-10T22:53:00.177 に答える