【问题标题】:What do I need to keep a secure MySQL database? [closed]我需要什么来保持一个安全的 MySQL 数据库? [关闭]
【发布时间】:2013-05-02 21:19:05
【问题描述】:

我查阅了很多关于保持数据库安全的教程,但我仍然不知道我需要采取什么措施来保护我的数据库免受 SQL 注入和黑客攻击。

这是我一直用来清除任何用户输入的功能,但我觉得这还不是全部,我还忽略了哪些其他内容?

function CleanInput($value) {
    stripslashes($value);
    if(!is_numeric($value)) {
        mysql_real_escape_string($value);
    }
    return $value;
}

【问题讨论】:

标签: php mysql database security sql-injection


【解决方案1】:
  1. 确保您的服务器安全。你服务器上的某个人显然是一个非常大的不,不。
  2. 仅在绝对必要时才允许远程访问数据库。
  3. 拥有强大的 MySQL 登录密码。
  4. 将 PHP 脚本使用的任何用户限制为所需的绝对最低权限。例如,赋予脚本只读权限。
  5. 为防止 SQL 注入,请使用 PHP PDO 或 MySQLi,而不是经典的 MySQL 函数。
  6. 不要相信你的用户。

【讨论】:

    【解决方案2】:

    最佳做法是使用prepared statements

    使用 mysql_query 也是一种不好的做法,因为它已被弃用,如果您查看文档可以看出这一点。

    使用mysql_real_escape_string 也是一种不好的做法,因为它也已被弃用,而且它无法将您从logical sql injections 中拯救出来

    我建议使用PDOmysqli,这两种实现都支持预处理语句。

    Prepared statements 将避免黑客将可能导致注入的命令插入您的系统,而是为常量创建一个模板,这不会影响数据库。这对性能也有好处。

    验证客户端和服务器端的所有输入也是明智之举。

    【讨论】:

      【解决方案3】:

      首先,安全的 mySQL 没有灵丹妙药。 你必须再详细一点。 如果您对登录以及如何避免大多数(如果不是全部)SQL 注入技巧等感兴趣,那么 在 mySQL 中使用存储过程。我不认为 PHP 会给你它所能提供的一切。 例如,考虑一下,不是连接到您的真实/生产数据库,而是连接到另一个数据库,您的用户对存储过程只有只读访问权限(对于 PHP 来说功能更好)。 然后,没有人可以在此数据库中看到您的数据!即使他知道您的数据库名称、用户名和密码,他也无法从任何表中选择。 使用您的存储过程,您提交(再次选择)用户的用户名和密码,您会收到一个新的数据库名称、主机、用户名和密码,您可以再次连接以检索您的真实数据。

      如果您不介意性能或 mySQL 重载,您可以对任何与 DB 的连接使用相同的技巧。

      【讨论】:

        【解决方案4】:

        在您工作的后端(数据库、MySQL 等)和前端(php 等)中使用 MD5 函数作为密码。

        非常简单,但却是保护您工作的良好开端。

        我的教授称赞我将其纳入我的项目。

        【讨论】:

          【解决方案5】:

          这不是一个糟糕的开始,但这里有一些非常有用的信息的链接:

          http://simon.net.nz/articles/protecting-mysql-sql-injection-attacks-using-php/

          最好的解决方案?使用绑定参数。要使用这些,您需要使用 PHP5 附带的改进的 mysqli 库。这种技术略有不同,您首先使用占位符定义查询“模板”,然后将参数“绑定”到它,mysqli 库会为我们处理适当的转义:

          $query = $mysqli->prepare( "UPDATE tablename SET favorite_color = ?, age = ?, description = ? WHERE user = ?" );
          // we would have a bind looking like this:
          $query->bind_param( 'sibs', 'red', 27, $some_blob, $variable );
          $query->execute();
          

          【讨论】:

          • 谢谢你这对我很有用,感谢你的帮助!
          • 我很高兴,至少你是负责任地采取安全措施!
          猜你喜欢
          • 2011-09-06
          • 2016-03-24
          • 1970-01-01
          • 2011-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-14
          相关资源
          最近更新 更多