使用Coldfusion创建登录系统

时间:2014-01-28 09:48:22

标签: coldfusion coldfusion-9 coldfusion-10 cfml cflogin

我试图创建一个管理区域,但无法使登录系统工作。我有三个部分。 login.cfm页面,login_action.cfm和app.cfc。

使用此代码并尝试登录时,它只会停留在同一页面上。

Login.cfm

<form name="fLogin" id="fLogin" action="<cfoutput>#FormAction#</cfoutput>" method="post">
  <label>Username:</label>
  <input type="text" name="username" required>
  <label>Password:</label>
  <input type="password" name="Password" required>
  <br>
  <input type="submit" id="sub" value="Login">
</form>

Login_action.cfm

<cflogin idletimeout="1800">   

<!--- SETS the action page of the login form to whatever 
      page the user was trying to go to.  Since the login 
      will actually be processed in the application.cfm file 
      (or a template included in it), then the FORM action 
      is the page that will be loaded after the login has 
      been completed. --->    

<!--- IF there IS NOT a Query String passed in the URL, 
      only the requested page name is used ---> 

<cfif CGI.QUERY_STRING IS "">       
   <cfset FormAction = #CGI.SCRIPT_NAME#>    
<cfelse>        
   <cfset FormAction = "#CGI.SCRIPT_NAME#?#CGI.QUERY_STRING#">    
</cfif>

<cfif not (isDefined("cookie.XXXX.email"))>
  <cfif NOT (IsDefined ("Form.username") AND IsDefined ("Form.Password"))>        
    <cfinclude template="login.cfm"> 
    <cfabort>
  <cfelse>
    <cfif IsDefined("Form.username")>
      <cfset username = #Form.username#>   
    </cfif>

    <CFQUERY NAME="login">            
      select * from t_admin where username = '#username#'      
    </CFQUERY>

    <cfif login.RecordCount gt 0>
      <cfif #Form.password# eq "#login.password#">
        <cfloginuser name="#username#" password="#login.password#" roles="admin">
        <cfcookie name="XXXX.email" value="#login.email#" expires="never" >
        <cfset session.userId = #login.id#>
      <cfelse>
        <cfset Invalid = "Yes">
        <cfinclude template="login.cfm">  
        <cfabort>
      </cfif> 
    </cfif>  
  </cfif>
<cfelse>
   <CFQUERY NAME="cookielogin">            
     select * from t_admin where email = '#cookie.XXX.email#'      
   </CFQUERY>

   <cfloginuser name="#cookielogin.email#" password="#cookielogin.password#" roles="admin">
   <cfset session.userId = #cookielogin.id#>
   <cfset session.email = #cookielogin.email#>
</cfif>

</cflogin>

和Application.cfc。

<cffunction name="OnRequestStart">
  <cfinclude template="login_action.cfm">
  <cfif isDefined ('cookie.XXXX.email')>
    <cfset session.email = cookie.XXXX.email>
  </cfif> 
</cffunction>

如果有人能提供帮助,那将非常感谢

1 个答案:

答案 0 :(得分:8)

此代码中存在很多基本错误。

  • 不要使用来自浏览器的查询字符串构建URL。您不能信任来自浏览器的任何,因此您不得使用任何东西而不将其擦除。这样的事情都在惹麻烦:

    <cfset FormAction = "#CGI.SCRIPT_NAME#?#CGI.QUERY_STRING#">
    
  • 一般情况下,如果没有正确清理 HTML编码,请不要在用户来自页面的HTML上写任何内容。广泛使用HTMLEditFormat()URLEncodedFormat()

  • 不要永远使用用户提供的值来构建SQL字符串。有<cfqueryparam>,使用它。这是坏事和错误:

    select * from t_admin where username = '#username#'      
    
  • 我们在此时:不要在生产代码中使用select *

  • 不要将纯文本密码存储在数据库中。这是一件大事,你必须在做其他事情之前解决这个问题。 ColdFusion提供了许多散列算法,使用它们(并阅读盐渍哈希)。
  • 是否通过HTTPS发送登录表单? (该应用程序中的所有内容都应该是HTTPS,但绝对的登录表单必须。)
  • 登录Cookie应标记为securehttponlysee),以防止会话被劫持。
  • 登录过期的Cookie永远不是一个好主意。取决于。