1

ColdFusion ログイン ページと Application.cfc ファイルを作成しました。正常に動作しているように見えますが、修正できないバグや穴が見つかりました。

その 3 ページのフォーム: ログイン ページ。日付の選択やその他の質問がある検索ページ。そして出力ページ。ユーザーがログインし、認証されます。ルックアップ ページでセッションが期限切れになった場合、ユーザーがクエリを送信しようとすると、ログイン ページに戻されます。ただし、セッションの有効期限が切れた場合、検索ページを更新するだけでログイン ページを回避できます。

どうすればこれを防ぐことができますか? コードのどこが間違っていますか? そのルックアップ ページを更新すると、ログイン ページにも誘導されるようにしたいと思います。

<cfcomponent>
    <cfset This.name = "TEST_login">
    <cfset This.Sessionmanagement="True">
    <cfset This.loginstorage="session">
    <cfset This.sessionTimeout= CreateTimespan(0,0,1,0) />

    <cferror TYPE="exception" TEMPLATE="error.cfm" MAILTO="email address">

    <cffunction name="onSessionStart">
        <cfset session.loggedIn = false>
    </cffunction>

    <cffunction name="OnRequestStart">
        <cfargument name = "request" required="true"/>

        <cfif IsDefined("Form.logout")>
            <cflogout>
        </cfif>

        <cflogin idletimeout="1200">

            <cfif NOT IsDefined("cflogin")>
                <cfinclude template="acc_hgrant_login.cfm">
                <cfabort>
            <cfelse>
                <cfif cflogin.name IS "" OR cflogin.password IS "">
                    <cfinclude template="acc_hgrant_login2.cfm">
                    <cfabort>
                <cfelse>

                    <cfquery name="loginQuery" dataSource="cfsource">
                        SELECT username, role
                        FROM users
                        WHERE
                            username = '#cflogin.name#'
                            AND password = '#cflogin.password#'
                    </cfquery>

                    <cfif loginQuery.role EQ "admin">
                        <cfloginuser name="#cflogin.name#" Password = "#cflogin.password#"
                            roles="#loginQuery.role#">

                        <cfset Session.isLoggedIn = "Yes">

                    <cfelse>

                        <cfinclude template="login3.cfm">
                        <cfabort>
                    </cfif>

                </cfif>

            </cfif>

        </cflogin>
    </cffunction>

</cfcomponent>

後続の各ページで追加します

 <cfif not isDefined("Session.isLoggedIn")>

各ページの上部にあります。

ただし、繰り返しますが、一定期間後に 2 ページ目をリロードするだけで、セッションが期限切れになった後でもセッションが再開されます。

ありがとう。

4

1 に答える 1

1

あなたの説明から、ロードされたページのコードを見ることができずに、私は問題を推測することしかできません.

問題のより完全な表現は次のとおりだと思います。

ただし、セッションの有効期限が切れた場合、ルックアップ ページを更新して「フォームを再送信しますか」に対して「はい」と答えるだけで、ログイン ページを回避できます。

これを修正する方法は、資格情報を確認してセッションを設定した後にページをリダイレクトすることです。これの簡単なバージョンは次のとおりです。

                <cfif loginQuery.role EQ "admin">
                    <cfloginuser name="#cflogin.name#" Password = "#cflogin.password#"
                        roles="#loginQuery.role#">

                    <cfset Session.isLoggedIn = "Yes">

                    <cflocation url="#CGI.SCRIPT_NAME#?#CGI.Query_STRING#" addtoken="false">

                <cfelse>

cflocationすべてのフォーム送信の処理の最後に を実行したい場合があります。最も一般的な反論の例は、ユーザーにフォームの検証の問題を修正するよう依頼する場合です。これは、フォームを再投稿すると検証ページがリロードされるだけだからです。データベースなどを更新しません。

于 2012-10-30T08:36:48.327 に答える