武汉PHP培训
达内武汉民大中心

15827352908

热门课程

如何正确设计数据库问题

  • 时间:2018-04-25 13:48
  • 发布:武汉PHP培训
  • 来源:互联网

PHP 本身并不能保护数据库的安全,记住一条简单的原则:深入防御。保护数据库的措施越多,攻击者就越难获得和使用数据库内的信息。正确地设计和应用数据库可以减少被攻击的担忧。

1、数据库设计问题

应用程序永远不要使用数据库所有者或超级用户帐号来连接数据库,因为这些帐号可以执行任意的操作,比如说修改数据库结构(例如删除一个表)或者清空整个数据库的内容。

武汉PHP培训

应该为程序的每个方面创建不同的数据库帐号,并赋予对数据库对象的极有限的权限。仅分配给能完成其功能所需的权限,避免同一个用户可以完成另一个用户的事情。这样即使攻击者利用程序漏洞取得了数据库的访问权限,也最多只能做到和该程序一样的影响范围。

2.数据库连接问题

把连接建立在 SSL 加密技术上可以增加客户端和服务器端通信的安全性,或者 SSH 也可以用于加密客户端和数据库之间的连接。如果使用了这些技术的话,攻击者要监视服务器的通信或者得到数据库的信息是很困难的。

3.数据库数据的加密

SSL/SSH 能保护客户端和服务器端交换的数据,但 SSL/SSH 并不能保护数据库中已有的数据。SSL 只是一个加密网络数据流的协议。

如果攻击者取得了直接访问数据库的许可(绕过 web 服务器),敏感数据就可能暴露或者被滥用,除非数据库自己保护了这些信息。对数据库内的数据加密是减少这类风险的有效途径,但是只有很少的数据库提供这些加密功能。

对于这个问题,有一个简单的解决办法,就是创建自己的加密机制,然后把它用在 PHP 程序内,最常见的例子就是把密码经过 MD5 加密后的散列存进数据库来代替原来的明文密码。

?

<?php

$query = sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');",

addslashes($username), md5($password));

$result = pg_query($connection, $query);

$query = sprintf("SELECT 1 FROM users WHERE name='%s' AND pwd='%s';",

addslashes($username), md5($password));

$result = pg_query($connection, $query);

if (pg_num_rows($result) > 0) {

echo 'Welcome, $username!';

} else {

echo 'Authentication failed for $username.';

}

?>

4、SQL注入问题

直接 SQL 命令注入就是攻击者常用的一种创建或修改已有 SQL 语句的技术,从而达到取得隐藏数据,或覆盖关键的值,甚至执行数据库主机操作系统命令的目的。这是通过应用程序取得用户输入并与静态参数组合成 SQL 查询来实现的。下面将会给出一些真实的例子。

?

<?php

$query = "SELECT id, name, inserted, size FROM products

WHERE size = '$size'

ORDER BY $order LIMIT $limit, $offset;";

$result = odbc_exec($conn, $query);

?>

可以在原来的查询的基础上添加另一个 SELECT 查询来获得密码:

union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable;

假如上述语句(使用 ' 和 --)被加入到 $query 中的任意一个变量的话,那么就麻烦了。

这些攻击总是建立在发掘安全意识不强的代码上的。所以,永远不要信任外界输入的数据,特别是来自于客户端的,包括选择框、表单隐藏域和 cookie。

永远不要使用超级用户或所有者帐号去连接数据库。要用权限被严格限制的帐号。

检查输入的数据是否具有所期望的数据格式。PHP 有很多可以用于检查输入的函数,从简单的变量函数和字符类型函数(比如 is_numeric(),ctype_digit())到复杂的 Perl 兼容正则表达式函数都可以完成这个工作。

如果程序等待输入一个数字,可以考虑使用 is_numeric() 来检查,或者直接使用 settype() 来转换它的类型,也可以用 sprintf() 把它格式化为数字。

一个更安全的防止SQL注入的分页显示方法:

?

<?php

settype($offset, 'integer');

$query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";

$query = sprintf("SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET %d;",

$offset);

本篇文章是有武汉PHP培训为您呈现,希望给您带来更多更好的文章,更多相关资讯,请扫描下方二维码

武汉PHP培训

马上预约七天免费试听课

姓名:

电话:

上一篇:浅析PHP中的函数区别
下一篇:PHP中的函数遇到解释器会怎样

达内人力资源经理人课程上线 打造HR就业实操课程

2018年北京洪堡教育大会,达内教育集团总裁韩少云分享少儿编程

达内教育集团总裁韩少云:双师模式的实践与思考

达内与广西教育学院携手签约,共建专业开启校企合作新阶段!

选择城市和中心
贵州省

广西省

海南省

有位老师想和您聊一聊