2011-03-03 75 views
3

我在我的网站上有一个TextArea,它将输入写入我的数据库。PHP - 非破坏性输入消毒

我想筛选此TextArea输入,但不删除任何HTML标记或其他东西。

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

我该如何做到这一点?

回答

3

如果你想保留字符数据字符时,它的写回网站尝试:

$stringToPutOnPage = htmlentities($databaseString); 

如果你想在html:从数据库中检索时,它

$stringToSave = mysql_real_escape_string($inputString); 

然后实际上被读为html(请注意XSS),您可以使用:

$stringToSave = mysql_real_escape_string($inputString); 

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

+2

**从来没有**进一步后处理任何字符串,他们已经通过'mysql_real_escape_string'!在将值插入查询之前,SQL转义始终是您做的最后一件事,而在任何其他情况下,SQL都是毫无意义的。 – deceze 2011-03-03 01:43:23

+0

感谢Deepmist,你的解决方案实际上是非常有效的。 – 2011-03-03 01:57:34

+0

将数据放入数据库时​​,不应该使用HTML。为了显示而逃避它更有意义;在打印HTML之前。 – 2011-03-03 02:04:14

2

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

+3

更好使用mysql_real_escape_string,因为mysql_escape_string现在已被弃用。 – Rasika 2011-03-03 01:33:01

+0

是啊是修复,因为你评论:D – Hamish 2011-03-03 01:33:20

+0

检索和显示使用strip_slashes() – Rasika 2011-03-03 01:34:13

1

这真的很简单:

  • 为了避免SQL注入,它们串联成一个SQL查询之前mysql_real_escape_string你的价值观,或者使用不从摆在首位畸形字符串遭受参数化查询。
  • 为了避免XSS问题和/或HTML混乱,HTML在将它们插入HTML上下文之前将其转义。
  • JSON逃脱他们在一个JSON背景下,CSV逃避他们在一个CSV背景等页。

所有都是同样的问题,真的。作为一个非常简单的例子,为了生成字符串"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。在那个时候这样做是必要的。不要过早或超越你的价值观,只在正确的时间在正确的上下文中适用适当的转义函数。