form.submit()即使使用method =“ POST”也不会发布

时间:2018-12-08 02:58:38

标签: javascript php jquery html

我正在尝试制作一个安全的登录/注册表格。我遵循了本教程:https://fr.wikihow.com/cr%C3%A9er-un-script-de-connexion-s%C3%A9curis%C3%A9e-avec-PHP-et-MySQL(您可以在英语WikiHow上找到英语版本)。

我不使用sha512来保护密码,我只使用password_hash和password_verify。目前,我没有在登录页面上植入任何安全性。

这是我的login.php:

     <?php
include_once 'includes/db_connect.php';
include_once 'includes/functions.php';

sec_session_start();

if (login_check($mysqli) == true) {
    $logged = 'in';
} else {
    $logged = 'out';
}
?>
<!DOCTYPE html>
<html>
    <head>
        <title>Connexion sécurisée, page de connexion</title>
        <link rel="stylesheet" href="styles/main.css" />
    </head>
    <body>
        <?php
        if (isset($_GET['error'])) {
            echo '<p class="error">Une erreur s’est produite lors de votre connexion!</p>';
        }
        ?> 
        <form action="includes/process_login.php" method="post" name="login_form">                      
            Email: <input type="text" name="email" />
            Password: <input type="password" 
                             name="password" 
                             id="password"/>
            <input type="button" 
                   value="Connexion" 
                   onclick="login_form.submit();" /> 
        </form>
        <p>Si vous n’avez pas de compte, veuillez vous <a href="register.php">enregistrer</a></p>
        <p>Si vous avez terminé, veuillez vous <a href="includes/logout.php">déconnecter</a>.</p>
        <p>Vous êtes connecté <?php echo $logged ?>.</p>
    </body>
</html>

process_login.php在这里:

<?php
include_once 'db_connect.php';
include_once 'functions.php';

sec_session_start(); // Notre façon personnalisée de démarrer la session PHP

if (isset($_POST['email'], $_POST['password'])) {
    $email = $_POST['email'];
    $password = $_POST['password']; // Le mot de passe hashé.

    if (login($email, $password, $mysqli) == true) {
        // Connecté 
        header('Location: ../protected_page.php');
    } else {
        // Pas connecté 
        header('Location: ../index.php?error=1');
    }
} else {
    // Les variables POST correctes n’ont pas été envoyées à cette page
    echo 'Invalid Request';
}

下面是我所有的包含文件:

db_connect.php:

<?php
include_once 'psl-config.php';   // Car functions.php n’est pas inclus
$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);

