我的网站上有一个TextArea
,我将输入写入我的数据库。
我想过滤这个TextArea
输入,但不删除任何 HTML 标签或其他东西。
简而言之,我想在将输入写入数据库之前对其进行清理和保护,但是当我从数据库中取回输入并将其写入网站时,我希望输入保持完整且未修改。
我怎样才能做到这一点?
如果你的意思是你只是想让它安全地存储在你的数据库中,你需要做的就是使用数据库特定的转义方法,例如mysql_real_escape_string。当然,这并不能保护您免受 XSS 攻击,但是如果您想在未修改的情况下检索并显示它,您别无选择。
如果您想在写回网站时保留数据字符,请尝试:
$stringToSave = mysql_real_escape_string($inputString);
然后在从数据库中检索它时:
$stringToPutOnPage = htmlentities($databaseString);
如果您希望将 html 实际读取为 html(请注意 XSS),您可以使用:
$stringToSave = mysql_real_escape_string($inputString);
编辑:似乎最好的做法是在从数据库中检索它之后而不是之前清理 html 的字符串。感谢您的意见,我将不得不改变我的方法。
这真的很简单:
mysql_real_escape_string
您的值在将它们连接到 SQL 查询之前,或者首先使用不受格式错误字符串影响的参数化查询。都是同一个问题,真的。作为一个非常简单的示例,要生成字符串"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
. 在必要的时候这样做。不要过早或过度转义您的值,仅在正确的时间在正确的上下文中应用适当的转义函数。