2012-07-06 137 views
0

我基本上是把用户的输入,存储在一个MySQL数据库中,然后输出给同一个用户和其他用户。在PHP中安全的最佳方法?

现在,我申请到mysql_real_escape_string()由用户输入的所有的东西,每当东西呼应(然后通过AJAX显示给用户),我申请htmlspecialchars()

这样好吗?有更好的吗?我想要一个简单,安全的解决方案,保持文本清洁。最好是,我还想在之前保证文本进入数据库,因为这里的一致性对我很重要。

谢谢!

+4

开始查看PDO – 2012-07-06 00:16:32

+2

请查看右边“相关”列表中的一些问题。希望他们能解决你的担忧。 – 2012-07-06 00:18:08

+0

保罗 - 我宁愿使用更简单,更熟悉的东西,但我会研究它。奥利 - 我做过了,但我认为我的情况更具体,因为我想在输入数据库之前完全过滤输入。我基本上希望它以纯文本形式存储,并删除了xss和注入威胁。 – Gus 2012-07-06 00:21:20

回答

2

如果您的意思是“干净”,如“安全”htmlspecialchars()是相当好的。您可能想要使用htmlentities(),它将编码所有字符,而不仅仅是特殊字符。

某些字符得到htmlentities()htmlspecialchars()(那些不是Latin1的),因此您可能需要“UTF-8证明”您的输出。您可以在PHP文档上使用我在a comment上找到的这个函数。

// 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; 
} 

至于逃跑,当它进入数据库的数据,您可以插入到数据库前应用ヶ辆。然后,当你输出时,你可以再次做好测量,但一定不要加倍编码否则你将无法读取任何东西。这是一个例子。

//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(这里是an ok tutorial),或者继续使用你一直使用的mysql_real_escape_string。

-1

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

相关问题