function.php:

 <?php
    include_once 'psl-config.php';

    function sec_session_start() {
        $session_name = 'sec_session_id';   // Attribue un nom de session
        $secure = SECURE;
        // Cette variable empêche Javascript d’accéder à l’id de session
        $httponly = true;
        // Force la session à n’utiliser que les cookies
        if (ini_set('session.use_only_cookies', 1) === FALSE) {
            header("Location: ../error.php?err=Could not initiate a safe session (ini_set)");
            exit();
        }
        // Récupère les paramètres actuels de cookies
        $cookieParams = session_get_cookie_params();
        session_set_cookie_params($cookieParams["lifetime"],
            $cookieParams["path"], 
            $cookieParams["domain"], 
            $secure,
            $httponly);
        // Donne à la session le nom configuré plus haut
        session_name($session_name);
        session_start();            // Démarre la session PHP 
        session_regenerate_id();    // Génère une nouvelle session et efface la précédente
    }

    function login($email, $password, $mysqli) {
        // L’utilisation de déclarations empêche les injections SQL
        if ($stmt = $mysqli->prepare("SELECT id, login, password 
            FROM user
           WHERE email = ?
            LIMIT 1")) {
            $stmt->bind_param('s', $email);  // Lie "$email" aux paramètres.
            $stmt->execute();    // Exécute la déclaration.
            $stmt->store_result();

            // Récupère les variables dans le résultat
            $stmt->bind_result($user_id, $username, $db_password);
            $stmt->fetch();

            if ($stmt->num_rows == 1) {
                // Si l’utilisateur existe, le script vérifie qu’il n’est pas verrouillé
                // à cause d’essais de connexion trop répétés 

                if (checkbrute($user_id, $mysqli) == true) {
                    // Le compte est verrouillé 
                    // Envoie un email à l’utilisateur l’informant que son compte est verrouillé
                    return false;
                } 
                else {
                    // Vérifie si les deux mots de passe sont les mêmes
                    // Le mot de passe que l’utilisateur a donné.
                    if (password_verify($password.$username, $db_password)) {
                        // Le mot de passe est correct!
                        // Récupère la chaîne user-agent de l’utilisateur
                        $user_browser = $_SERVER['HTTP_USER_AGENT'];
                        // Protection XSS car nous pourrions conserver cette valeur
                        $user_id = preg_replace("/[^0-9]+/", "", $user_id);
                        $_SESSION['user_id'] = $user_id;
                        // Protection XSS car nous pourrions conserver cette valeur
                        $username = preg_replace("/[^a-zA-Z0-9_\-]+/", "", $username);
                        $_SESSION['username'] = $username;
                        $hash = password_hash($password.$user_browser, PASSWORD_DEFAULT);
                        $_SESSION['login_string'] = $hash;
                        // Ouverture de session réussie.
                        return true;
                    } else {
                        // Le mot de passe n’est pas correct
                        // Nous enregistrons cet essai dans la base de données
                        $now = time();
                        $mysqli->query("INSERT INTO user_login_attempt(user_id, time)
                                        VALUES ('$user_id', '$now')");
                        return false;
                    }
                }
            } else {
                // L’utilisateur n’existe pas.
                return false;
            }
        }
    }

    function checkbrute($user_id, $mysqli) {
        // Récupère le timestamp actuel
        $now = time();

        // Tous les essais de connexion sont répertoriés pour les 2 dernières heures
        $valid_attempts = $now - (2 * 60 * 60);

        if ($stmt = $mysqli->prepare("SELECT time 
                                 FROM user_login_attempt <code><pre>
                                 WHERE user_id = ? 
                                AND time > '$valid_attempts'")) {
            $stmt->bind_param('i', $user_id);

            // Exécute la déclaration. 
            $stmt->execute();
            $stmt->store_result();

            // S’il y a eu plus de 5 essais de connexion 
            if ($stmt->num_rows > 5) {
                return true;
            } else {
                return false;
            }
        }
    }


    function login_check($mysqli) {
        // Vérifie que toutes les variables de session sont mises en place
        if (isset($_SESSION['user_id'], 
                            $_SESSION['username'], 
                            $_SESSION['login_string'])) {

            $user_id = $_SESSION['user_id'];
            $login_string = $_SESSION['login_string'];
            $username = $_SESSION['username'];

            // Récupère la chaîne user-agent de l’utilisateur
            $user_browser = $_SERVER['HTTP_USER_AGENT'];

            if ($stmt = $mysqli->prepare("SELECT password 
                                          FROM user 
                                          WHERE id = ? LIMIT 1")) {
                // Lie "$user_id" aux paramètres. 
                $stmt->bind_param('i', $user_id);
                $stmt->execute();   // Exécute la déclaration.
                $stmt->store_result();

                if ($stmt->num_rows == 1) {
                    // Si l’utilisateur existe, récupère les variables dans le résultat
                    $stmt->bind_result($password);
                    $stmt->fetch();
                    $hash = password_hash($password.$user_browser, PASSWORD_DEFAULT);
                    $login_check = $hash;
                    if ($login_check == $login_string) {
                        // Connecté!!!! 
                        return true;
                    } else {
                        // Pas connecté 
                        return false;
                    }
                } else {
                    // Pas connecté 
                    return false;
                }
            } else {
                // Pas connecté 
                return false;
            }
        } else {
            // Pas connecté 
            return false;
        }
    }

    function esc_url($url) {

        if ('' == $url) {
            return $url;
        }

        $url = preg_replace('|[^a-z0-9-~+_.?#=!&;,/:%@$\|*\'()\\x80-\\xff]|i', '', $url);

        $strip = array('%0d', '%0a', '%0D', '%0A');
        $url = (string) $url;

        $count = 1;
        while ($count) {
            $url = str_replace($strip, '', $url, $count);
        }

        $url = str_replace(';//', '://', $url);

        $url = htmlentities($url);

        $url = str_replace('&amp;', '&#038;', $url);
        $url = str_replace("'", '&#039;', $url);

        if ($url[0] !== '/') {
            // Nous ne voulons que les liens relatifs de $_SERVER['PHP_SELF']
            return '';
        } else {
            return $url;
        }
    }

psi-config.php

<?php
/**
 * Voici les détails de connexion à la base de données
 */  
define("HOST", "localhost");     // L’hébergeur où vous voulez vous connecter.
define("USER", "sec_user");    // Le nom d’utilisateur de la base de données.
define("PASSWORD", "P0PbwcAAK6dTeAmo");    // Le mot de passe de la base de données. 
define("DATABASE", "deal2eat");    // Le nom de la base de données.

define("CAN_REGISTER", "any");
define("DEFAULT_ROLE", "member");

define("SECURE", FALSE);    // SEULEMENT DANS LE CADRE DE CE GUIDE!!!!

当我提交我的login_form时,我的isset条件似乎不正确,如密码和电子邮件尚未被表单修改,并且仍然为空。...

1 个答案:

答案 0 :(得分:2)

onclick按钮中删除Submit事件-只需设置type="submit"value="Submit"

<input type="submit" value="Submit" />