我实际上是在获取用户的输入,将其存储在 MySQL 数据库中,然后将其输出给同一用户和其他用户。
现在,我正在应用mysql_real_escape_string()
用户输入的所有内容,并且每当回显某些内容(然后通过 AJAX 显示给用户)时,我都会应用htmlspecialchars()
.
这个可以吗?有更好的吗?我想要一个简单、安全的解决方案,让文本保持干净。最好,我还想在文本进入数据库之前对其进行保护,因为在这里一致性对我很重要。
谢谢!
如果您的意思是“干净”,就像“安全”一样,那htmlspecialchars()
很好。您可能想要使用htmlentities()
,它对所有字符进行编码,而不仅仅是特殊字符。
一些字符通过htmlentities()
and htmlspecialchars()
(那些不在 Latin1 中的字符),因此,您可能希望“UTF-8 证明”您的输出。您可以使用我找到的这个函数作为对 PHP 文档的评论。
// Unicode-proof htmlentities.
// Returns 'normal' chars as chars and weirdos as numeric html entites.
function superentities( $str ){
// get rid of existing entities else double-escape
$str = html_entity_decode(stripslashes($str),ENT_QUOTES,'UTF-8');
$ar = preg_split('/(?<!^)(?!$)/u', $str ); // return array of every multi-byte character
foreach ($ar as $c){
$o = ord($c);
if ( (strlen($c) > 1) || /* multi-byte [unicode] */
($o <32 || $o > 126) || /* <- control / latin weirdos -> */
($o >33 && $o < 40) ||/* quotes + ambersand */
($o >59 && $o < 63) /* html */
) {
// convert to numeric entity
$c = mb_encode_numericentity($c,array (0x0, 0xffff, 0, 0xffff), 'UTF-8');
}
$str2 .= $c;
}
return $str2;
}
至于在进入数据库时转义数据,您可以在插入数据库之前应用 htmlentities。然后,当你输出时,你可以再做一次,但一定不要双重编码,否则你将无法读取任何内容。这是一个例子。
//Decode existing htmlentities
$OutputStringRaw = html_entity_decode(stripslashes($str),ENT_QUOTES,'UTF-8');
//Now you can apply htmlentities (or wtv else) w/o fear of double encoding.
$OutputStringClean = htmlentities($OutputStringRaw);
但实际上,最好只将条目留在数据库中而不转义 html。当你插入你的数据时,要么使用PDO(这里有一个好的教程),要么继续使用你一直在使用的 mysql_real_escape_string。
您可以在文本进入数据库之前使用 md5 加密来保护文本。但是现在使用 md5 哈希并不那么安全,它是可解密的。如果有人可以访问您的数据库,他们将能够解密密码。您可以使用 bcrypt,我认为这是一种非常好的加密方法。