我有以下功能来清理来自用户或网址的输入:
function SanitizeString($var)
{
$var=stripslashes($var);
$var=htmlentities($var, ENT_QUOTES, 'UTF-8');
$var=strip_tags($var);
return $var;
}
我不知道除了这个php函数之外是否还要使用该函数:
mysql_real_escape_string()..
我也不知道我是否采取了所有预防措施来消毒该输入
我也有剥离标签的问题。因为我使用的是tiny_MCE ..而且不剥离它们很重要..
如何将html字符的状态作为html字符返回到数据库之前返回?
答案 0 :(得分:2)
消毒输入先验,无论如何,都是错误的。剥离标签与数据库有什么关系?从什么时候恶意脚本在数据库中运行? 过度谨慎是一件好事,除非你在没有逻辑的情况下这样做。
仅根据“可疑”内容需要去的地方进行消毒。
数据库?然后为数据库转义,以避免SQL注入。使用mysql_real_escape_string()
或参数化查询即可设置。
Html页面?清理你的HTML,以避免XSS和其他令人讨厌的事情。使用htmlentities()
或其他更复杂的解决方案,但必须在输出之前完成。
如果你在你的数据库中保存一个html页面,然后你删除所有标签怎么办(btw,strip_tags()这个工作很糟糕,并且在htmlentities()
之后调用它不是最好的事情)?如果你以后需要html回来怎么办?试想一下,数据库使用<script>
标签或链接到malaware有什么危害?它们只有在页面上打印时才有害吗?
要解码表单htmlentities(),只需使用.. html_entity_decode()
答案 1 :(得分:0)
在(MYSQL)数据库中存储内容时,您需要使用mysql_real_escape_string
。如果您正在使用PDO和准备好的声明,PDO将为您提供转发服务。这可以保护您免受SQL注入攻击。
当您打印用户生成的内容(文本,评论等)时,您需要在输出任何内容之前使用htmlspecialchars
或htmlentitites
等。哪一个适合取决于您的使用案例。无论你决定什么,你只需要一个。这将保护您免受XSS攻击。
只要magic quotes are disabled,您就永远不需要stripslashes
等。
答案 2 :(得分:0)
如果您正在讨论如何清理在将其放在屏幕上之前出现的HTML(您在问题中没有提到但在评论中没有提到),那么它比您想象的要复杂得多
看看: http://iamcal.com/publish/articles/php/processing_html/ 和 http://www.iamcal.com/publish/articles/php/processing_html_part_2/