PHP:使数据库和文件安全的技术


PHP : Techniques for making database and files secure

我正在建立一个文本共享网站,用户将上传他们的文本文件。

我想知道有人可以用什么方法攻击我的数据库和存储在我服务器上的文本文件。保护它们的方法是什么?

  1. 确保使用PDO进行数据库交互(这将防止攻击,如MySQL注入)。

  2. 使用。htaccess来获得更多的控制。(隐藏应用程序的设计结构总是很好的做法,你可以尝试使用more-rewrite来重写你的URL,或者使用。htaccess,你可以拒绝用户直接访问文件的权限。)

  3. 使用面向对象编程

  4. 确保你的应用程序使用设计模式。采用符合标准的设计模式可以让你的网站不那么容易受到攻击,你可以在你的应用中使用各种不同的设计模式,比如单例模式、MVC模式等等。而MVC被各种PHP框架广泛采用和使用

  5. 有各种PHP框架可用于处理大多数事情。试图重新发明轮子是没有用的。尝试使用框架,CakePHP是我个人推荐的,否则你也可以尝试Code Ignitor或Symfony。

好主意

我建议你使用某种框架。您仍然需要使用下面的一些技术(例如,file_get_contentsunlink)。

关于框架:
CodeIgniter非常简单,Symfony是一个很好的中间工具——它结合了一个真正的ORM系统和YAML配置,给人一种更健壮的感觉。Zend是迄今为止最强大的——它有一个所有功能的库(令人印象深刻的是,它有绑定,可以让您将CodeIgniter或Symfony与Zend的库一起使用)。当然,强大的力量会带来巨大的复杂性(除非你是彼得·帕克)。

如果没有选项

老实说,最好将文件存储在数据库中,而不是文件系统中。readfile可能是一个主要的安全风险(它不必须是,但实际上您必须担心它),并且您已经计划合并数据库。哦,作为额外的奖励,您可以索引文件,以便允许合法搜索。

一旦您使用了move_uploaded_file,那么您应该执行$input = file_get_contents($tmp_fl_name);unlink($tmp_fl_name);来从文件系统中删除该文件。然后,使用PDO将数据插入数据库。然后,当您插入到数据库中时,请确保使用带有bindParam s的PDOStatement来防止SQL注入。

它可能看起来像这样:

$tmp_file = "/path/to/temps/tmp".microtime().".tmp";
move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $tmp_file);
$input = file_get_contents($tmp_file);
unlink($tmp_file);
$sth = $dbh->prepare('INSERT (:fl, NOW()) INTO USER_FILES');
$sth->bindParam(':fl', $input, PDO::PARAM_STR);
$sth->execute();

在php.net/security有一个很棒的综述

顺便说一下,你有一个王牌名字——这是你的真名吗?

使用PDO http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

我建议使用MVC框架,如CodeIgniter, Kohana或Zend框架,自动保护数据库中输入的数据,并在GET/POST数据上运行XSS(跨站脚本攻击)完整性检查。就我个人而言,我更喜欢CodeIgniter,因为它简单,学习曲线低。

但是,这要求您使用每个框架的特定数据库抽象层。在CodeIgniter中,其工作原理大致如下:

$this->db->insert('tablename', array('text' => 'hey mom', 'user_ud' => $this->user->id));$rows = $this->db->from('tablename')->where('user_id', $this->user->id)->get()

($this->user->id是虚构的,在普通安装中不存在)