ホームページ >バックエンド開発 >PHPチュートリアル >専門家にアドバイスを求める: PHP 投稿経由で質問を送信する

専門家にアドバイスを求める: PHP 投稿経由で質問を送信する

WBOY
WBOYオリジナル
2016-06-23 14:20:08945ブラウズ

php 投稿投稿

Xiaoxia がプログラムを作成しました。Ajax テクノロジーを使用してバックグラウンド PHP の実行プロセスを呼び出し、データベースを Mysql に書き込む機能を実現しました。
その後、一部のユーザーが URL を通じてパラメータを直接つなぎ合わせ、URL 入力メソッドを通じて php の実行プロセスを手動で呼び出していたことが判明しました。
質問 1: URL を介したバックエンドへの直接手動送信を禁止する良い方法はありますか?
いくつかのヘルプを確認しましたが、一般的な考え方は、送信前に、時間 t を通じてバックグラウンドに送信して、対応する暗号化キー値 k1 を取得します。
正式な送信中に、t と k1 の両方を送信すると、バックグラウンドで再暗号化されます。 tを求めてk2を取得し、k1とk2が同じであればデータベースへの書き込み処理を実行する。
質問 2: この方法では、キー値 k1 を取得する処理が追加されます。k1 を取得しない場合よりも明らかに時間がかかります。それを回避する方法はありますか?
質問 3: 暗号化されたキー値 k1 を取得するプロセスが、他のユーザーによって URL を通じてバックグラウンドで直接手動で呼び出されないようにするにはどうすればよいですか?
アドバイスをお願いします!
よろしくお願いします!


ディスカッションに返信(解決策)

これが私がいつもやることです

特定のコード

それから、これ以上はありません。最後の "?>" を削除するだけです。 direct 送信されたページは、構文エラーのため実行されません

これが私が通常行うことです

特定のコード

それから、これ以上はありません。最後の "?>" を削除するだけです。 direct 送信されたページは文法エラーのため実行されません
-------
この解決策は少し「フォークレシピ」です。 。 。 ,
ご返信誠にありがとうございます!

正直に言うと、B/S アーキテクチャでは、サーバーが受信したデータが必要なブラウザーから送信されることを避けるのは困難です。結局のところ、サーバーはクライアントが要求するページを提供して開始するだけです。リクエストを受信した後に実行されます。セッション認証を使用したログインさえもシミュレートできるため、受信したデータが戻るページによって生成されている必要があることを保証するのは困難です、少なくとも私はその方法を思いつきませんでした(笑)。
フォームに非表示を追加し、非表示の値を検証することで判断することをお勧めします (元の投稿者が言及した方法と同様) が、これらの方法でもシミュレーションは可能であり、スキルの低い人のみを防ぐことができます。

結局のところ、インターフェイスはルールに準拠して呼び出されるように書かれているので、できるだけ安全に記述するようにしてください。インターフェース..

書き方については?>xuzuning エディターは、これがより標準化された適切な書き方であると言っていますが、PHP は最後の行の後のすべての改行とスペースを自動的に削除します。元の投稿者の質問には効果的です

悪意のある意図を防ぐためにセッションを使用します データの挿入、具体的な方法: http://www.ibihuo.com/show-60.html

バックエンドはログインを必要としませんか?

anglegz さんへ: あなたは私の疑問に高いレベルから答えてくれましたが、私のアプリケーションはすべて B/S であり、現時点ではそれらを B/C に変更することは不可能です。
anyilaoliu さんへ: より安全なインターフェースを書くことが解決策であり、ユーザーURL による送信の本質は、ajax チェックステップをスキップしてバックエンドに直接送信することです。
ログインする必要があります。 現在、ログインしているユーザーです (ログインしていないと送信できません)。ログイン)、同じマシン上で別の同一のブラウザを開き、アドレス バーに不正なデータを手動で送信します。
y244360439 へ: 「次に、この値をセッションに保存します。$_SESSEION['hash'] = $hash;
」というリンクで、セッションを書き込むためのストアド プロシージャがユーザーのみによって呼び出されないようにするにはどうすればよいですか?私の理解では、セッションを作成するプロセスはパラメーターを使用して送信することもできますが、これはアドレスバーで手動で送信することもできます。
皆さんありがとうございます。他に何か提案はありますか?

フロントデスクでの js の使用に関する制限と判断は、PHP で再度判断する必要があります。そうしないと、js の検証をバイパスすると言われたときに悲劇が起こります

js を使用してくださいフロントにて PHPで再度制限や判定をしなければjs検証を回避したと言う時点で悲惨なことになります

---------------------- ------ ---------------
バックグラウンドで再度判定を行う場合は、さらに多くのパラメータを判定・制限用の変数として渡す必要があります。この投稿のプロセスでは、URL を手動で入力することで入力変数を改ざんする別の方法を紹介します。おい、まだ抜け穴があるじゃないか!


