2017-04-20 21 views
-2

私は独自のOOPスタイルのレジスタログインシステムをPHPで作成しようとしていますが、htmlentites()を使ってxss保護などのセキュリティ機能を実装し、SQLインジェクション保護とトークンベースcsrfの保護のためのフォームの提出(現在、私はコード内でこの機能を実装していません。フォームデータの送信中に「無効なトークン」を取得しています)。 しかし、実際のライブプロジェクトのために安全なサイトを作成するかどうかは十分に分かりません。私のコードを見直してください。私のコードでトークンベースフォームのサブミットを解決するのを手伝ってください。私の現在のコードで私のコーディングスタイルを改善する方法を教えてください。トークンベースフォームをPHPで実装する方法

これは、これは私のDBハンドラクラス

<?php 
    require 'functions.php'; 

    class DbHandler { 

    private $conn; 

    public function __construct() { 

    try{ 

    $this->conn = new PDO("mysql:host=127.0.0.1;dbname=task_manager", "root" , ""); 

    // echo "Connected"; 
    } 
    catch(PDOException $e){ 
     //die($e->getMessage()); 
     echo "Connection Failed: ".$e->getMessage(); 
    } 
    } 

    public function createUser($name, $email, $password, $repassword, $utoken) { 
    // $error = array(); 
    $error = ''; 
    $required_fields = array($name, $email, $password, $repassword); 
    $fields = array_map('trim', $required_fields); 
    if (in_array(null, $fields)) { 
     $error = 'Fields marked with an asterisk are required'; 
    } 

    else if($this->valid_token($utoken) == false){ 
     $error = "Invalid Token...!!!"; 
    } 

    else if(!filter_var($email, FILTER_VALIDATE_EMAIL)) { 
     $error = 'Please enter a valid email address !'; 
    } 

    else if(strlen($password) < 6){ 
     $error = "Password must be atleast 6 characters"; 
    } 

    else if($password !== $repassword){ 
     $error = "Password do n\' t match!!"; 
    } 
    else{ 
     $name = escape($name); 
     $email = escape($email); 
     $password_hash = escape($password); 
     // First check if user already existed in db 
     if (!$this->isUserExists($email)) { 
     // Generating password hash 
     $password_hash = password_hash($password, PASSWORD_DEFAULT, ['cost'=>12]); 
     // insert query 
     $stmt = $this->conn->prepare("INSERT INTO users(name, email, password_hash, status) values(:name, :email, :password_hash, 1)"); 
     //$stmt->bind_param("ssss", $name, $email, $password_hash); 
     $result = $stmt->execute(array(':name' => $name,':email' => $email,':password_hash' => $password_hash));; 
    //$stmt->close(); 
    // Check for successful insertion 
    if ($result) { 
    // User successfully inserted 
     return $result; 
     } else { 
     // Failed to create user 
     $error = "Failed to create user"; 
     } 
     } else { 
     // User with same email already existed in the db 
     $error = "User already exists"; 
     } 
     } 
     return $error; 
    } 




    private function isUserExists($email) { 
     $stmt = $this->conn->prepare("SELECT id from users WHERE email = :email"); 
     //$stmt->bind_param("s", $email); 
     $stmt->execute(array(':email' => $email)); 
     //$stmt->bind_result(); 
     $num_rows = $stmt->rowCount(); 
     //$stmt->close(); 
     return $num_rows > 0; 
    } 


    public function valid_token($token){ 
     if(!isset($_SESSION['token']) || $token != $_SESSION['token']) 
     return false; 
    } 
    } 
+2

これまでコードの字下げについて聞いたことがありますか?これは今では – Option

答えて

0

あなたのコードが読み本当に難しいです...あなたはそれを適切にインデントすべきである

<?php 
//error_reporting(0); 
session_start(); 


if(isset($_POST["submit"])){ 
    include "Db_handlers.php"; 
    $db = new DbHandler(); 
    $res = $db->createUser($_POST["name"], $_POST["email"], $_POST["password"], $_POST["re-password"], $_POST['token']); 
    print_r($res); 
    /*if($res){ 
     echo "test"; 
    } 
    else { 
     echo $res; 
    }*/ 
} 
$token = $_SESSION['token'] = md5(uniqid(mt_rand(),true)); 

?> 

<form action="<?=$_SERVER['PHP_SELF'];?>" method="post"> 
    <div class="field"> 
     <label for="name">Name:</label> 
     <input type="text" name="name" value="" />  
    </div> 
    <div class="field"> 
     <label for="email">Email:</label> 
     <input type="text" name="email" value="" />  
    </div> 
    <div class="field"> 
     <label for="password">Password:</label> 
     <input type="password" name="password" value="" />  
    </div> 
    <div class="field"> 
     <label for="repassword">Re-Password:</label> 
     <input type="password" name="re-password" value="" />  
    </div> 
    <input type="hidden" name="token" value="<?=$token;?>"/> 
    <input type="submit" name="submit" value="submit" /> 
</form> 

私register.phpページです。

に戻るあなたのトークンが間違っている場合は、falseを返すようですが、正しい場合はtrueを返すことを忘れてしまいます。何も返さない場合は暗黙的にnullを返します。評価はfalseです。あなたの変更がvalid_tokenのような場合は、あなたのコードが動作すると思います:

public function valid_token($token){ 
    return isset($_SESSION['token']) && $token == $_SESSION['token']; 
} 
+0

を読むのが恐ろしいです! ($ this-> valid_token($ utoken)){ \t \t \t $ error = "無効なトークン... !!!"; \t \t}ありがとうございます。 @Philippはトークンベースフォームの提出のためにこのようなコードを書くのはいいですか?そのようなセキュリティ機能のために私のコードは大丈夫ですか?ありがとうございました – user3909370

関連する問題