首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AJAX/PHP挑战-响应登录

AJAX/PHP挑战-响应登录
EN

Stack Overflow用户
提问于 2014-02-09 00:23:49
回答 3查看 1.2K关注 0票数 2

我已经开始着手一个新的web项目,这一次我想我会更多地考虑如何处理用户身份验证(以前只使用MD5哈希密码)。我觉得我已经搜索了网络的各个角落,寻找一个简单、不过分的解决方案,现在我想知道是否可以实现以下内容:

  • 客户端输入用户名和密码,然后按下"Submit“。
  • 在提交时,会向服务器发出AJAX请求,请求提供一个随机令牌/nonce/秘/密码
  • 服务器将该名称返回给客户端,在该客户机中,使用密码进行散列,而在该散列中使用该密码。
  • 客户端将用户名和散列(password+nonce)发送到进行身份验证的服务器。

我的问题如下:

  1. AJAX是否有可能要求服务器提供一个时间,并让服务器等待哈希被传输回来?(异步:可能是假的?请随意提供代码片段/示例)我看到的唯一的另一种选择是将现在存储在一个隐藏的字段中,这似乎不太合适。
  2. 这是否能提供更多的安全保障?
  3. 如果没有,还有其他选择吗?我应该像以前一样用明文发送密码吗?

注意:我知道很多人会想说HTTPS/SSL是完成一个安全站点的唯一方法,我听到了,但是由于这个项目的用户不应该超过少数用户都是我手工创建的,而且不会有像金融交易或其他交换的敏感数据这样的安全信息,我只想在登录期间有一个合理的方法来保护密码/数据。在这种情况下,MITM和其他所有的威胁对我来说都没有问题,因为( a)所有的黑客都不会对我的小型私人使用项目感兴趣;( b)任何数据丢失或安全漏洞的计算成本不足以保证购买SSL证书。

任何意见或建议都会受到感谢(即使是那些想指责我是一个吝啬的新手的人;)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-22 13:39:26

经过大量的研究和查看代码片段,我最终意识到,无论我在客户端实现了什么样的保护(在Javascript中进行散列,请求非the等等)。增加安全感只是一种错觉。当然,这不会伤害我,但我继续回到“通过默默无闻的安全”的名言。

也许有一种方法可以创建一种智能的、简单的方法来对用户进行身份验证和保护凭据,而无需使用HTTPS/SSL,但我还没有找到它(而且我肯定没有自己的编码技能)。

我想我会加入SSL潮流,省去很多时间和麻烦。

票数 0
EN

Stack Overflow用户

发布于 2014-02-09 01:09:27

1-是的是可能的。您可以发送多个AJAX请求,这些请求可以用一些逻辑来设置,只有在满足特定条件后才能触发和响应。也许您可以考虑使用md5或其他一些受支持的技术在客户端创建随机盐。

是的,在散列敏感信息和清晰发送文本方面,任何事情都比md5更好,这完全是个麻烦。

3-从开放墙进入phpass。它是一个易于实现的开源密码哈希框架,它将帮助您完成正确的工作。一些更大的名字使用它,包括wordpress,等等。如果您是在ajax上设置的话,您将不得不自己做一些修改。

票数 0
EN

Stack Overflow用户

发布于 2014-02-11 02:30:23

代码语言:javascript
复制
<?php

    // this is normally where you should include a connection to you database
    // to check user input against what is stored 
    if(isset($_POST["username"])) {
        $username = $_POST['username'];
        if ($username == "Joe Schmoe") {
            echo $username.' is taken';
            exit();
        } else {
            echo $username.' is available';
            exit();
        }
    }
?>
<?php

    // this is also where you should include a connection to you database
    // to check user input against what is stored 
    if(isset($_POST["submitIt"])) {
        $username = $_POST['submitIt'];
        if ($username == "Joe Schmoe") {
            echo 'Username is taken';
            exit();
        } else {
            echo 'Success!!';
            exit();
        }
    }
?>
<!DOCTYPE html>
<html>
<head>
    <script>
        function ajaxObj(meth, url) {
            var x = new XMLHttpRequest();
            x.open(meth, url, true);
            x.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            return x;
        }
        function ajaxReturn(x){
            if(x.readyState == 4 && x.status == 200){
                return true;
            }
        }
    </script>
    <script>
        function username_availability() {
            var un_value  = document.getElementById("username_value").value;
            var un_error  = document.getElementById("username_error");
            var un_status = document.getElementById("username_status");
            if (un_value != "") {
                var ajax = ajaxObj("POST", "<?php echo $_SERVER['PHP_SELF']; ?>");
                ajax.onreadystatechange = function() {
                    if(ajaxReturn(ajax) == true) {
                        un_status.innerHTML = ajax.responseText;
                    }
                }
                ajax.send("username="+un_value);
            }
        }
        function submitIt() {
            var un_value  = document.getElementById("username_value").value;
            var un_status = document.getElementById("username_status");
            var sb_button = document.getElementById("submit_button");
            var r_message = document.getElementById("result_message");
            var un_form   = document.getElementById("username_form");
            if (un_value == "") {
                un_ststus.innerHTML = "Form data is missing";
            } else {
                un_status.innerHTML = 'processing...';
                var ajax = ajaxObj("POST", "<?php echo $_SERVER['PHP_SELF']; ?>");
                ajax.onreadystatechange = function() {
                    if(ajaxReturn(ajax) == true) {
                        if(ajax.responseText == "Username is taken") {
                            un_status.innerHTML = ajax.responseText;
                        } else {
                            window.scrollTo(0,0);
                            r_message.innerHTML = 'Username is yours!!!';
                            un_status.innerHTML = ajax.responseText;
                        }
                    }
                }
                ajax.send("submitIt=" + un_value);
            }
        }
    </script>
</head>
<body>
    <form name="username_form" id="username_form" onsubmit="return false;">
        <div>Username: </div>
        <input id="username_value" type="text" onkeyup="username_availability()" autofocus>
        <button id="submit_button" onclick="submitIt()">Submit</button>
        <div id="result_message">Submit Username</div>

        <div id="username_status"></div>
    </form>
</body>
</html>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21653564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档