フロントエンドでjsで行った制限や判定をPHPで再度判定しなければjsの検証をバイパスしたと言う時点で悲惨なことになります
-------------- - ------------------------
バックグラウンドで再度判定を行う場合、判定用の変数としてさらに多くのパラメータを渡す必要があり、制限。この投稿のプロセスでは、URL を手動で入力することで入力変数を改ざんする別の方法を紹介します。おい、まだ抜け道があるんじゃないのか!?





手動で入力した変数が要件を満たしていれば、心配する必要はありませんね



フロントエンドでの制限と判断は必要ですPHP で判断されるようにする そうでないと、この JS 検証を回避する方法を言うと悲劇になるでしょう
---------------------------- ---- ----
バックグラウンドで再度判定を行う場合は、判定・制限用の変数としてさらに多くのパラメータを渡す必要があります。この投稿のプロセスでは、URL を手動で入力することで入力変数を改ざんする別の方法を紹介します。ねぇ、まだ抜け穴があるんじゃないですか





手動で入力した変数が要件を満たしていれば、心配する必要はありません
---------------- -- ------------------
手動で入力した変数はすべて要件を満たしているため、問題ありません。問題は、ユーザーが「違法な」データを送信することです。

親愛なる皆さん、抜け穴のない解決策はありますか?
私の現在の判断によれば、ユーザーはすでに「隠し」変数の値を取得できます。

もちろん、隠されたデータは dom ノード内にあります。それが違法であるかどうかは、どのように判断すればよいでしょうか。

もちろん dom ノードに手動で隠すこともできます

ユーザーが「違法」データを送信した場合、それが違法である可能性があるため、どうやって判断しますか?判断されたのであれば、判断後に執行を続行しなくても十分です。 ..

--------------------
その後のデータの手動分析により、「違法」という結論に達しました。 。
おっしゃるとおり、既存のjs検査と「提出されたデータ値」の判定をもとに、再度PHP上で該当する検証が行われるとのことです。この解決策は、フロントエンドのパラメータ変数をデータベースに直接送信するのではなく、バックグラウンドで既存のデータに基づいてフロントエンドの判断に使用するパラメータ変数を再導出できるという前提条件があります。使用するために。
この方法は試してみる価値があります!この方法では、セッションに暗号化キーの値を記録する必要はありません。

データベースに直接入力しないでください。データベースに入力する前に、インジェクション攻撃を引き起こす可能性のあるコードが存在するかどうかを確認してください。

個人的なテスト ステーションでない限り、データベースに直接入力することはできません。あなたは私の疑問に高いレベルで答えてくれましたが、私のアプリケーションはすべてB/Sであり、現時点ではそれらをB/Cに変更することは不可能です。

より安全なインターフェイスを書くことが解決策です。 ユーザーマニュアルのURL。送信するには、ajax チェックのステップをスキップして、
に ahui_lcm を直接送信します。ログインする必要があります。現在、ログインしているユーザーです (ログインせずに送信することはできません)。同じマシンにアクセスし、アドレス バーに不正なデータを手動で送信します。
y244360439 へ: 「次に、この値をセッションに保存します。$_SESSEION['hash'] = $hash;

」というリンクで、セッションを書き込むためのストアド プロシージャがユーザーのみによって呼び出されないようにするにはどうすればよいですか?私の理解では、セッションを作成するプロセスはパラメーターを使用して送信することもできますが、これはアドレスバーで手動で送信することもできます。

皆さん、他に何か提案はありますか? セッションはバックグラウンドでランダムに生成され、ユーザーによって干渉されません。これが原則です。現在これを行う良い方法はありません。バックグラウンドでそれを制限するにはどうすればよいですか? アドレス バー上のこのような一般的な csrf パラメータはすべて有効です。 $_POST ?プログラムで $_POST を使用して、フォームからデータを受け取ります。アドレスバーを使用してパラメータを直接入力した場合、$_POST は受信されますか?

シミュレーションはもう一つの要件であり、完全な防止は不可能です。

難易度を上げても大丈夫です。と要件

これは私が通常行うことです

特定のコード

それから、これ以上はありません。最後の "?>" を削除するだけです。そうすれば、直接送信されたページは文法上の理由でブロックされます。エラー 実行できません

わかりません

to y244360439: セッションはバックグラウンドでランダムに生成され、ユーザーによって干渉されることはありません。Discuz の操作の多くは、この方法を使用しています。これが原則です
----------- - ---------------
同様のリファレンスを探したかったのですが、
SWFUpload のソース コードしか見つかりませんでした。その処理は次のとおりです。
1) フロントの JS 内の URL -end 呼び出しページ パラメーターの割り当て: "PHPSESSID" : ""
2) バックグラウンド実行スクリプトで sessionid を確認して割り当てます:
// セッション Cookie の回避策のコード
if ( isset($_POST ["PHPSESSID"])) {
session_id($_POST["PHPSESSID"])
} else if (isset($_GET["PHPSESSID"])) {
session_id($_GET["PHPSESSID" ]);
}
JS で「session storage, $_SESSEION['hash'] = $hash」を実装する方法がわかりませんでした。その方法について教えていただけますか?動作しない場合は、Discuz のソース コードをダウンロードして考えてください。
ahui_lcm へ: 送信されたコードを確認すると、変数は $_REQUEST[‘xxx’] を通じて取得されます。後で $_POST を変更すると、コードが大幅に改善されるはずです。私は今勉強して販売している中途半端な人間ですが、ベストがありません:)

