2

実際のデータベース更新を行うスクリプトにデータを投稿する必要があるEdit in Place jquery プラグインを使用しています。

この更新スクリプトへの URL は、HTML ソースと Firebug で簡単に表示できるため、更新が処理される前に何らかの認証チェックを追加する必要があります。これはもちろん、ユーザーが必要な古いユーザー ID / フィールド / 値を渡して、他の人のレコードをいじることができないようにするためです。

最初はユーザー名とパスワードも渡していましたが、これは GET リクエストにあるため理想的ではなく、すべて URL に含まれています。サイト自体は少なくとも SSL ですが、ベスト プラクティスとは言えません。

この種の更新を認証する最善の方法は何ですか?

FWIW、更新スクリプトは PHP にあり、Edit in Place プラグインはjeditableです。

編集:明確にするために:実際のデータペイロードはスクリプトにPOSTされますが、その場で編集するプラグインには認証のための明示的な方法がないため、URLの一部として認証を更新スクリプトに渡し、更新スクリプトはそれらの変数を取得していましたGET を介して、それらを使用して確認します。

編集 2:はい、更新スクリプトからセッション情報にアクセスできるので、以前に保存したユーザー ID を取得し、それを db update ステートメントで使用することにしました。それが最も安全な方法と思われます。

4

4 に答える 4

3

ほとんどの編集インプレースの使用は大きすぎて GET を実際に使用できないため、スクリプトを POST メソッドに切り替えるのが最善だと思います。SessionId やパスワードを URL パラメーターとして使用することは絶対に避けてください。パブリック プロフィールを表示する以外の目的でユーザー名を使用することはありません。AJAX URL が PHP ファイルの場合、GET または POST 配列で渡す必要なく、セッションにアクセスできるはずです。追加の注意として、データベースを更新する前に、すべての情報を検証してサニタイズしてください。

于 2008-10-28T01:35:32.033 に答える
2

セッションでユーザーを検索するだけでは、サイトはクロスサイトリクエストフォージェリに対して脆弱ではありませんか?

編集不可能なPOSTフィールドの値から計算されたソルトハッシュフィールドを含めると、必要なすべての情報をPOSTできます。タイムスタンプを含めると、スクリプトの再生も防ぐことができます。

例:

$(".edit_area")
  .editable("http://www.example.com/save.php", { 
    submitdata: { 
      userid: 'johnsmith',
      pageid: '123',  // or other value unique to the page
      timestamp: '1324354657',  // time when page loaded
      hash: '0bee89b07a248e27c83fc3d5951213c1' }
    // ..other settings, etc.
});

ハッシュは、たとえばのMD5である可能性があります'johnsmith$123$1324354657$' + $secret_salt。保存する前に一致することを確認してください。経過した時間が少なすぎるか多すぎる場合は、オプションで拒否します。

django-magicformsのditch-pycryptoブランチは、これをDjangoの再利用可能なForm基本クラスとして実装します。これはAJAXリクエストに直接適用することはできませんが、ドキュメントと単体テストは他の実装の良い基盤を提供するはずです。

于 2008-12-18T16:10:19.197 に答える
2

更新 (コメントと質問の更新に基づく): 次のように、ユーザー名/パスワードをsubmitdataオプションとして Jeditable に渡すことができます。

$(".edit_area")
    .editable("http://www.example.com/save.php", { 
         submitdata: { userid:'johnsmith',  passwd:'god' }
         // ..other settings, etc.
      });

迅速かつ汚い解決策 - ユーザーのプライベートを (ソースの表示を介して) プレーンテキストで公開するため、汚いソリューションです。

サーバー上のユーザーID/セッションIDにアクセスできるため、それを使用するのが最も健全なオプションです

うーん... Jeditable は GET を使用すると言うので、loadurlオプションを使用しているとしか思えません (Jeditable は$.post()変更を保存するために使用し、$.post() 常にPOST を使用するため)。

それで、Jeditable のloadtype設定を「POST」に切り替えて、以前のようにユーザー名とパスワードを送信してみましたか?

$(".edit_area")
    .editable("http://www.example.com/save.php", { 
         loadurl: 'http://www.example.com/load.php',
         loadtype: 'POST'
         // ..other settings, etc.
      });

サーバー側で標準的なユーザー/セッション処理を行わないことを考えると、それは手っ取り早い解決策のように思えます。

于 2008-10-28T01:54:23.293 に答える
-2

情報を渡すには、実際の G​​ET 文字列でセッション ID を使用する必要があります。このようにして、php スクリプトはセッションに接続し、ユーザーを検証し、ユーザーが投稿したものを編集する権限を持っているかどうかを確認できます。次に、権限がある場合は続行するか、そうでない場合はエラー メッセージを返します。

JavaScriptでセッションIDを取得できるので、あからさまに渡す必要はないと思います。

于 2008-10-28T01:25:17.157 に答える