php mysql注入点_关于php:防御mysql注入和跨站点脚本的最佳方法

目前,我采用了"把所有东西扔在墙上,看看有什么方法"来阻止上述问题。 以下是我拼凑在一起的功能:

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等)。同样,问题是如何逃避数据,而不是如何过滤或应用审查。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值