我正在构建一个文本共享网站,用户可以在其中上传文本文件。
我想知道有些人可以攻击我的数据库和存储在我服务器上的文本文件的方式。有什么方法可以保护他们。
答案 0 :(得分:2)
确保您使用PDO进行数据库交互 (这样可以防止你受到MySQL注入等攻击)。
使用.htaccess获得更多控制权。
(从公共场所隐藏应用程序的设计结构始终是一个好习惯,您可以尝试使用more-rewrite
重新编写URL,或者使用.htaccess可以拒绝用户直接访问文件的权限。)< / p>
使用面向对象的编程 面向对象编程是为了利用它而发明的。
确保为应用程序使用设计模式。 通过遵循标准采用设计模式使您的站点不易受到攻击,您可以使用各种设计模式,如Singleton Pattern,MVC Pattern等。而MVC被各种PHP框架广泛采用和使用。
有各种PHP框架可用于处理大部分事情。尝试重新发明轮子是没有用的。尝试使用框架,CakePHP是我个人推荐的,否则你也可以尝试Code Ignitor或Symfony。
答案 1 :(得分:2)
我必须建议您使用某种框架。您仍需要使用以下某些技术(例如file_get_contents
和unlink
)。
关于框架:
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
的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();
答案 2 :(得分:0)
顺便说一句,你有一个 ace 名字 - 它是你的真名吗?
答案 3 :(得分:0)
答案 4 :(得分:0)
我建议使用像CodeIgniter,Kohana或Zend Framework这样的MVC框架,它自动保护数据库中输入的数据,并对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
是虚构的,在香草装置中不存在)