2

我曾经“过去”经常使用 PHP 和 MySQL 来创建各种网站,包括基于文本的游戏。

当我创建这些项目时,我使用的代码如下:

$query = 'SELECT user FROM users WHERE user_id = 1';
$result = mysql_query($query);

从数据库中获取结果。我意识到这是一种非常糟糕的方法,我的问题是现在执行 SELECT、UPDATE、DELETE 等的最佳方法是什么。因为如果我在一个文件中制作函数,这些将在整个网站上使用很快。我想知道这样做的“最佳/最安全”的方式。我知道将 SQL 语句放在一行是不好的,因为它们对 SQL 注入开放,我想知道这到底意味着什么以及如何安全地解决这个问题。

它主要处理我似乎不明白的数据库。由于我已经有几年没有关注 PHP 了,所以我看到很多事情从我创建项目时就开始了。

我环顾网络,发现 W3Schools 是一个有用的资源,但我想听听每天都在使用它的人的意见,以了解我应该如何做事。

总体而言,我如何安全地连接数据库以及如何安全地从数据库中获取数据以供整个网站使用。

这包括:

  • 连接数据库
  • 从数据库中获取数据库
  • 将数据库中的数据回显到页面上

以及您能想到的任何其他帮助我了解如何构建“安全”网站的方法。

感谢任何回答这个/这些问题的人,我会非常积极地评论这个问题,提出更多关于我不完全理解的问题。

旁注:本网站将使用 HTML、JavaScript、PHP 和 MYSQL 数据库创建。

4

3 回答 3

6

这一切都从关注点分离开始,现在最流行的 Web 应用程序架构是模型-视图-控制器(您不需要发明一个,您可以使用一些现有的 PHP 框架,每个框架都捆绑了某种的ORM)。

由于您询问的是隔离数据库代码,因此模型是您应该从 MVC 范例中学习的第一件事。对数据的所有操作,包括任何业务逻辑和计算,所有数据库操作,都进入模型类。您可以通过不同的方式构建它们。一种流行的模式是Active Record——实际上是每个表一个类。我不是这个的忠实粉丝——你可以在你的逻辑实体(用户、游戏等)之后创建类,它们可以在多个表上运行。但无论如何,这些类可能是建立在 Active Record 之上的。

如果您正在使用现有代码,您可以从隔离对象中的查询开始,因此与数据库一起使用的所有代码都在一个地方 - 然后您可以开始重构对象以遵循所选架构:用户对象与用户表一起使用, 等等... 在对象中分离 DB 代码后,您可以轻松切换到 PDO 或其他 db-implementations 并防止 SQL 注入。

最后,我想推荐几本书: 重构——关于如何将遗留代码转化为漂亮的面向对象解决方案的最佳书籍

企业应用程序架构的模式- 难以阅读,但有很多有用的信息

实现模式- 与设计模式书籍不同,它侧重于小决策,字面上是每一行代码

于 2013-10-08T07:50:36.823 回答
0

这是值得注意的:

将 SQL 语句放在一行是不好的,因为它们对 SQL 注入开放

不,一行的 SQL 语句就可以了。SQL 注入的出现是因为允许用户输入 SQL,而无需检查它本身是否包含(恶意)SQL。要么使用参数化来防止这种情况发生(ORM 会为你做这件事),要么使用转义.

于 2013-10-08T08:35:20.333 回答
0

尝试寻找 Mysqli Prepare。这是一个例子:

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

/* create a prepared statement */
if ($stmt = $mysqli->prepare("SELECT user FROM users WHERE user_id = ?")) {

    /* bind parameters for markers */
    $stmt->bind_param("s", $id);

    /* execute query */
    $stmt->execute();

    /* bind result variables */
    $stmt->bind_result($user);

    /* fetch value */
    $stmt->fetch();

    printf("You are %s\n", $user);

    /* close statement */
    $stmt->close();
}

/* close connection */
$mysqli->close();
?>

这些比mysql_query()

于 2013-10-08T17:37:44.610 回答