【问题标题】:mysql_real_escape_string for all $_POST [duplicate]所有 $_POST 的 mysql_real_escape_string [重复]
【发布时间】:2014-03-22 10:26:27
【问题描述】:

我有一个旧系统,没有对 sql 注入进行任何检查,我想在每次用户使用数据库时添加 mysqli_real_escape_string()

所有的系统都建立在 index.php 下。页面如下所示:

if (!isset($_GET['p'])) {
    $_GET['p'] = 'main';
}

if (!file_exists($_GET['p'].".php"))    {
    echo "The page you are looking for isn't exist.";
}   else    {   
    if (logs()) {
        include($_GET['p'].".php");
    }
    else    {
        include('not_register.php');
    }
}

我只想在顶部添加这段代码哦index.php,我想确保我没有搞砸任何事情,所以我在这里问。

foreach ($_POST as $name => $val)   {
    $_POST[$name] = mysqli_real_escape_string($db, $val);
}

这段代码每次重新加载页面都会产生负面影响吗?

谢谢。

【问题讨论】:

  • 您的代码容易受到代码注入的影响,请阅读此处ultsec.com/php-code-injection-attack.php
  • 您的代码可能容易受到remote file inclusion的攻击。
  • 据我所知file_exists() 仅适用于同一服务器上的文件我错了吗?它如何容易受到代码注入的影响?我没有用foreach 循环修复它吗?
  • @OfirH 有wrappers 也支持stat 功能,例如ftpssh
  • 我可以修复它并将当前包含保存在index.php 中吗?或者我将不得不停止使用index.php 作为主页?

标签: php mysqli mysql-real-escape-string


【解决方案1】:

这个:

我想在每次用户输入时添加 mysql_real_escape_string() 数据库。

对于使用 mysql_* 函数的遗留 mysql 代码来说是一个很好的目标。但是,这个:

foreach ($_POST as $name => $val) { $_POST[$name] = mysqli_real_escape_string($db, $val); }

是另一回事。您不是在每次用户与数据库交互时都添加它,而是在每次完成其他操作之前添加它。该函数需要与数据库的连接,因此如果您在使用这些变量的页面中没有这样的连接,您会立即遇到问题。此外,您可以中断对那些可能不希望此时转义值的变量的任何处理 - 它们应该被转义以供 DB 使用,因此在将它们与数据库一起使用之前,而不是在此之前。


另外,正如其他人所指出的,您的代码容易受到包含模式的注入。 file_exists 可以与网络共享、文件路径以及一些 url 包装器一起使用。引用file_exists manual entry

从 PHP 5.0.0 开始,这个函数也可以与一些 URL 一起使用 包装纸。请参阅Supported Protocols and Wrappers 以确定哪个 包装器支持 stat() 系列功能。

即使没有 url 包装器,恶意用户也可以使用您的 include 直接包含一些服务器配置和其他您不想包含的文件。

【讨论】:

  • 所以如果我将在任何用户数据库交互之前创建此循环而不是将其插入变量中应该没问题吧?
  • @OfirH 不明白这一点。您不应该循环 POST,您应该只在数据库查询的上下文中转义变量。
  • 我知道。但它是一个浏览器游戏。 95%(如果不是全部)$_POST 变量与数据库相关。
  • 好吧,你也不想为另外 5% 的人破坏东西。为此使用数据库抽象层或绑定参数。这是正确的方法,不会有提到的副作用。
【解决方案2】:

首先。

在一个循环中运行这个问题不会帮助任何人。事实上,您只是重新发明了一个臭名昭著的 ma​​gic quotes 功能,该功能已经从语言中删除了。是有原因的。

第二个。

对于使用 mysql_* 函数的遗留 mysql 代码来说,这不是一个好的目标。只是因为这个功能与注射完全无关。

如果您只有 25 页 - 只需查看所有页面并正确重写 SQL 处理代码

【讨论】:

  • 它比魔术引号好一点,因为 mysql_real_escape_string 实际上使用数据库进行转义,而不是魔术引号所做的硬编码转义。不过,这不是一件好事。
  • 另外,如果您声称即使遗留代码在与数据库交互时使用 mysql_real_escape_string/mysqli_real_escape_string 也不是一个好目标,您可能需要添加一些理由说明为什么它不会这样。
猜你喜欢
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 2011-01-11
  • 2014-06-09
  • 1970-01-01
相关资源
最近更新 更多