目前,我采用了一种“把所有东西都扔到墙上,看看什么能坚持下去”的方法来阻止上述问题。下面是我拼凑出来的函数:
function madSafety($string)
{
$string = mysql_real_escape_string($string);
$string = stripslashes($string);
$string = strip_tags($string);
return $string;
}
然而,我相信有一种更好的方法可以做到这一点。我使用的是FILTER_ SANITIZE_STRING,但这看起来并不完全安全。
我想我是在问,你们采用了哪些方法,它们有多成功?谢谢
发布于 2009-02-20 10:21:01
防止SQL注入的最好方法是绑定变量,而不是将它们“注入”到字符串中。http://www.php.net/manual/en/mysqli-stmt.bind-param.php
发布于 2013-11-01 21:01:06
这个话题太不对劲了!
你不应该过滤用户的输入!这是他输入的信息。如果我想要我的密码,你会怎么做:'"'>s3cr3t<script>alert()</script>
过滤字符并给我一个更改过的密码,这样我就连第一次登录都不能成功?这很糟糕。
正确的解决方案是使用准备好的语句或mysql_real_escape_string()
来避免sql注入,并使用上下文感知的字符转义来避免您的html代码混乱。
让我提醒您,web只是表示用户输入的信息的方式之一。如果一些桌面软件这样做,你会接受这样的剥离吗?我希望你的答案是否定的,你会理解为什么这不是正确的方式。
注意,在不同的上下文中,必须对不同的字符进行转义。例如,如果您需要将用户的名字显示为工具提示,则可以使用以下命令:
<span title="{$user->firstName}">{$user->firstName}</span>
但是,如果用户将他的名字设置为'"><script>window.document.location.href="http://google.com"</script>
,你会怎么做?去掉引号?这就大错特错了!与其这样做毫无意义,不如考虑在呈现数据时转义引号,而不是持久化数据!
您应该考虑的另一个上下文是在呈现值本身时。考虑之前使用的html代码,并设想用户的名字类似于<textarea>
。这将把后面的所有html代码包装到这个textarea元素中,从而拆分整个页面。
再说一次-考虑转义数据,这取决于您使用它的上下文!
另外,我真的不确定如何应对那些反对票。各位,你们真的在读我的回复吗?
https://stackoverflow.com/questions/568995
复制相似问题