2016-04-27 3 views
0

Ich erstelle eine E-Commerce-Website für meine Projektarbeit. In dem ich eine application.cfm Seite erstellt, den Code von this tutorial mit:So erstellen Sie eine Anmeldung nur für Mitgliederbereich

<!--- Create the application ---> 
     <cfapplication name="MyApp" 
      clientmanagement="Yes" 
      sessionmanagement="Yes" 
      sessiontimeout="#CreateTimeSpan(0,0,0,10)#" 
      applicationtimeout="#CreateTimeSpan(0,0,0,10)#" /> 

     <!--- Now define that this user is logged out by default ---> 
     <CFPARAM NAME="session.allowin" DEFAULT="false" /> 

     <!--- Now define this user id to zero by default, this will be used later on to access specific information about this user. ---> 
     <CFPARAM NAME="session.user_id" DEFAULT="0" /> 

     <!--- Now if the variable "session.allowin" does not equal true, send user to the login page ---> 
     <!--- the other thing you must check for is if the page calling this application.cfm is the "login.cfm" page and the "Login_process.cfm" page since the Application.cfm is always called, if this is not checked the application will simply Loop over and over. To check that, you do the following call ---> 

     <cfif session.allowin neq "true"> 
      <cfif ListLast(CGI.SCRIPT_NAME, "/") EQ "loginn.cfm"> 
      <cfelseif ListLast(CGI.SCRIPT_NAME, "/") EQ "login_process.cfm"> 
      <cfelse> 
       <!--- this user is not logged in, alert user and redirect to the login.cfm page ---> 
       <script> 
        alert("You must login to access this area!"); 
        self.location="loginn.cfm"; 
       </script> 
      </cfif> 
     </cfif> 

Dies ist die Login_process.cfm Seite:

<!--- Get all records from the database that match this users credentials ---> 
    <cfquery name="qVerify" datasource="cfdb2"> 
     SELECT User_name, User_pass 
     FROM uid_pass 
     WHERE User_name = '#name#' 
    and User_pass='#pass#' 
    </cfquery> 

    <cfif qVerify.RecordCount> 
     <!--- This user has logged in correctly, change the value of the session.allowin value ---> 
      <cfset session.allowin = "True" /> 

     <cfset session.User_name = qVerify.User_name /> 

     <!--- Now welcome user and redirect to "<strong>members_only.cfm</strong>" ---> 
     <script> 
      alert("Welcome user, you have been successfully logged in!"); 
      self.location="index.cfm"; 
     </script> 
    < cfelse> 
     <!--- this user did not log in correctly, alert and redirect to the login page ---> 
     <script> 
      alert("Your credentials could not be verified, please try again!!!"); 
      self.location="Javascript:history.go(-1)"; 
     </script> 
    </cfif> 

Das Problem, das ich mit dem Code bin vor, wenn ich Öffnen Sie die Indexseite, die mich zur Anmeldung auffordert. Ohne mich einzuloggen, kann ich nicht fortfahren. Wenn ich die Seite registration.cfm direkt öffne, passiert das Gleiche. Wie kann ich den Code so strukturieren, dass ein Gast auf Dinge zugreifen kann, aber sich anmelden muss, wenn er die Option "In den Warenkorb" verwendet.

+0

Beenden Sie mit Application.cfm, verwenden Sie Application.cfc. –

Antwort

1

Sie müssen also ‚weiße Liste‘ jede Seite, die in etwas, ohne angemeldet zugegriffen werden kann wie:.

<cfif session.allowin neq "true"> 
    <!--- check if this is a page that doesn't require authentication ---> 
    <cfset currentScript = ListLast(CGI.SCRIPT_NAME, "/")> 
    <cfif listFindNoCase("login.cfm,registration.cfm,login_process.cfm", currentScript) eq 0> 
     <!--- redirect to login.cfm page ---> 
     <cflocation addtoken="false" href="login.cfm"> 
    </cfif> 
</cfif> 

ich feststellen, dass Sie Application.cfm verwenden, eigentlich sollte man Application.cfc verwenden werden . Dann können Sie den Anwendungslebenszyklus nutzen. Ihre Sicherheitsprüfungen können in der onRequestStart Methode erfolgen, Sie können Sitzungen in der onSessionStart Methode usw. einrichten.

Verwenden Sie immer cfqueryparam in Abfragen, um sich vor SQL-Injection-Angriffen zu schützen. Etwas wie:

<cfquery name="qVerify" datasource="cfdb2"> 
    SELECT User_name, User_pass 
    FROM uid_pass 
    WHERE User_name = <cfqueryparam value="#name#" cfsqltype="cf_sql_varchar"> 
     and User_pass = <cfqueryparam value="#pass#" cfsqltype="cf_sql_varchar"> 
</cfquery> 

ich auch würde vorschlagen, dass Sie sich auf die Speicherung von Kennwörtern nachlesen, wie aus dem Code sieht es aus wie Sie Ihre Passwörter in der Datenbank in unverschlüsselt speichern - das ist schlecht. Sie möchten sich die Einweg-Passwortverschlüsselung ansehen.

Verwandte Themen