防御mysql注入和跨站点脚本的最佳方式

目前,我申请了一个“把所有东西都扔在墙上,看看有什么坚持”的方法来阻止上述问题。 以下是我拼凑起来的function:

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

不过,我确信有更好的方法来做到这一点。 我正在使用FILTER_ SANITIZE_STRING,这似乎并不完全安全。

我想我在问,你们采用哪种方法,他们有多成功? 谢谢

只是做了很多你不了解的东西,不会帮你的忙。 你需要了解注射攻击是什么,以及如何和在哪里应该做什么。

在要点上:

  • 禁用魔术引号 。 他们是一个不适当的解决scheme,他们混淆事项。
  • 从不直接在SQL中embeddedstring。 使用绑定的参数或转义(使用mysql_real_escape_string )。
  • 当您从数据库中检索数据时, 不要使用 (例如stripslashes )。
  • 当你在html中embeddedstring(例如,当你echo ),你应该默认转义string( ENT_QUOTES使用htmlentities )。
  • 如果您需要在html中embeddedhtmlstring,则必须考虑string的来源。 如果它不可信,你应该通过一个filter。 strip_tags理论上是你应该使用的,但它是有缺陷的; 改用HtmlPurifier 。

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

防止SQL注入的最好方法是绑定variables,而不是将它们“注入”到string中。 http://www.php.net/manual/en/mysqli-stmt.bind-param.php

不要 ! 使用mysql_real_escape_string足以保护您免受SQL注入的stropslashes您正在执行的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。

重要的是要注意的是,你应该逃避你的string的不同,取决于你使用它的imediate。

当你在做MYSQL请求时,使用mysql_real_escape_string 。 当你输出网页时使用htmlentities 。 build立网页链接使用urlencode

vartec指出,如果你可以使用占位符,所有的手段做到这一点。

这个话题是错的!

你不应该过滤用户的input! 这是他input的信息。 如果我想让我的密码像下面那样,你该怎么办? '"'>s3cr3t<script>alert()</script>

筛选字符,并给我留下一个更改的密码,所以我甚至不能在我的第一次login成功? 这不好。

正确的解决scheme是使用预处理语句或mysql_real_escape_string()来避免sql注入,并使用上下文感知转义的字符,以避免你的HTML代码搞砸了。

让我提醒您,networking只是您可以表示用户input信息的方式之一。 你会接受这样的剥离,如果一些桌面软件呢? 我希望你的回答是否定的,你会明白为什么这是不正确的。

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

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

但是,如果用户已将自己的名字设置为'"><script>window.document.location.href="http://google.com"</script> ,您会怎样做?删除引号?这将是错误的!而不是做这个无意义的,考虑转义数据,而不是在保持它的同时转义引号!

您应该考虑的另一个上下文是呈现值本身。 考虑以前使用的html代码,想象用户的名字就像<textarea> 。 这将包裹所有的HTML代码到这个textarea元素,从而打破了整个页面。

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

PS不知道如何对这些反对票作出反应。 你们真的在看我的回复吗?