0

パスワードに名前/ユーザー/電子メールが含まれないようにユーザーを制限するにはどうすればよいですか?

これは、私が現在使用している検証スクリプトです。

<?php
    $register = $_POST['register'];
    if (isset ($register))
    {
        $email = mysql_real_escape_string($_POST['email']);
        $username = mysql_real_escape_string($_POST['username']);
        $password = sha1(md5(mysql_real_escape_string($_POST['password'])));
        $repeat_password = sha1(md5(mysql_real_escape_string($_POST['repeat_password'])));
        $first_name = mysql_real_escape_string($_POST['first_name']);
        $last_name = mysql_real_escape_string($_POST['last_name']);
        $birthday = mysql_real_escape_string($_POST['birthday']);
        $sex = mysql_real_escape_string($_POST['sex']);
        $registered = date("Y-m-d H:i:s"); 

        // Form validation

        // Password validation
        $password  = $_POST["password"];
        $uppercase = preg_match('@[A-Z]@', $password);
        $lowercase = preg_match('@[a-z]@', $password);
        $number    = preg_match('@[0-9]@', $password);
        $length    = preg_match("@^.{8,}$@" , $password);

        if(!$uppercase || !$lowercase || !$number ||  !$length  ) {
           echo "Parola trebuie sa aiba min 8 caractere si sa contina cel putin o litera mare, o litera mica si o cifra.";
        }


        // Password = Password validation
        elseif ($_POST['password'] != $_POST['repeat_password'])
        {
            echo "Parolele nu corespund.";
        }

        // E-mail address format
        elseif (!filter_var($email,FILTER_VALIDATE_EMAIL))
        {
            echo "Formatul adresei de email este invalid.";
        }

        // No e-mail typed
        elseif (empty($_POST['email']))
        {
            echo "Nu ati completat adresa de email.";
        }

        // No username typed
        elseif (empty($_POST['username']))
        {
            echo "Nu ati completat numele de utilizator dorit.";
        }

        // No password or password validation typed
        elseif ((empty($_POST['password']) or empty($_POST['repeat_password'])))
        {
            echo "Parola trebuie introdusa in ambele campuri.";
        }

        // MySQL validations
        else
        {
            require_once("db_connect.php");


            $query_email="SELECT email FROM users WHERE email='$email'";
            $result_email=mysql_query($query_email) or die (mysql_error());

            $query_username="SELECT username FROM users WHERE username='$username'";
            $result_username=mysql_query($query_username) or die (mysql_error());



            // Check if e-mail exists
            if (mysql_num_rows($result_email)>0)
            {
                echo "Email-ul introdus a mai fost inregistrat.";
            }

            // Check if user exists

            elseif (mysql_num_rows($result_username)>0)
            {
                echo "Username-ul introdus a mai fost inregistrat. Va rugam sa va alegeti alt username.";
            }

            // Add new user to database
            else
            {
                $query="INSERT INTO users VALUES ('', '$username', '$password', '$email', '$first_name', '$last_name', '$birthday', '$sex', '', '$registered', '')";
                mysql_query($query) or die (mysql_error());
                echo "Cont creat cu succes!";

                // Send E-mail
                $to = $_POST['email'];
                $subject = "Contul meu";
                $message = "Contul dumneavoastra a fost creat cu succes! Date contului sunt: ";
                $from = "someonelse@example.com";
                $headers = "From:" . $from;
                mail($to,$subject,$message,$headers);
            }

        }
    }   
?>

MySQLが減価償却されていることは知っています。できるだけ早く MySQLi に切り替えて、SQL インジェクションの脆弱性がないようにスクリプトを調整します。エコーメッセージはルーマニア語です。それらを翻訳する必要はないと思います。それらを無視してください。

私は電子メール サーバーを持っていないので、「電子メールの送信」の部分もチェックして、動作するかどうか教えてください。初めて使用します。

質問を編集できるように、評価を下げる前にお知らせください。ありがとう!

4

5 に答える 5

1

パスワードに名前、電子メール、またはユーザー名が含まれているかどうかを判断するには、strstr または strpos を使用します。

例:

if (strpos($password,$_POST['username']) !== false) {
    echo 'Username found in the password';
}
于 2013-09-12T10:09:52.987 に答える
1

strpos()またはを使用しpreg_match()ます。

strpos()ユーザー名とパスワードを使用した例:

if ( (strpos($password,$_POST['username']) !== false ) || ( strpos($password,$_POST['password'] ) !== false ) ) {
    echo 'password not valid';
}

使用例preg_match()

<?php
$password='username email name jaja ';
$username='username';
$email='email';
$name='name';

if (preg_match("#(($email)|($username)|($name))#", $password))
    echo 'probleme';
else echo 'no problem';
?>

大文字と小文字の両方を一致させたい場合:

stripos():文字列内で大文字と小文字を区別しない部分文字列が最初に出現する位置を検索します

の場合、次のように last の後に修飾子をpreg_match()追加します。i (Docs here)#

preg_match("#(($email)|($username)|($name))#i", $password)

注:ドキュメント には、「ある文字列が別の文字列に含まれているかどうかを確認するだけの場合は、preg_match() を使用しないでください。代わりに strpos() または strstr() を使用すると、より高速になります。」と記載されています。

于 2013-09-12T10:08:56.137 に答える
1

関数 strpos を見てください

http://php.net/manual/en/function.strpos.php

于 2013-09-12T10:07:27.010 に答える
1

パスワードに名前、電子メール、またはユーザー名が含まれているかどうかを簡単に使用strstrまたは判断できます。strpos

メール機能を使用する代わりに、phpmailer を使用する必要があります: https://github.com/PHPMailer/PHPMailer使い方は簡単ですが、外部の smtp サーバーを使用します。適切に構成されたローカル smtp を使用せずに php の mail() 関数を使用すると、すべてのメールが迷惑メールとして扱われることになります。

于 2013-09-12T10:07:32.827 に答える
1

再利用可能なコードの精神で、stringContainsOneOf単純に文字列と文字列の配列を取り、その最初の文字列に配列要素が含まれているかどうかをチェックする という関数を作成しました。

//User's information
$email = "joe.smith@gmail.com";
$username = "joesmith";
$name = "Joe Smith";

//Validation function
function stringContainsOneOf($string, $checkArray)
{
    foreach($checkArray as $element)
        if(strpos(strtolower($string), strtolower($element)) !== false)
            return true;

    return false;
}

//Usage example
var_dump(stringContainsOneOf("mysecretpassword", array($email, $username, $name))); //returns false
var_dump(stringContainsOneOf("joesmithspassword", array($email, $username, $name))); //returns true
于 2013-09-12T10:20:03.053 に答える