PHP - 非破坏性输入消毒

时间:2011-03-03 01:28:43

标签: php mysql apache textarea sanitization

我的网站上有一个TextArea,我把输入写入我的数据库。

我想过滤此TextArea输入,但不删除任何HTML标记或其他内容。

简而言之,我希望在将输入写入数据库之前对输入进行整理和安全化,但是当我从数据库中取回条目并将其写入网站时,我希望条目保持完整且未修改。

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:3)

如果要在将字符写回网站时保留字符的数据字符,请尝试:

$stringToSave = mysql_real_escape_string($inputString);

然后从数据库中检索它时:

$stringToPutOnPage = htmlentities($databaseString);

如果您希望html实际上被读作html(小心XSS),您可以使用:

$stringToSave = mysql_real_escape_string($inputString);

编辑:看起来最好的做法是在从数据库中检索之后清除html的字符串,而不是之前。感谢您的评论,我将不得不改变我的方法。

答案 1 :(得分:2)

如果您的意思是您只想让它安全存储在您的数据库中,您只需使用特定于数据库的转义方法,例如mysql_real_escape_string。当然,这并不能保护您免受XSS攻击,但如果您想要检索并显示未修改,则无法做出选择。

答案 2 :(得分:1)

这很简单:

  • 为避免SQL注入,在将它们连接到SQL查询之前mysql_real_escape_string使用您的值,或者首先使用不会出现格式错误的字符串的参数化查询。
  • 为了避免XSS问题和/或弄乱HTML,HTML会在将它们插入HTML上下文之前转义您的值。
  • JSON在JSON上下文中转义它们,CSV在CSV上下文中转义它们等.pp。

所有都是同样的问题,真的。作为一个非常简单的例子,要生成字符串"test"(我希望引号是字符串的一部分),我不能写字符串文字$foo = ""test""。我必须转义引号中的引号,以明确哪些引号应该结束字符串,哪些是字符串的一部分:$foo = "\"test\""

SQL注入,XSS问题和混乱的HTML都只是一个变种。
要将包含引号的值插入查询,您遇到与上面相同的问题:

$comment = "\"foo\"";  // comment is "foo", including quotes
$query = 'INSERT INTO `db` (`comment`) VALUES ("' . $comment . '")';
       // INSERT INTO `db` (`comment`) VALUES (""foo"")

最多会产生无效语法,最糟糕的是SQL注入攻击。使用mysql_real_escape_string可以避免这种情况:

$query = 'INSERT INTO `db` (`comment`) VALUES ("' . mysql_real_escape_string($comment) . '")';
       // INSERT INTO `db` (`comment`) VALUES ("\"foo\"")

HTML转义完全相同,只是语法问题不同 您只需要使用正确的方法在正确的上下文中转义值。要转义HTML的值,请使用htmlentities。在必要的时候这样做。不要过早或过度逃避您的值,只在适当的时间在适当的上下文中应用适当的转义函数。