/public/register.php ## [1] "public" 登録フォーム /public/js/checkout.js ## [2] 「パブリック」決済処理 /src/register.php ## [3]「private」追加処理
経由でロード [2]require __DIR__ . '/../src/register.php';
contains [3][1] には HTML 要素が含まれます (PHP ファイル内の HTML コードとして、つまり
タグの外側に含まれます):
$secret_var
は [3] で宣言/インスタンス化されています。
[2] この JS ファイルには
が含まれています。var div = document.getElementById("secret"); var Secret_var = div.textContent; console.log(secret_var)
[3] には
が含まれています。session_start(); // 支払いパートナーの処理コード、応答 $secret_var = json_encode(array(secret_var); $_SESSION['secret_var'] = $secret_var;
$secret_var
は、$_SESSION
変数として [3] から [1] に渡され、[2] がそれを取得します。
JavaScript ファイルの console.log
ステートメントからブラウザで $secret_var
をエコーすると、null
が返されます。
src/register.php
から $secret_var
をエコーするとき (レンダリングされた registration.php
ページに表示されます)。正しい (文字列) 値があります。
$secret_var
を HTML の #secret
要素に渡すのを遅らせたり、更新された (null 以外の) 値に置き換えたりするにはどうすればよいですか?
実行順序に問題が発生したと考えてください。たとえば、が DOM に存在しないときに、[2] スクリプトが実行されました。
いいねを押す+0
返信を追加
P粉253800312
= を出力する前に、[1] に
のコンテンツなので、
checkout.js
が実行される前に公開されて既知となり、変数としてすでに存在します。要素の内容を読む必要はありません。または、window.onload
などのイベントを使用して [2] 要素の読み取りを実行します。シークレット値が変更され、それを更新する必要がある場合は、定期的に変更を確認するか、使用する前に最新の値をリクエストすることができます。
クライアントに出力するものはすべて秘密ではないことに注意してください。値を本当に保護したい場合は、サーバー側にのみ保持する必要があります。これは、支払いゲートウェイの API キーの場合には当てはまりません。など非常に重要です。サーバー側とは、シークレットをデータベースまたはセッションに保存することを意味します。その後、リモート サービスと対話する必要があるときはいつでも、PHP スクリプト (例: ajax) を呼び出してサーバー側でそのタスクを実行するだけです。これにより、シークレットの使用をサーバー側のみに分離することができ、その後、それをクライアント端末に渡すか、更新を要求します。