php语言 百分网手机站

PHP安全性漫谈(2)

时间:2020-10-06 16:41:13 php语言 我要投稿

PHP安全性漫谈

  1、数据库设计问题

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

 

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

  2.数据库连接问题

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

  3.数据库数据的加密

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

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

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

  $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 查询来实现的。下面将会给出一些真实的例子。

  $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注入的分页显示方法:

  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安全性漫谈】相关文章:

1.浅谈PHP 安全性

2.PHP中的安全性知识

3.php学习之php配置

4.PHP的漏洞-如何防止PHP漏洞

5.php学习之php预定义变量

6.PHP学习路线以及PHP优化技巧

7.PHP配置文件详解php.ini

8.PHP文件是什么 如何打开PHP文件

9.PHP语言介绍