PHP中的最佳安全方法?

PHP中的最佳安全方法?,php,mysql,security,xss,Php,Mysql,Security,Xss,我基本上是获取用户的输入,将其存储在MySQL数据库中,然后将其输出给同一用户和其他用户 现在,我正在对用户输入的所有内容应用mysql\u real\u escape\u string(),并且每当有内容被回响(然后通过AJAX显示给用户),我就会应用htmlspecialchars() 这样行吗?还有更好的吗?我想要一个简单,安全的解决方案,保持文本干净。最好,我也希望在文本进入数据库之前对其进行保护,因为在这里,一致性对我来说很重要 谢谢 如果你的意思是“干净”如“安全”,那么htmlsp

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

现在,我正在对用户输入的所有内容应用
mysql\u real\u escape\u string()
,并且每当有内容被回响(然后通过AJAX显示给用户),我就会应用
htmlspecialchars()

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

谢谢

如果你的意思是“干净”如“安全”,那么
htmlspecialchars()
就很好了。您可能需要使用
htmlentities()
,它编码所有字符,而不仅仅是特殊字符

一些字符通过
htmlentities()
htmlspecialchars()
(那些不是拉丁语的字符)获得,因此,您可能希望对输出进行“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;
}

但实际上,最好是将条目留在数据库中,而不转义html。插入数据时,可以使用(见下图)或继续使用您一直使用的mysql\u real\u escape\u字符串。

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

请查看右侧“相关”列表中的一些问题。希望他们能解决你的问题。保罗-我宁愿用我更简单和熟悉的东西,但我会研究一下。是的,但我认为我的案例更具体,因为我想在输入数据进入数据库之前对其进行完全过滤。我基本上希望它存储为纯文本,删除xss和注入威胁。好的,然后查看
magic_wand()
。但实际上,只需花一些时间学习PDO。一旦你这么做了,你就会对它很熟悉了——在输出上对抗XSS/CSRF更有意义——当你的输出被格式化为JSON、XML和HTML时,威胁是不同的;您应该在输出时正确设置输出数据的格式。对于SQL注入,使用诸如PDO之类的工具更容易,因为它们不会遇到SQL注入问题,并且不需要对数据进行混合。(你见过多少次网站会说一些愚蠢的话,比如
你好,O'Malley!
别担心,开心点
?太多次了。不要弄乱你的数据。)最安全的系统根本就不是系统。
//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);