0

作为主要的前端开发人员,我想更好地了解 PHP 的服务器端安全性限制。

假设我有一个 Apache 服务器,其中包含一个 MySQL 数据库和一个 index.php 文件。(坏)设计如下:

  1. 包含私人信息的数据库,称为“top_secret_database”
  2. 该数据库中的单个表,称为“juicy_data”
  3. 同一个表中的一个列,它具有称为“not_important_column”的非私有、非有趣信息
  4. index.php 的内容是:

    <?php 
        mysql_connect("www.example.com", "db_user_name", "foo")
        or die(mysql_error()); 
    
        mysql_select_db("top_secret_database") or die(mysql_error());
    
        $not_secret_column = mysql_query("SELECT not_important_column FROM juicy_data") 
        or die(mysql_error());
    
        echo "The password to my Top Secret Database is <strong>foo</strong>.";
    ?>
    

显然,您不能像客户端代码那样仔细阅读服务器端代码,除非服务器或代码出现严重错误(客户端可以查看服务器端 PHP 源代码吗?),当然还有一些方法可以保持硬编码密码安全(r)(在 php 中保护数据库密码)。

但是,我今天的问题是,即使我像上面的 index.php 文件那样直接告诉人们我的数据库密码,攻击者可以通过哪些方式(如果有的话)访问刚刚发布的表的其他(有趣的)列由上述脚本自动查询?

4

1 回答 1

1

这确实是一个主观问题,但我会尽力解决这个问题。以你上面的例子为例,事情可能会出错,例如,如果:

  • 您不小心为上述代码使用了与系统上的另一个用户相同的密码。该用户甚至可能不是 MySQL 用户。它可以是 SSH 帐户,甚至是 root。其实,何必止步于此。也许您对 Gmail 帐户使用相同的密码。这样,他们会从您的亚马逊帐户中恢复密码,并使用您信用卡的最后 4 位数字登录您的家用计算机并删除您的所有文件。当他们这样做时,他们会闯入您的 PayPal 并向自己发送一些付款。觉得这听起来很牵强?再想想
  • 您的 MySQL 服务器(错误)配置为侦听来自任何地方的传入连接,并且用户可以登录并在您的数据库中做任何他们想做的事情。或者它可能只是在侦听来自 LAN IP 的连接。然后有人找出您使用的托管服务提供商并在同一 LAN 中订购另一台服务器并使用它进入。
  • 您正在(或者将来可能会)使用共享托管计划。然后,您服务器上的任何人都可以使用您的凭据轻松登录。
  • 如果有人联系了您的托管服务提供商并说服他们可以登录 MySQL,但他们需要帮助才能进入 FTP,该怎么办。提供正确的凭据,某人可能会更确信他们是帐户所有者。
  • 不要忘记机会的小窗口。如果上述任何一项不适用于大规模,也许您只是在测试期间 5-10 分钟,打开一个小窗口,其中一个确实适用。也许出于某种原因,您决定看看如果您将 MySQL 设置为从任何地址侦听以排除导致其他事情失败的原因会发生什么,然后噗!你的数据库去了,因为人们有密码。互联网上的事情可能发生得非常快,而且发生很多次,你甚至都不知道。

你可以做任何小事来保护你的代码总比没有好。没有安全措施是 100% 完美的,但是你堵住的漏洞越多,破解你的安全措施和做一些非常邪恶的事情就越困难。正如我上面的第一点所示,这可能是完全出乎意料的。

于 2014-03-27T04:10:12.727 回答