jpj*_*pjp 7 php mysql security xss
function sanitizeString($var)
{
$var = stripslashes($var);
$var = htmlentities($var);
$var = strip_tags($var);
return $var;
}
function sanitizeMySQL($var)
{
$var = mysql_real_escape_string($var);
$var = sanitizeString($var);
return $var;
}
Run Code Online (Sandbox Code Playgroud)
我从一本书中得到了这两个函数,作者说通过使用这两个函数,我可以对XSS(第一个函数)和sql注入(第二个函数)更加安全.这些都是必要的吗?
另外,对于清理,我使用预准备语句来防止sql注入.
我会像这样使用它:
$variable = sanitizeString($_POST['user_input']);
$variable = sanitizeMySQL($_POST['user_input']);
Run Code Online (Sandbox Code Playgroud)
编辑:摆脱第一个函数的strip_tags,因为它没有做任何事情.使用这两个功能是否足以阻止大多数攻击并且对公共站点没问题?
Gum*_*mbo 10
说实话,我认为这些函数的作者要么不知道XSS和SQL注入是什么,或者使用的函数到底是做什么的.
仅举两个奇怪之处:
stripslashesafter mysql_real_escape_string删除添加的斜杠mysql_real_escape_string.htmlentities替换聊天<和>用于strip_tags识别标签的聊天.此外:通常,再次保护XSS的功能不适合再次保护SQL注入,反之亦然.因为每种语言和语境都有自己需要处理的特殊字符.
我的建议是了解代码注入的原因和方式,以及如何防范它.了解您正在使用的语言,尤其是特殊字符以及如何逃避这些语言.
编辑 这里有一些(可能是奇怪的)示例:想象一下,您允许您的用户输入一些值,这些值应该用作您在onclick属性值中的某些JavaScript代码中使用的URI中的路径段.因此语言上下文如下所示:
并使其更有趣:您将此输入值存储在数据库中.
现在要将此输入值正确地存储到数据库中,您只需要对要将该值插入数据库语言(即SQL)的上下文使用正确的编码; 其余的并不重要(还).由于您要将其插入到SQL字符串声明中,因此上下文特殊字符是允许您更改该上下文的字符.至于字符串声明这些字符(尤其是)的",'以及\需要的字符转义.但正如已经说过的那样,准备好的语句可以帮助您完成所有工作,因此请使用它
既然您拥有数据库中的值,我们希望正确输出它们.在这里,我们从最里面到最外层的上下文,并在每个上下文中应用适当的编码:
/(保留当前路径段)?,和#(都保留URI路径上下文).我们可以用rawurlencode它.",'和\.我们可以用json_encode它(如果有的话).&,",',和<.我们可以用htmlspecialchars它.一切都在一起:
'… onclick="'.htmlspecialchars('window.open("http://example.com/'.json_encode(rawurlencode($row['user-input'])).'")').'" …'
Run Code Online (Sandbox Code Playgroud)
现在,如果$row['user-input']是"bar/baz"输出为:
… onclick="window.open("http://example.com/"%22bar%2Fbaz%22"")" …
Run Code Online (Sandbox Code Playgroud)
但是在这些背景下使用所有这些功能并不是一种矫枉过正.因为虽然上下文可能具有相似的特殊字符,但它们具有不同的转义序列.URI具有所谓的百分比编码,JavaScript具有转义序列\",HTML具有字符引用".并且不仅仅使用这些功能中的一个将允许打破上下文.
确实如此,但这种逃避水平可能并不适合所有情况.如果要将HTML存储在数据库中该怎么办?
最佳实践规定,您应该在显示它们时将其转义,而不是在接收值时转义.这允许您考虑显示来自数据库的HTML和来自数据库的非HTML,并且无论如何它确实是这种代码在逻辑上属于的地方.
清理传出HTML的另一个优点是可以发现新的攻击媒介,在这种情况下,对传入的HTML进行清理将不会对数据库中已有的值执行任何操作,而传出的清理将追溯应用而无需执行任何特殊操作
此外,请注意,strip_tags在您的第一个函数可能没有任何影响,如果所有<和>已成为<和>.