mysqli_real_escape_string使程序无用

时间:2014-05-09 12:54:12

标签: php mysql mysqli emoticons

下面的代码使用字符串保护其使用mysqli_real_escape_string。 但是如果没有mysqli_real_escape_string但是需要保护,那么预期输出工作正常。

  $str = mysqli_real_escape_string($con,$_POST['str']);
    /*
      get each word in the sentence using for-loop then 
    */
    switch($eachword){
        case ':)': $eachword = '<img src="smile.gif">';
        break; 
    /*
      and so forth and so on
    */
    }


    $newstr .= $eachword;
    //for-loop ends


**mysqli_query($con,"insert into tbl(comment)VALUES($newstr)");**

例如

  • 输入:$ str =“我在这里:)很好”;

  • 预期输出:$newstr="here i am <img src="smile.gif"> fine";

  • curernt输出:$newstr="here i am :) fine";

更新

现在一切正常。感谢支持者。

2 个答案:

答案 0 :(得分:4)

您之前的某些数据正在运行mysqli_real_escape_string ...在您的代码示例中根本没有使用。所以它没有任何意义。

在将变量插入SQL字符串之前,立即使用mysqli_real_escape_string 。 (更好的是,使用准备好的查询和绑定参数)。

如果您尝试防御XSS,请在将变量插入HTML字符串之前立即使用htmlspecialchars

在将用户输入与某些文字进行比较之前,请不要使用它们。

答案 1 :(得分:1)

已更新

请注意,您必须已连接到数据库才能使mysqli_real_escape_string正常工作,因为它会考虑所选数据库的默认字符集。您在使用数据库之前是否连接到数据库?

在你的问题中,我甚至没有看到查询。除非您要将传递的字符串插入数据库,否则使用mysqli_real_escape_string没有任何优势。

现在我看到你用标签替换了smileys,然后你将它插入数据库。但是,如果我是你,我会做以下事情:

function ParseSmiley($str)
{
    $smileys = array(
        ':)' => "<img src='smile.gif' />" //Put all your smileys in this array
    );

    $parsed_string = strtr($str, $smileys);
    return $parsed_string;
}

当您将内容插入数据库时​​,请勿将其转换为标记。相反,当您显示它时,请使用函数ParseSmiley()

$parsed_string = mysqli_real_escape_string($con,$_POST['str']);

mysqli_query($con,"INSERT INTO tbl (comment) VALUES ($parsed_string)");    

然后,当您想要显示内容时,假设该字符串位于$content中,请显示如下:

echo ParseSmiley($content);