さらに詳しい説明については、理解できない場合は、ウェブサイトで質問してください。 ://www.ibihuo.com/show-60.html

独自の暗号化および復号化レターを作成できます。例:
ajax submit to a URL http://localhost/a.php?key=REWTR54365EY&val=? ?

キーの値は php を使用します。暗号化関数は暗号化されたコンテンツです (例: カスタム暗号化関数 (「送信される結果」))。それを a.php に送信した後、復号化関数を使用します。キーの値を取得して (送信する結果と結合して)、この送信の要件を満たしているかどうかを確認します

実際、暗号化キーを使用して、承認ページでキーを復号化して確認します。

$_SERVER["HTTP_REFERER"] を使用して、それが自分のページからのものであるかどうかを確認します。 $_SERVER["HTTP_REFERER"] の偽造は違法です。技術的に壊れないものはありません。

さらに詳しい説明については、もう一度読んでください。理解できない場合は、ウェブサイト http://www.ibihuo.com/show-60.html で質問してください。 ------ -----------------------------
教えていただいた暗号化と復号化の方法を試してみます。 Ajax 経由で暗号化された変数データを送信します: "hash="+hash" ですが、クライアントがバックグラウンド PHP によって生成された $hash 値を取得する良い方法がありません (フロント デスクと呼び出されたバックグラウンドが分かれています)。 2 つの異なるファイルに分割されます)。現状では、バックグラウンドPHPで生成される$hash値を取得するメソッドもajaxのみで呼び出されているため、この取得処理が送信効率を低下させたり、機密漏洩の可能性があると個人的に感じています。
$_SESSEION['hash'] がフロントでどのように取得されるのか詳しく教えていただけますか?素晴らしい!


1. URL パラメーターを無効にするための送信を受け入れる場合のみ、$_POST を使用します。

2. Cookie に識別語 (セッション ID を含む) を挿入します。ただし、Cookie は簡単に取得できるため、安全性は保証できません
3. js を使用して送信します (識別語を動的に追加することを含む)。通常、ツールは js を実行しないため、状況は多少改善されます。ただし、手動追跡後の通信介入を排除することはできません

1. $_POST のみを使用して送信を受け入れます。これにより、URL パラメータが無効になる可能性があります

2. Cookie に識別語 (セッション ID を含む) を挿入します。ただし、Cookie は簡単に取得できるため、安全性は保証できません
3. js を使用して送信します (識別語を動的に追加することを含む)。通常、ツールは js を実行しないため、状況は多少改善されます。ただし、手動追跡後のコミュニケーション介入の可能性は排除できません
-------------------------------------- -
1. URL パラメータを無効にするための送信を受け入れるには、$_POST のみを使用します
----> 先ほど ahui_lcm で述べたように、これは修正されており、不正な手動アドレス入力に対処するのに確かに効果的です。
2. Cookie に識別ワード (セッション ID を含む) を挿入します。ただし、Cookie は簡単に取得できるため、セキュリティを確保できません。
----> セキュリティは保証されませんが、侵害される可能性は高くなります。
3. js を使用して送信します (識別単語を動的に追加することを含む)。
----> 確認コードの識別方法を追加することを検討しましたが、ユーザーの操作が 1 つ増えてユーザー エクスペリエンスに影響を与えると感じました。
ブレーンストーミング、ご返信ありがとうございます!

1. URL パラメータを無効にするための送信を受け入れる場合にのみ、$_POST を使用します。
2. Cookie に識別語 (セッション ID を含む) を挿入します。ただし、Cookie は簡単に取得できるため、安全性は保証できません
3. js を使用して送信します (識別語を動的に追加することを含む)。通常、ツールは js を実行しないため、状況は多少改善されます。しかし、手動追跡後のコミュニケーション介入を排除することはできません

私は PHP の初心者です。項目 2 と 3 が何を意味するのか、モデレーターに詳しく説明してもらえますか?


さらに詳しい説明については、もう一度読んでください。理解できない場合は、ウェブサイト http://www.ibihuo.com/show-60.html で質問してください。 ----- ----------------------------------
暗号化と復号化方法を試してみますあなたが言及したように、Ajax data: "hash="+hash" を介して暗号化された変数を送信しますが、クライアントがバックグラウンド PHP (私のフロントデスクと背景と呼ばれるファイルは 2 つの異なるファイルに分割されています)。現状では、バックグラウンドPHPで生成される$hash値を取得するメソッドもajaxのみで呼び出されているため、この取得処理が送信効率を低下させたり、機密漏洩の可能性があると個人的に感じています。
$_SESSEION['hash'] がフロントでどのように取得されるのか詳しく教えていただけますか?素晴らしい!

テンプレート エンジンを通じてフロントエンド テンプレートにハッシュ値を支払います

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。