15

目前,我采用“把所有东西都扔在墙上,看看有什么东西会粘住”的方法来阻止上述问题。以下是我拼凑的功能:

function madSafety($string)
{

$string = mysql_real_escape_string($string);
$string = stripslashes($string);
$string = strip_tags($string);
return $string;

}

但是,我相信有更好的方法来做到这一点。我正在使用 FILTER_SANITIZE_STRING,这似乎并不完全安全。

我想我在问,你们采用了哪些方法,它们有多成功?谢谢

4

4 回答 4

36

只是做很多你并不真正理解的事情,对你没有帮助。您需要了解什么是注入攻击,以及您应该如何以及在哪里做什么。

在要点中:

  • 禁用魔术引号。它们是一个不充分的解决方案,它们使事情变得混乱。
  • 切勿将字符串直接嵌入 SQL 中。使用绑定参数,或转义(使用mysql_real_escape_string)。
  • stripslashes当您从数据库中检索数据时,不要转义(例如)。
  • 当你在 html 中嵌入字符串时(例如当你echo),你应该默认转义字符串(使用htmlentitieswith ENT_QUOTES)。
  • 如果需要在 html 中嵌入 html-strings,则必须考虑字符串的来源。如果它不受信任,则应通过过滤器对其进行管道传输。strip_tags理论上是你应该使用的,但它有缺陷;请改用HtmlPurifier

另请参阅:使用 PHP 清理用户输入的最佳方法是什么?

于 2009-02-20T10:52:58.240 回答
10

对抗 SQL 注入的最好方法是绑定变量,而不是将它们“注入”到字符串中。 http://www.php.net/manual/en/mysqli-stmt.bind-param.php

于 2009-02-20T10:21:00.627 回答
3

不要!使用mysql_real_escape_string足以保护您免受 SQL 注入,而stropslashes之后所做的事情会使您容易受到 SQL 注入的攻击。如果你真的想要它,把它放在前面

function madSafety($string)
{
    $string = stripslashes($string);
    $string = strip_tags($string);
    $string = mysql_real_escape_string($string);
    return $string;
}

stripslashes如果你在做mysql_real_escape_string.

strip_tags防止 HTML/XML 注入,而不是 SQL。

需要注意的重要一点是,您应该根据您对它的即时使用以不同的方式转义您的字符串。

当您执行 MYSQL 请求时,请使用mysql_real_escape_string. 当您输出网页时,请使用htmlentities. 要建立网络链接,请使用urlencode……</p>

正如 vartec 所指出的,如果您可以使用占位符,请务必这样做。

于 2009-02-20T10:16:23.833 回答
1

这个话题太不对劲了!

您不应该过滤用户的输入!这是他输入的信息。如果我希望我的密码是这样的,你会怎么做:'"'>s3cr3t<script>alert()</script>

过滤字符并让我更改密码,所以我什至无法在第一次登录时成功?这是不好的。

正确的解决方案是使用准备好的语句或mysql_real_escape_string()避免 sql 注入并使用上下文感知的字符转义来避免您的 html 代码被弄乱。

让我提醒您,网络只是您可以表示用户输入的信息的方式之一。如果某些桌面软件这样做,您会接受这样的剥离吗?我希望您的回答是否定的,并且您会理解为什么这不是正确的方法。

请注意,在不同的上下文中,必须转义不同的字符。例如,如果您需要将用户名显示为工具提示,您将使用如下内容:

<span title="{$user->firstName}">{$user->firstName}</span>

但是,如果用户将他的名字设置为 like'"><script>window.document.location.href="http://google.com"</script>你会怎么做?去掉引号?这样就大错特错了!与其胡说八道,不如考虑在渲染数据时转义引号,而不是在持久化数据时!

您应该考虑的另一个上下文是在呈现值本身时。考虑之前使用的 html 代码,并想象用户名是<textarea>. 这会将后面的所有 html 代码包装到这个 textarea 元素中,从而分解整个页面。

再一次 - 考虑根据您使用它的上下文转义数据!

PS 不太确定如何对这些反对票作出反应。各位,你们真的在看我的回复吗?

于 2013-11-01T13:01:06.230 回答