【问题标题】:Is this a valid MySQL injection concern?这是一个有效的 MySQL 注入问题吗?
【发布时间】:2014-02-11 15:51:55
【问题描述】:

显然,使用 MySQL 注入最简单的方法是通过 GET 变量。

但是在我的一些更复杂的页面中,我使用 PHP Include :

$template = "template-id";
include($_SERVER['DOCUMENT_ROOT']."/mandrill/sender.php");

$template 用于在 sender.php 文件中查询数据库。黑客可以创建恶意 PHP 文件并包含 sender.php 文件并使用 $template 变量注入代码,这是否值得担忧?

对于大多数用例,我应该防止这种情况还是过度设计?

【问题讨论】:

  • 您的威胁模型是什么? sender.php 是否使用嵌入式密码(如数据库密码)建立连接,并且不受信任的第三方创作的 PHP 文件可以加载 sender.php?您是否需要保护数据库免受某种滥用,例如提取和泄露,或修改敏感数据?

标签: php security mysqli code-injection


【解决方案1】:

这是您服务器上的安全设置问题。如果设置正确,黑客应该不可能做这样的事情。

两个主要漏洞是:

  1. 如果注册全局变量已启用并且您尚未使用值填充 $template
  2. 如果您以某种方式允许未经授权的用户将他们自己的 PHP 脚本上传到您的服务器(这是其他人可以包含您的 PHP 脚本的唯一方法)。

第一个永远不会成为问题,因为寄存器全局变量应该始终被禁用。您还应该初始化变量,而不是让它们未设置。

第二个更复杂,但除非您故意打开安全设置,否则应该不会成为问题。您通常应该设置合适的文件权限,以防止 Apache(或其他网络服务器用户/组)添加/修改主站点文件等。

话虽如此,如果有人可以将他们自己的 PHP 脚本上传到您的服务器,那么所有的赌注都没有了。 SQL 注入在这一点上变得无关紧要,因为它们可能同样容易直接访问数据库。

【讨论】:

    【解决方案2】:

    所有动态插值值必须作为参数进行严格的转义或绑定。将任何和所有变量视为包含瘟疫。也许他们不会,但为了确保您的SQL 语法正确,它不会受到伤害。无论如何,这就是“防止 SQL 注入”所做的一切。

    【讨论】:

      【解决方案3】:

      这是不可能的。

      只要您不让用户填写$template 任何类型的输入,什么都不会发生。

      尽管如此,请确保您不直接公开 sender.php,无论是通过 .htaccess 还是通过检查您在配置中某处设置的每个文件中的常量

      【讨论】:

      • 你错过了我认为的重点。如果黑客创建了一个包含该变量的 PHP 文件,并包含我的 sender.php 文件,那么他们可以将 $template 设置为他们想要的任何内容
      • 它们不能只包含您的 sender.php 文件,因为只要其他人试图通过 HTTP 访问它,PHP 解析器就会对其进行解析。他们将能够获得它生成的 HTML。我没有错过重点,但无论如何感谢 -1。
      猜你喜欢
      • 1970-01-01
      • 2014-03-25
      • 2016-11-24
      • 2010-11-25
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      相关资源
      最近更新 更多