3

security.php

class Security {

    public function sanitize($data) {
        return mysql_real_escape_string($data);
    }
}
?>

users.php

<?php


class User {

    private $db;

    public function __construct() {
        $this->db = new Connection();
        $this->db = $this->db->dbConnect();
    }

    public function userExists($username) {
        $username = sanitize($username);
        $st = $this->db->prepare("SELECT * FROM `users` WHERE `username`=? ");
        $st->bindParam(1, $username);
        $st->execute();

        if ($st->rowCount() == 1) {
                echo "User exists";
            } else {
                echo 'Incorrect username or password lad';
            }
    }
}

?>

私のユーザー存在メソッドでは、サニタイズ メソッドを使用したいのですが、これを oop で行う正しい方法がわかりません。両方のクラスが別のファイルにあります。助けていただければ幸いです。

4

3 に答える 3

3

私の最善の提案は、Securityのsanitizeメソッドを静的関数にすることです。そうすれば、オブジェクトをインスタンス化せずにメソッドにアクセスできます。

例:

<?php
class Security {
  public static function sanitize($data) {
    return mysql_real_escape_string($data);
  }
}

そして、ユーザークラスでは:

public function userExists($username) {
    $username = Security::sanitize($username);

完全に機能する例を次に示します。

security.php

<?php
class Security {
  public static function sanitize($data) {
    return mysql_real_escape_string($data);
  }
}

users.php

<?php
class User {
  private $db;

  public function __construct() {
    $this->db = new Connection();
    $this->db = $this->db->dbConnect();
  }

  public function userExists($username) {
    $username = Security::sanitize($username);
    $st = $this->db->prepare("SELECT * FROM `users` WHERE `username`=? ");
    $st->bindParam(1, $username);
    $st->execute();

    if($st->rowCount() == 1) {
      return True;
    } else {
      return False;
    }
  }
}

test.php(実際の動作を参照してください!)

<?php
require_once 'security.php';
require_once 'user.php';

$user = new User();
$exists = $user->userExists('my-username');
if($exists) {
  print 'User exists';
} else {
  print 'Incorrect username or password lad';
}
于 2013-03-20T15:43:40.507 に答える
1

これは少し時間がかかるかもしれませんが、最終的に学びたいと思ういくつかのトピックに光を当てるでしょう。

また、プリペアドステートメントを使用するときに何もエスケープする必要はありません。しかし、とにかくあなたの質問に答えるつもりです。

これを行うにはいくつかの方法があります。

依存性注入

Connectionを使用してコンストラクターで行ったように、Securityインスタンスをインスタンス化できます。ただし、これは間違った方法です。これは、クラスがConnectionクラスに依存するように、コードがSecurityクラスに依存するようになるためです。

これを修正するには、依存性注入を使用します

public function __construct( DBInterface $db ) {
    $this->db = $db;
}

このように使用してください

$connection = new Connection();
$db = $connection->dbConnect();
$user = new User( $db );

これで、コードはDBInterfaceインターフェイスのみに依存します。これで、そのインターフェイスを実装するクラスをいくつでも作成して、それらをユーザークラスに渡すことができます。

Securityのメソッドを静的にすることもできますが、これによりSecurityクラスへの依存関係も追加されます。

コンストラクターでセキュリティオブジェクトを渡すこともできますが、それはすぐに醜くなる可能性があります。依存性注入コンテナを見てください


接続クラスにメソッドを追加します

独自のConnectionクラスを作成したので、escapeメソッドを接続クラスに追加して次のように呼び出すことができます。$this->db->sanitize()

$username = $this->db->sanitize($username);

php5.4の特性

Trait Security {
    public function sanitize($data) {
        return mysql_real_escape_string($data);
    }
}

Class User {
    use Security;
...
}

次に、セキュリティ特性のメソッドをUserクラスにあるかのように使用します。


この場合、UserクラスとSecurityクラスでは意味がないため、基本クラスを作成して拡張することについては意図的に言及していません。

于 2013-03-20T16:14:27.357 に答える
1

ファイルをインクルードし、オブジェクトを適切にインスタンス化し、そのメソッドを呼び出します。

<?php
require_once 'security.php';
class User {

private $db;

public function __construct() {
    $this->db = new Connection();
    $this->db = $this->db->dbConnect();
}

public function userExists($username) {
    $sec = new Security();
    $username = $sec->sanitize($username);
    $st = $this->db->prepare("SELECT * FROM `users` WHERE `username`=? ");
    $st->bindParam(1, $username);
    $st->execute();

    if ($st->rowCount() == 1) {
            echo "User exists";
        } else {
            echo 'Incorrect username or password lad';
        }
   }
}
于 2013-03-20T15:43:10.083 に答える