PHP:我将如何使用这个简单的类?

Joh*_* D. 1 php authentication class

我正在寻找更多"正确"的登录/注销代码部分,并找到了这个:http: //snipplr.com/view/1079/auth/

我有两个问题但是阻止我使用它.
1:我如何实例化该类,并在我的脚本中使用它?(我知道PHP,但由于某种原因我只是迷惑)
2:有以下几行:

global $db;
$db->query("sql here...");
Run Code Online (Sandbox Code Playgroud)

这究竟是如何构成数据库对象的呢?我想也许我应该$db = mysql_connect(...)在脚本之外创建一个对象,并global从类外部调用它?

如果我知道如何打电话给这个班级,其他人看起来就像一件轻而易举的事,这对我很有帮助!

Cha*_*les 5

该代码很危险,你不应该在它的当前状态下使用它.

  • 它盲目地信任$_COOKIE并使用字符串连接创建SQL查询,而无需正确转义输入.恶意用户可以使用该类轻松地在任何应用程序上执行SQL注入.
  • 对存在var的关键字,使用相同的名称作为类和方法前缺少访问控制关键词的构造函数的存在告诉我,该代码是为PHP4,PHP5不写.但它仍将继续运行

这两个都是可解决的问题.首先,让我们解决您的问题.

  1. @Delan Azabani编写的代码是如何使用该类的一个很好的例子.
  2. 代码令人困惑.首先,看起来代码使用的是真正的数据库对象,而不是mysql扩展程序提供的旧的低级函数.但随后它会从mysql扩展中调用函数!它可能是某人定制的包装器.代码实际上并不是创建数据库对象,它只是引用$db全局范围中的值,正如您所怀疑的那样.

您已经提到过您正在使用mysql扩展程序.我敦促你重新考虑并使用PDOmysqli.这不仅会类工作,或者(尽管一些改变,以减轻刺目的安全漏洞),而是你自己的代码将使用中使用的更现代,更安全的技术来更好PDOmysqli.

让我们login使用PDO 修复方法.

public function login($username, $password) {
    global $db;
    $sth = $db->prepare("SELECT user_id FROM users WHERE username = ? AND password = ?");
    $sth->execute(array($username, $password));
    if($sth->rowCount() == 1) {
        $this->user_id = $sth->fetchColumn();
        ...
Run Code Online (Sandbox Code Playgroud)

让我们回顾一下改变了什么.首先,我们添加了查询占位符,这些是问号.该prepare方法返回一个您可能已经熟悉的语句句柄.接下来,我们告诉准备好的语句使用该execute方法运行自己,传递一组变量.变量将自动为您转义,然后插入到查询中代替占位符.

查询运行后,我们使用rowCount拉回匹配行的数量.我们想要一个.因为我们正在撤回第一行的第一列,所以我们使用fetchColumn来获取该位数据.

其余的登录方法就好了.

check方法需要类似的修复.

public function check($username, $password) {
    global $db;
    $sth = $db->prepare("SELECT user_id, password FROM users WHERE username = ?");
    $sth->execute(array($username));
    if($sth->rowCount() == 1) {
        list($db_user_id, $db_password) = $sth->fetch(PDO::FETCH_NUM);
        if(md5($db_password . $this->salt) == $password) {
            $this->user_id = $db_user_id;
            ...
Run Code Online (Sandbox Code Playgroud)

我们再次使用占位符准备查询,然后使用实际变量执行.我们再次只想要一行,但这次我们想要一行中的所有内容.我们将PDO::FETCH_NUM用来告诉fetch我们想要一个数字索引的数组,然后我们将在数组中取两个结果条目并将它们填入$db_user_id$db_password使用旧代码调用的地方mysql_result.PDO不允许您使用选择同一行中的不同列fetchColumn.

如果你想使用mysqli扩展,那么还有一些工作要做.我希望我已经说服你使用PDO了!

班上的其他人,呃,足够了.确保调整$domain顶部的类变量以匹配您的实际域名,它在cookie中使用.