HTTPパラメータのエンコード/難読化
-
26-09-2019 - |
質問
私たちは現在、非常に単純な Web アプリを開発中です。 「難読化する」 (適切な用語は何でしょうか?)または何らかの方法でリクエストパラメータをエンコードすることで、アイドル状態のユーザーが任意のデータを送信する可能性を減らすことができます。
たとえば、URL は次のようになります /webapp?user=Oscar&count=3
次のようなものにしたいと考えています。 /webapp?data=EDZhjgzzkjhGZKJHGZIUYZT
そして、その値を実際のリクエスト情報とともにサーバーでデコードします。
このようなことを自分たちで実装する前に(そしておそらく間違ったことをしている)、これを行うための何かがすでにあるかどうか知りたいと思いますか?
サーバー上に Java があり、クライアント上に JavaScript があります。
解決
いいえ、これはやめてください。サーバーに返送されるデータを難読化する何かをクライアント コードに構築できれば、意図的なハッカーもそれを行うことができます。公式クライアントが何をするとしても、サーバーに送信されるデータを信頼することはできません。 クライアントデータをエスケープし、サーバー側のホワイトリストと照合して検証することに固執します。. 。SSL を使用し、可能であればリクエスト パラメータを GET ではなく POST に入れます。
拡張編集
あなたの混乱は、標準的なセキュリティ対策を実装する必要がある中で、ユーザーによるリクエスト データの改ざんをブロックするという目標から生じています。Web アプリケーションの標準的なセキュリティ対策には、認証、権限とセッションの管理、監査証跡、データ検証、安全な通信チャネルを組み合わせて使用することが含まれます。
SSL を使用しても、クライアントによるデータの改ざんは防止できませんが、仲介者によるデータの閲覧や改ざんは防止できます。また、行儀の良いブラウザに対して、URL 履歴に機密データをキャッシュしないよう指示します。
認証がなく、GET 内でそれを直接制御するリクエスト パラメータを渡す、ある種の単純な Web アプリケーションがあるようです。したがって、技術に詳しくない人ならおそらくそれを理解できるでしょう。 user=WorkerBee
単に次のように変更できます user=Boss
ブラウザ バーに表示されるため、表示すべきではないデータにアクセスしたり、してはいけないことを実行したりする可能性があります。 これらのパラメータを難読化したいというあなたの願望 (または顧客の願望) は単純です。技術にあまり精通していない人を挫折させるだけだからです。これは中途半端な対策であり、既存の解決策が見つからないのは、それが良いアプローチではないからです。. 。監査証跡を備えた適切な認証システムの実装に時間を費やしたほうがよいでしょう (実際にこれを行う場合は、マークを付けてください) ゲイリーの答え 正しいとおりです)。
最後に、次のようにまとめます。
他のヒント
があります。プライベート暗号化キーを作成し、アプリケーションサーバー側に保存します。アプリケーションは、URLを生成するたびに、あなたの秘密の暗号化キーを使用して、URLのハッシュを作成し、クエリ文字列でそのハッシュを置きます。ユーザーがURLにパラメータを指定してページを要求するたびに、ハッシュを再計算し、それが一致するかどうかを確認します。これは、アプリケーションがURLを計算することをあなたにいくつかの確信が得られます。それは読みやすいけれども、あなたのクエリ文字列パラメータを残します。擬似コードで、
SALT = "so9dnfi3i21nwpsodjf";
function computeUrl(url) {
return url + "&hash=" + md5(url + SALT );
}
function checkUrl(url) {
hash = /&hash=(.+)/.match(url);
oldUrl = url.strip(/&hash=.+/);
return md5(oldUrl + SALT ) == hash;
}
あなたはデータへのアクセスを制限しようとしている場合は、認証キーのシングルサインオンを提供するクッキーとログインメカニズムのいくつかの種類を使用します。クライアントがキーとクッキーを送信した場合、彼らは自分のアカウント(管理者、パブリックユーザーなど)に関連した当局に合わせてデータを操作することができます。ただ、Javaでこれを使用して簡単に実装するために春のセキュリティ、CASなどを見てください。クッキーで提供トークンは通常発行サーバの秘密鍵で暗号化し、一般的に改ざん証明されている。
あなたが公共の利用者(認証されていないが)あなたのサイトにいくつかのデータをポストすることができるようにしたい場合は、あるいは、その後、全てのベットはオフになっています。あなたは、サーバー側で検証する必要があります。これは、特定のURIへのアクセスを制限し、必ずすべての入力が洗浄されていることを作ります。
ここでの黄金のルールは、あなたが知っているものを除き、許可しないすべてのもの、であるが安全です。の
、あなたは単にパラメータを暗号化し、またはそれらに署名することができます。これは、いくつかの塩と一緒に、URLパラメータのMD5のタックへの可能性が高い「安全は十分」です。塩は言う、セッションに保存されたランダムな文字列を指定できます。
そして、あなたができるだけます:
http://example.com/service?x=123&y=Bob&sig=ABCD1324
この手法は、(すなわち、それらはそのXYZ = 123「見る」ことができる)データを公開し、彼らはデータを変更することはできません。
ありますが、「暗号化」の利点がある(と私は緩く、その用語を使用します)。あなたはURLのパラメータ全体のセクションを暗号化する場所です。
ここであなたのような何かを行うことができます:
http://example.com/service?data=ABC1235ABC
暗号化を使用してのいいところは2倍です。
一つは、それが(例えば、彼らは、ユーザーことXYZ = 123を見ることはできません)データが保護されます。
それは拡張可能だということであるカントーその他の機能:
http://example.com/service?data=ABC1235ABC&newparm=123&otherparm=abc
ここでは、オリジナルのペイロードをデコードし、新しいデータで(安全な)マージを行うことができます。
だから、要求は単に、既存のデータを変更しないで、要求にデータを追加することができます。
あなたが署名技術を経由して同じことを行うことができ、あなただけのシングル「ブロブ」に全体の要求を統合する必要がなり、そのブロブは暗黙的に署名されています。それのは、「効果的に」だけで弱い暗号化、暗号化されます。
もちろん、あなたがクライアント上で、このいずれかを行うにはしたくありません。ても意味がありません。あなたがそれを行うことができます場合は、「彼らは」それを行うことができますし、あなたにもすべてでそれをしないことがありますので、、違いを見分けることはできません - あなたはTLS対(通常のHTTPポート経由で「暗号化」のデータにしたい場合を除き、しかし、その後の人々が賢明だろう)「なぜわざわざ」されます。
Javaの場合、すべてのこの作品は、私はそれをやった方法ですフィルター、中に入ります。バックエンドは、このから隔離されます。
あなたが希望する場合、あなたは完全にアウトバウンドフィルタでこれから分離されたバックエンドを作ることができるハンドルURLの暗号化/ウェイアウトに署名ます。
それは私がやったこともあります。
下側は、非常に右とパフォーマンスのそれを得るために関与だということです。あなたは(私はそれがRAMにしてページ全体をコピーしませんでしたので、その場でそれを行うには、ストリーミングパーサを書いた)URLを引き出すために軽量HTMLパーサが必要ます。
彼らはそれについて何も知らないとして明るい側は、コンテンツ側の全ては、「ただ働き」されます。
Javascriptを扱う際にまた、いくつかの特別な処理があります(暗号化するためにURLがあります簡単に「知っている」はありません、あなたのフィルターなど)。私は出力に簡単にそれらを見つけることができるように、特定の「VAR signedURL = 『....』」であることを署名されるURLを要求することによって、これを解決しました。ないあなたが思うかもしれないとして、設計者の負担を破砕など。
フィルタの他の明るい側は、あなたがそれを無効にすることができるということです。あなたが起こっていくつかの「奇妙な行動」を持っている場合は、単にそれをオフにしてください。行動が続く場合は、暗号化に関連するバグを発見しました。また、開発者はプレーンテキストで作業し、統合テストのための暗号化を残してみましょう。
を行うに痛みが、それは最終的には全体的に良いことです。
jCryptionような何か?
あなたは、base64または類似のものを使用してデータを符号化することができます。私はそれらをシリアル化するJSONでinself引数を符号化するでしょう。