目前,我采用了"把所有东西扔在墙上,看看有什么方法"来阻止上述问题。 以下是我拼凑在一起的功能:
function madSafety($string)
{
$string = mysql_real_escape_string($string);
$string = stripslashes($string);
$string = strip_tags($string);
return $string;
}
但是,我确信有更好的方法可以做到这一点。 我正在使用FILTER_ SANITIZE_STRING,这似乎并不完全安全。
我想我在问,你们采用哪种方法,这些方法有多成功? 谢谢
dupe:stackoverflow.com/questions/129677/
这种方法在很多方面都是错误的! 我在下面发布了一个答案,并对每个答案的评分为-1,因为他们的作者拒绝思考。
只做很多你不太了解的事情,对你没有帮助。您需要了解注射攻击是什么,以及您应该如何以及在何处执行操作。
在要点:
禁用魔法引号。他们是一个不充分的解决方案,他们混淆了问题。
永远不要在SQL中直接嵌入字符串。使用绑定参数或转义(使用mysql_real_escape_string)。
从数据库中检索数据时,请勿进行unescape(例如。stripslashes)。
当你在html中嵌入字符串时(例如,当你echo时),你应该默认转义字符串(使用htmlentities和ENT_QUOTES)。
如果需要在html中嵌入html-strings,则必须考虑字符串的来源。如果它不受信任,您应该通过过滤器进行管道传输。 strip_tags理论上你应该使用什么,但它有缺陷;请改用HtmlPurifier。
另请参阅:使用PHP清理用户输入的最佳方法是什么?
优秀 - 这明显优于我写的回应,现在已经放弃了。 +1
真的很好提醒我们所有人:) +1
反对SQL注入的最好方法是绑定变量,而不是将它们"注入"到字符串中。
http://www.php.net/manual/en/mysqli-stmt.bind-param.php
小心使用允许的标签 - 非常好的任何标签都可以嵌入JS。
另外 - 请参阅isisblogs.poly.edu/2008/08/16/
strip_tags有缺陷..转义字符串,或者如果你真的需要允许html,请使用htmlpurifier
别!使用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;
}
如果您正在执行mysql_real_escape_string,则stripslashes不是很有用。
strip_tags可防止HTML / XML注入,而不是SQL。
需要注意的重要一点是,你应该以不同的方式逃避你的字符串,具体取决于你对它的中级用法。
当您执行MYSQL请求时,请使用mysql_real_escape_string。输出网页时,请使用htmlentities。要构建Web链接,请使用urlencode ...
正如vartec所指出的,如果你可以通过各种方式使用占位符。
实际上,mysql_real_escape_string也不完全安全。见ilia.ws/archives/
这个话题太错了!
你不应该过滤用户的输入!这是他输入的信息。如果我想要密码,你打算做什么:'"'>s3cr3talert()
过滤字符并给我更改密码,所以我第一次登录时甚至无法成功?这是不好的。
正确的解决方案是使用预处理语句或mysql_real_escape_string()来避免sql注入并使用上下文感知的字符转义来避免你的html代码搞砸了。
让我提醒您,网络只是您表示用户输入信息的方式之一。如果有一些桌面软件可以接受这种剥离吗?我希望你的答案是否定的,你会理解为什么这不是正确的方法。
请注意,在不同的上下文中,必须转义不同的字符。例如,如果您需要将用户名作为工具提示显示,您将使用以下内容:
{$user->firstName}
但是,如果用户将其名字设置为'">window.document.location.href="http://google.com",您要做什么?剥去报价?这太错了!而不是做这种无意义的,考虑在渲染数据时转义引号,而不是在持久化时!
您应该考虑的另一个上下文是在呈现值本身时。考虑以前使用的html代码,并想象用户的名字就像。这会将后面的所有html代码包装到这个textarea元素中,从而分解整个页面。
再一次 - 考虑根据您使用它的上下文来转义数据!
P.S不确定如何对这些负面投票做出反应。人们,你真的在??看我的回复吗?
请不要删除我的评论,请尝试了解我在说什么。如果用户有一个带有标签的用户名,我就不会剥离标签,我会完全拒绝用户名并强制他们提出一个更少的用户名,原谅我,愚蠢。密码肯定会有所不同,但用户名是吗?拒绝它。
我没有删除你的评论。我标记了它,有人认为旗帜是合适的。用户输入的内容不属于我的业务,??我会照顾我的应用程序以正常运行。理解数据和逃避数据是两件完全不同的事情。请不要把两者搞砸了。您可以拥有任何您想要的用户名,也不能使用表示层(html),也不能使用持久层(mysql,postgre等)。同样,问题是如何逃避数据,而不是如何过滤或应用审查。