我需要什么来保持一个安全的MySQL数据库


What do I need to keep a secure MySQL database?

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

这是我一直用来清除任何用户输入的函数,但我觉得这不是它的全部,我还忽略了什么?

function CleanInput($value) {
    stripslashes($value);
    if(!is_numeric($value)) {
        mysql_real_escape_string($value);
    }
    return $value;
}
    保持你的服务器安全。有人在你的服务器上显然是一个非常大的不不。
  1. 只允许在绝对必要时远程访问数据库。
  2. 为MySQL设置强密码
  3. 限制PHP脚本使用的任何用户的绝对最小所需权限。例如,只给脚本读权限。
  4. 为了防止SQL注入,使用PHP PDO或MySQLi来代替经典的MySQL函数。
  5. 不要相信你的用户。

最佳实践是使用prepared statements

使用use mysql_query也是一个不好的做法,因为它已被弃用,如果您查看文档就可以看到。

使用mysql_real_escape_string也是一个不好的做法,因为它也被弃用,它不能从logical sql injections中拯救你

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

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

验证所有输入也是明智的,包括客户端和服务器端。

首先,安全的mySQL没有万能药。你得再详细解释一下。如果您对登录以及如何避免大多数(如果不是全部)sql注入技巧等感兴趣,那么在mySQL中使用存储过程。我不认为PHP会给你它所能做的一切。例如,考虑不连接到实际的/生产数据库,而是连接到另一个数据库,其中用户对存储过程(更适合PHP的函数)只有只读访问权。然后,没有人可以在这个数据库中看到你的数据!即使他知道你的db-name、username和passwd,他也无法从任何表中进行SELECT。在您的存储过程中,您提交(再次SELECT)用户的用户名和passwd,并收到一个新的db-name、主机、用户名和passwd,使用它们再次连接以检索您的真实数据。

你可以使用同样的技巧连接到DB,如果你不介意太多的性能或mySQL超载。

使用MD5函数对后端(数据库,MySQL等)和前端(php等)的密码。

非常简单,但却是确保工作安全的良好开端。

我的教授表扬了我,因为我把它纳入了我的项目。

这是一个不错的开始,但这里有一些真正有用的信息的链接:

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();
相关文章: