gpt4 book ai didi

php - htmlspecialchars 和 mysql_real_escape_string 是否可以防止我的 PHP 代码被注入(inject)?

转载 作者:IT老高 更新时间:2023-10-28 11:47:57 28 4
gpt4 key购买 nike

今天早些时候有人问了一个关于 input validation strategies in web apps 的问题。 .

在撰写本文时,最佳答案建议在 PHP 中仅使用 htmlspecialcharsmysql_real_escape_string

我的问题是:这样就够了吗?还有更多我们应该知道的吗?这些功能在哪里分解?

最佳答案

当涉及到数据库查询时,请始终尝试使用准备好的参数化查询。 mysqliPDO 库支持这一点。这比使用 mysql_real_escape_string 等转义函数要安全得多。

是的,mysql_real_escape_string 实际上只是一个字符串转义函数。它不是 Elixir 。它将做的只是转义危险字符,以便它们可以安全地用于单个查询字符串。但是,如果您不事先对输入进行清理,那么您将容易受到某些攻击向量的攻击。<​​/p>

想象一下下面的 SQL:

$result = "SELECT fields FROM table WHERE id = ".mysql_real_escape_string($_POST['id']);

您应该能够看到这很容易被利用。
想象一下 id 参数包含常见的攻击向量:

1 OR 1=1

那里没有要编码的危险字符,因此它将直接通过转义过滤器。离开我们:

SELECT fields FROM table WHERE id= 1 OR 1=1

这是一个可爱的 SQL 注入(inject)向量,允许攻击者返回所有行。或者

1 or is_admin=1 order by id limit 1

产生

SELECT fields FROM table WHERE id=1 or is_admin=1 order by id limit 1

这允许攻击者在这个完全虚构的示例中返回第一个管理员的详细信息。

虽然这些功能很有用,但必须小心使用。您需要确保所有 Web 输入都经过一定程度的验证。在这种情况下,我们看到我们可以被利用,因为我们没有检查我们用作数字的变量是否实际上是数字。在 PHP 中,您应该广泛使用一组函数来检查输入是否为整数、 float 、字母数字等。但是当涉及到 SQL 时,请注意大多数准备好的语句的值。如果上面的代码是一个准备好的语句,那么上面的代码就会是安全的,因为数据库函数会知道 1 OR 1=1 不是有效的文字。

至于 htmlspecialchars()。这本身就是一个雷区。

PHP 中存在一个真正的问题,它有一系列不同的与 html 相关的转义函数,并且没有明确的指导说明哪些函数具体做什么。

首先,如果你在一个 HTML 标记中,你就遇到了真正的麻烦。看看

echo '<img src= "' . htmlspecialchars($_GET['imagesrc']) . '" />';

我们已经在一个 HTML 标记中,所以我们不需要 < 或 > 来做任何危险的事情。我们的攻击向量可能只是 javascript:alert(document.cookie)

现在生成的 HTML 看起来像

<img src= "javascript:alert(document.cookie)" />

攻击直接通过。

情况变得更糟。为什么?因为 htmlspecialchars (以这种方式调用时)只编码双引号而不是单引号。所以如果我们有

echo "<img src= '" . htmlspecialchars($_GET['imagesrc']) . ". />";

我们的邪恶攻击者现在可以注入(inject)全新的参数

pic.png' onclick='location.href=xxx' onmouseover='...

给我们

<img src='pic.png' onclick='location.href=xxx' onmouseover='...' />

在这些情况下,没有 Elixir ,您只需要自己清理输入即可。如果您尝试过滤掉不良字符,您肯定会失败。采取白名单方法,只让好的字符通过。看XSS cheat sheet举例说明向量的多样性

即使您在 HTML 标记之外使用 htmlspecialchars($string),您仍然容易受到多字节字符集攻击向量的攻击。<​​/p>

最有效的方法是使用 mb_convert_encoding 和 htmlentities 的组合,如下所示。

$str = mb_convert_encoding($str, 'UTF-8', 'UTF-8');
$str = htmlentities($str, ENT_QUOTES, 'UTF-8');

即使这样,IE6 也容易受到攻击,因为它处理 UTF 的方式。但是,您可以回退到更有限的编码,例如 ISO-8859-1,直到 IE6 的使用率下降。

有关多字节问题的更深入研究,请参阅 https://stackoverflow.com/a/12118602/1820

关于php - htmlspecialchars 和 mysql_real_escape_string 是否可以防止我的 PHP 代码被注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/110575/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com