0

ユーザーがアプリケーションにログインしたら、セッション識別子をリセットする必要があります。しかし、私は数日間試しましたが、まだ jsessionid Cookie をリセットできません。リセットした場合、サーバーはそれを認識していないようです。誰か提案やコード例を教えてください。

login.cfm がフォームを送信する login_action.cfm のコードは次のとおりです。login_action.cfm のコードは次のとおりです。

<cfcookie name="JSESSIONID" value="0" expires="now">
<cfif IsDefined('cookie.JSESSIONID')>
    <cfheader name="Set-Cookie" value="JSESSIONID=0;expires=#GetHttpTimeString(CreateODBCDateTime(now()))#;path=/;HTTPOnly;secure=true;">
</cfif>
<cfset structclear(session)>

<cfhttp url="loginverify.cfm" method="post" >
    <cfhttpparam name="username" value="#form.username#" type="formfield" ><cfhttpparam name="password" value="#form.password#" type="formfield" >
</cfhttp>
<cfset cookieval = "#MID(cfhttp.responseheader['set-cookie'][1], 12, findnocase(";", cfhttp.responseheader['set-cookie'][1])-13)#">
<cfheader name="Set-Cookie" value="#cfhttp.responseheader['set-cookie'][1]#">
<cfset cookie.jsessionid = cookieval>
<cflocation url="myfirstpage.cfm" addtoken="no">

loginverify.cfm でユーザーを認証するコードは次のとおりです。

<!--- authenticate users --->
<!--- if user passed--->
<cfset session.gooduser = true>
<cfset session.userpermission = 1>

しかし、loginverify.cfm で定義されたセッション変数が login_action.cfm で認識されないようです。

.

なにか提案を?

どうもありがとう。

4

2 に答える 2

3

あなたが達成しようとしていることの更新されたバージョンは、次の場所にあります。

12Robots.com-セッショントークンローテーションの改訂 (ウェイバックリンク)

ただし、これには、余分なセッションをクリーンアップしたり、保持したいセッションデータを引き継いだりしないという問題があります。

セッションクリーンアップあり

ユーザーのログインとセッションの無効化を同時に行うことはできません。それらのセッションを無効にしてから、次のリクエストでログインする必要があります。基本的なフローは次のようになります。

  1. ログインフォームを処理し、ユーザーが有効であることを確認します
  2. 永続化するユーザー資格情報とセッションデータを含む安全なメッセージを作成する
  3. セッションを無効にする
  4. URLに安全なメッセージを含めて、ページをそれ自体に再配置します
  5. このページリクエスト用に作成された新しいセッションで、安全なメッセージの資格情報を使用してユーザーをログインさせます

ステップ3(セッションの無効化)は次のように実行できます。

<cfscript>
    session.setMaxInactiveInterval(1);
    getPageContext().getSession().invalidate();
</cfscript>
<cfcookie name="jsessionid" expires="now">
<cfcookie name="cfid" expires="now">
<cfcookie name="cftoken" expires="now">

その後すぐにリダイレクト(cflocation)し、addtokenがfalseに設定されていることを確認します。

また、安全なメッセージが一時的なものであり、複数回使用できないことを確認する必要があります。したがって、リダイレクトの両側で追加のデータベースアクションがあります。

それはあなたが求めていることを達成するでしょうが、おそらくあなたが望んでいたほど簡単ではありません。

単純な代替

セッション固定を防ぐ別の方法は、参照のステップ2が発生しないようにすることです。

最も単純な方法として、URLにjsessionid、cftoken、またはcfidが含まれている場合は、リクエストをcfabortします。これは、アプリケーションが「キックイン」してクライアントCookieを設定または処理する前に実行する必要があります。したがって、Application.cfmではcfapplicationの前に実行され、Application.cfcでは関数の外部(つまり、「This.name」を設定した場所)で実行されます。

これをさらに進めて、セッション識別子とcflocationを安全なURLに削除することができます。これは、mod_rewriteなどを使用してWebサーバーから実行し、ColdFusionが有害なURLを認識しないようにすることもできます。

そのステップ2を実行するための追加の方法がありますが、頭に浮かぶのは、Webサーバーまたはユーザーのマシンのいずれかが危険にさらされていることです。その場合、セッション固定はどちらの心配も最小限です。

于 2012-01-21T13:05:17.320 に答える
3

このディスカッションの更新された回答を追加したかっただけです。ここでの最後のコメント以来、Adobe は CF 内で自動的にセッション固定に対処してきました。

CF10 を使用している場合、または CF 9.0.2 をインストールしている場合は、それが含まれています。

9.0.1 以前 (8.0 に戻す) を使用している場合は、それを追加するセキュリティ ホットフィックスがあります: APSB11-04 (2011 年 2 月 8 日投稿、2011 年 3 月 7 日更新)。

また、その修正の技術情報 ( http://helpx.adobe.com/coldfusion/kb/security-hotfix-coldfusion-8-8.html ) にも、セッション固定保護を無効にする回避策が記載されていることに注意してください (そして、それが適用されます)。 9.0.2 および 10 の場合も):

次の JVM プロパティを-Dcoldfusion.session.protectfixation=falseCF インスタンスの適切な jvm.config に追加 (および再起動) すると、CF はセッション固定保護を追加しない状態に戻ります (これにより、サーバーは固定攻撃に対して脆弱なままになります)。常にされて)。

もちろん、ほとんどの人は保護を望んでいるはずですが、一部のアプリケーションでは問題が発生するため (残念ながら十分に文書化されていません)、必要に応じて保護をオフにするオプションであることを知っておいてください.

于 2012-09-21T14:00:11.967 に答える