我正在为我的网站建立一个评论系统。问题是我想使用HTML编辑器,但不是完全必要的。
我的问题是安全。如何保护我保存在数据库中的用户输入?因为我在我的网站上显示输入,我想防止XSS, SQL注入和其他类似的事情。但是我仍然希望我的用户能够书写任何字符。
例如,daniweb使用和HTML编辑器(wysiwyg .
)我也试过
function bstring( $value )
{
$value = htmlentities( $value, ENT_QUOTES );
$value = strip_tags( $value );
$value = mysql_real_escape_string( $value );
return (string)$value;
}
如果使用mysqli你可以这样写:
$mysqli->real_escape_string($value);
转义字符串中的特殊字符以供SQL语句使用
如果您希望允许用户输入HTML标记,但不允许他使用某些标记(如Scripts),则应该为标记实现某种形式的白名单。
$allowed_tags = "<b><i><br>"; // Some safe examples
$value = strip_tags( $value, $allowed_tags );
总是知道何时以及为什么使用哪个过滤器:
- mysql_real_escape_string -保护您的SQL免受注入-如果没有使用适当的参数绑定连接器总是需要的
- strip_tags -从页面上显示的不安全输出中删除不需要的标签。可用于对抗XSS攻击-参见上文
- htmlspecialchars -编码html标签,使它们不再工作。防止XSS,但也删除了HTML功能-你不希望这样,因为你实际上希望用户使用HTML标签
htmlentities不提供安全性
则需要使用replace删除HTML下面是你想禁止的标签和你想允许的标签
function bstring($str){
//forbid your tags here
$forbidden_tags = array('script', 'body', 'html');
for($i = 0; $i < count($forbidden_tags); $i++){
$tag = '%<'.$forbidden_tags[$i].'.*?</'.$forbidden_tags[$i].'>%i';
$result = preg_replace($tag, 'NOT ALLOWED', $str);
}
return $result;
}
可以使用Doctrine: http://en.wikipedia.org/wiki/Doctrine_%28PHP%29
Doctrine的关键特性之一是可以选择用一种专有的、名为Doctrine查询语言(Doctrine Query Language, DQL)的面向对象SQL方言编写数据库查询。实际的SQL查询仅由Doctrine生成(这将防止SQL注入和其他类似的事情)。
官方网站:http://www.doctrine-project.org/
阅读这篇关于安全的文章:http://www.doctrine-project.org/2014/02/21/security_in_doctrine.html