PHP安全 - 最坏情况场景:公共,硬编码密码

时间:2014-03-27 03:19:40

标签: php security passwords xss server-side-scripting

作为主要的前端开发人员,我希望通过PHP更好地理解服务器端安全性的限制。

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

  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>.";
    ?>
    
  5. 显然你不能仔细阅读服务器端代码,比如客户端代码,除非服务器或代码(Can a client view server-side PHP source code?)出现严重错误,并且当然有办法保持硬编码密码安全(r)(Securing DB password in php)。

    然而,我今天的问题是,即使我直接告诉人们我的数据库密码,如上面的index.php文件中,攻击者可以访问表的其他(有趣)列的方式是什么(如果有的话)只是上面的脚本自动查询?

1 个答案:

答案 0 :(得分:1)

这确实是一个主观的问题,但我会尝试摆脱它。以上面的例子为例,事情可能会出错,例如,如果:

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

为保护代码,您可以做的任何小事都比没有好。没有安全性是100%完美,但是你插入的漏洞越多,破解你的安全性并做一些非常邪恶的事情变得越困难。正如我上面的第一点所示,它可能是完全出乎意料的事情。