首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果用户名被占用,则阻止用户注册

问如果用户名被占用,则阻止用户注册
EN

Stack Overflow用户
提问于 2014-02-07 15:39:22
回答 3查看 1.2K关注 0票数 0

因此,我的脚本完美地检查用户名是否空闲,但不管用户提交所有表单时,他都可以注册。我需要一种方法,以防止用户注册,如果用户名被采取。代码如下:

index.php

代码语言:javascript
复制
$("#username").keyup(function(){
    var val=$("#username").val();
    $("#address").html("Your address will be askfolio.com/" + val);

    $("#freeu").html("<img src='css/ajax-loader.gif' style='margin-left:-75px;'>");
    if (val != ''){
        $.ajax({
            url:"s/ufree.php",
            method:"POST",
            data:$("#username"),
            success:function(data){
                if (data == 1){
                    $("#freeu").html("<img src='css/accept.png' style='float:left;padding-right:65px;'>");
                    $("#reg-error").css("display","none");

                }else{
                    $("#freeu").html('');
                    $("#reg-error").css("display","block");
                    $("#reg-error").html('Username is already taken, try another.');
                    $("#username").focus();
                    return false;
                }

            }
        });

    }else {
        $("#freeu").html('');
    }


});
function Users_Registration() 
{
    var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
    var name = $("#name").val();
    var lastname=$("#lastname").val();
    var username = $("#username").val();
    var remail = $("#remail").val();
    var rpass = $("#rpass").val();
    var day=$("#day").val();
    var month=$("#month").val();
    var year=$("#year").val();


    if(name == "")
    {
        $("#reg-error").css("display","block");
        $("#reg-error").html('Please enter your name in the required field.');
        $("#name").focus();
    }

    else if(lastname == "")
    {
        $("#reg-error").css("display","block");
        $("#reg-error").html(' Please enter your Last Name in the required field.');
        $("#lastname").focus();
    }
    else if(username == ""){
        $("#reg-error").css("display","block");
        $("#reg-error").html('Please enter your desired username to proceed.');
        $("#username").focus();
    }
    else if(remail == "")
    {
        $("#reg-error").css("display","block");
        $("#reg-error").html('Please enter your email address to proceed.');
        $("#remail").focus();
    }
    else if(reg.test(remail) == false)
    {
        $("#reg-error").css("display","block");
        $("#reg-error").html('Please enter a valid email address to proceed.');
        $("#remail").focus();
    }else if (rpass == "") {
        $("#reg-error").css("display","block");
        $("#reg-error").html('Please enter a valid password to proceed.');
        $("#rpass").focus();
    }
    else if (day == ""){
        $("#reg-error").css("display","block");
        $("#reg-error").html('Please select a day to proceed.');
        $("#day").focus();

    }else if (month == "") {
        $("#reg-error").css("display","block");
        $("#reg-error").html('Please select a month to proceed.');
        $("#month").focus();
    }else if (year == "") {
        $("#reg-error").css("display","block");
        $("#reg-error").html('Please select a year to proceed.');
        $("#year").focus();
    }
    else
    {
        var dataString = 'name='+ name + '&lastname='+ lastname + '&username='+ username + '&rpass='+ rpass + '&remail='+ remail + '&year=' + year + '&month=' + month + '&day=' + day  +'&page=signup';
        $.ajax({
            type: "POST",
            url: "register.php",
            data: dataString,
            cache: false,
            beforeSend: function() 
            {
                $("#reg-error").html('<br clear="all"><div style="padding-left:115px;"><font style="font-family:Verdana, Geneva, sans-serif; font-size:12px; color:black;">Please wait</font> <img src="images/loadings.gif" alt="Loading...." align="absmiddle" title="Loading...."/></div><br clear="all">');
            },
            success: function(response)
            {
                $("#reg-error").html("Loading");
                var username="<?php echo $loguser; ?>";
                window.location=username;
            }
        });
    }
}

ufree.php

代码语言:javascript
复制
<?php

include "db.php";

if (isset($_POST['username'])) {
    $username=$_POST['username'];

    $sql=mysql_query("SELECT * FROM users WHERE username='$username'");
    if (mysql_num_rows($sql) == 0) {
        echo "1";
    }else {
        echo "<div style='padding-top:4px;'>username is taken</div>";
    }

}
?>
EN

回答 3

Stack Overflow用户

发布于 2014-02-07 15:51:59

除了SQL查询中的sql注入漏洞外,您的用户名检查方法有些多余。通过在每次输入字符时检查用户名,您会给浏览器和服务器增加额外的负载。

我建议您将这两个过程合并在一个步骤中,这意味着您在同一位置进行用户名检查和注册。在您的Register.php文件中,在注册之前检查用户名的可用性,如果获取了用户名,则显示一条正确的消息,如果不是,则进行注册。

票数 0
EN

Stack Overflow用户

发布于 2014-02-07 15:56:53

不用说,但不管javascript验证如何,您的服务器仍然需要检查用户名在注册时是否可用,因为任何人都可以禁用或操作javascript。

同样,正如哈米德所说,你的php代码是高度易受攻击的。在sql中使用它之前,至少应该使用以下内容:

$username = mysql_real_escape_string( $_POST[ 'username' ] );

也就是说,为了可用性,您需要做的是在表单中添加一个onsubmit函数,该函数在提交之前检查用户名是否有效。(为了简单起见,总结了你的代码)

代码语言:javascript
复制
var validUser = false;

$("#username").keyup(function(){

    var val=$("#username").val();

    validUser = false;

    if (val != ''){
        $.ajax({
            url:"s/ufree.php",
            method:"POST",
            data:val,
            success:function(data){
                if (data == 1){
                    validUser = true;
                }else{
                    $("#username").focus();
                    return false;
                }
            }
        });

}else {
$("#freeu").html('');
}

function formsubmit()
{
    if( !validUser )
    {
        alert( 'Username is already taken, try another' );
        return false;
    }
    return true;
}

然后在你的表单中:

代码语言:javascript
复制
<form action="whatever" onsubmit="return formsubmit();">
...
</form>
票数 0
EN

Stack Overflow用户

发布于 2014-02-07 16:12:22

我最喜欢的一个jQuery插件是validation eng。

https://github.com/posabsolute/jQuery-Validation-Engine

它有非常好的验证来做你正在寻找的事情。它做所有类型的字段,包括用于用户名检查的内联ajax。如果来自ajax调用的响应不是true,那么表单将不会提交。我把它用在我的注册表单上。一旦用户转到它验证的下一个字段,如果它没有通过,即用户名不可用,它将以红色显示用户名不可用。表单不会提交。

设置起来并不难。下面是ajax的演示。注意,它实际上不会在这个演示站点上进行验证,但它只是一个示例。您可以看到,如果它是空的或未经过验证,它是如何不提交的。它是非常可定制的。

http://www.position-relative.net/creation/formValidator/demos/demoAjaxSubmitPHP.html

哦,当然,要注意任何mysql的安全问题,并检查以确保dupe不能被输入到数据库中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21621965

复制
相关文章

相似问题

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