0

我实际上是在获取用户的输入,将其存储在 MySQL 数据库中,然后将其输出给同一用户和其他用户。

现在,我正在应用mysql_real_escape_string()用户输入的所有内容,并且每当回显某些内容(然后通过 AJAX 显示给用户)时,我都会应用htmlspecialchars().

这个可以吗?有更好的吗?我想要一个简单、安全的解决方案,让文本保持干净。最好,我还想在文本进入数据库之前对其进行保护,因为在这里一致性对我很重要。

谢谢!

4

2 回答 2

2

如果您的意思是“干净”,就像“安全”一样,那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。

于 2012-07-06T00:29:26.767 回答
-1

您可以在文本进入数据库之前使用 md5 加密来保护文本。但是现在使用 md5 哈希并不那么安全,它是可解密的。如果有人可以访问您的数据库,他们将能够解密密码。您可以使用 bcrypt,我认为这是一种非常好的加密方法。

于 2012-07-06T01:39:00.743 回答