[Fwd] How to make a secured login form

From: Date: Fri, 13 Feb 2009 12:32:51 +0000
Subject: [Fwd] How to make a secured login form
References: 1  Groups: php.general 
Request: Send a blank email to php-general+get-288210@lists.php.net to get a copy of this message
Hi, I'm cross-posting this (from jquery-en js mailinglist) because it's something that i think is relevant for this list too.. You can ignore the jQuery in it, since all the jquery calls can be replaced with document.getElementById(). I have secured the login form for my CMS with a challenge-response thing that encrypts both username and password with the (login-attempts-counted) challenge (and; here's my problem: a system hash) sent by the server (it would end up in your html as a hidden inputs, or as part of a json transmission).. Since then, i've found these libs that do even longer one-way-crypto: http://mediabeez.ws/downloads/sha256.js-php.zip The principles i'm about to explain stay the same. *but i'd really like to know if my crypto can be improved* So instead of the browser getting just a text-field for username and password, you also send the "challenge" (and "system_hash") value. That's a 100-character random string (include special characters!), then sha256-ed (for prettiness mostly i think). I really wonder if i can do without the systemhash.. ------------------------------------ HTML -------------------------------- <form id="myForm"> <input type="hidden" id="system_hash" name="system_hash" value="[SHA256 SORTA-MASTER-KEY__DUNNO-WHAT-TO-DO-WITH-THIS]"/> <input type="hidden" id="challenge" name="challenge" value="[SHA256RANDOMSTRINGFROMPHP]"/> <table> <tr><td>Login</td><td>&nbsp;</td><td><input id='login' name='login'/></td></tr> <tr><td>Password</td><td>&nbsp;</td><td><input id='pass' name='pass'/></td></tr> </table> </form> ------------------------------------ JS ------------------------------------ $('#myform').submit (function() {
           var s = ($'system_hash')[0];
           var c = ($'challenge')[0];
           var l = $('#login')[0];
           var p = $('#pass')[0];
           l.value = sha256 (sha256 (l.value + s.value) + c.value);
           p.value = sha256 (sha256 (p.value + s.value) + c.value);
           //Here, submit the form using ajax routines in plain text,
as both the login name and
           //password are now one-way-encrypted.
           //
           //on the PHP end, authentication is done against a mysql
table "users".
           //
           //in this table i have 3 relevant fields:
           //user_login_name (for administrative and display purposes)
           //user_login_name_hash (==sha256 (user_login_name +
system_hash))
           //user_password_hash (== passwords aint stored unencrypted
in my cms, to prevent admin corruption and pw-theft by third parties; the password is encrypted by the browser in the "new-password-form" with the system hash before it's ever sent to the server. server Never knows about the cleartext password, ever.)
           //
           //when a login-attempt is evaluated, all the records in
"users" table have to be traversed (which i admit can get slow on larger userbases... help!?! :)
           //for each user in the users table, the loginhash and
password hash are calculated;
           //    $uh = sha256 ($users->rec["user_login_name_hash"] .
$challenge);
           //    $pwh = sha256 ($users->rec["user_password_hash"] .
$challenge);
           //and then,
           //    if they match the hash strings that were sent (both of
them),
           //    if the number of login-attempts isn't exceeded,
           //    if the IP is still the same (as the one who first
requested the html login form with new challenge value)
           //then, maybe, i'll let 'm log in :)
}); phicarre wrote:
How to secure this jquery+php+ajax login procedure ? $('#myform').submit( function()
        {
            $(this).ajaxSubmit( {
                type:'POST', url:'login.php',
                success: function(msg)
                {
                    **** login ok : how to call the welcome.php ***
                },
                error: function(request,iderror)
                {
                    alert(iderror + " " + request);
                }
            });
            return false;
        })
<form id="myForm" action="" >
        Name : <input type='text' name='login' size='15' />
        <div>Password : <input type='password' name='passe' size='15' /
  
</div>
<input type="submit" value="login" class="submit" />
</form> Login.php check the parameters and reply by echo "ok" or echo "ko" Logically if the answer is ok we must call a welcome.php module BUT, if someone read the client code, he will see the name of the module and can hack the server. May I wrong ? how to secure this code ?


« previous php.general (#288210) next »