0

我在将某些字符从 PHP 保存到 MySql 数据库表时遇到了麻烦。我有一个所见即所得的编辑器,通过它我可以创建页面内容并将它们保存到数据库中。当我的代码中有“”或撇号时,html 文本不会保存到数据库中。以下是我的代码:

向服务器发送数据:

function SaveContent()
    {
        var content = CKEDITOR.instances.ContentEditor.getData();
        content = content.replace(/"/g, "'");
        var page = document.getElementById("hfpage").value;

        if (window.XMLHttpRequest)
        {
            // code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp=new XMLHttpRequest();
        }
        else
        {
            // code for IE6, IE5
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.onreadystatechange=function()
        {
            if (xmlhttp.readyState==4 && xmlhttp.status==200)
            {

                location.href=document.referrer;
            }
        }
        //alert(content);
        xmlhttp.open("GET","savecontent.php?content="+content+"&page="+page,true);
        xmlhttp.send();
    }

用于数据库保存的php代码:

//save content editted/added through the HTML editor
function SaveContent($page, $content, $user)
{
    $con = $this->OpenConnection();
    //first check if the content exists, if so do an update
    $sql  = "SELECT * FROM sitecontent WHERE Page = '" . $page . "'";
    $content = mysql_real_escape_string($content);
    $rowcount = mysqli_num_rows(mysqli_query($con,$sql));
    if( $rowcount > 0 )
    {   
        //run update
        $sql = 'UPDATE `sitecontent` SET `Content`="' . $content . '", `UpdatedBy`="' . $user . '", `LastUpdated`= NOW() WHERE `Page` = "' . $page . '"';
        $result = mysqli_query($con,$sql);
        //echo $sql;
    }
    else 
    {
        //run insert
        $sql = 'INSERT INTO `sitecontent` (`Page`, `Content`, `LastUpdated`, `UpdatedBy`) VALUES ("' . $page . '","' . $content . '", NOW(),"'. $user . '")';
        $result = mysqli_query($con,$sql);
    }
}

请注意,我已经使用了“mysql_real_escape_string”,正如我在论坛上的一些帖子中看到的那样,但这并没有帮助。

感谢是否有人可以帮助我解决这个问题。

4

2 回答 2

2

首先你在混合mysql_mysqli_你应该只坚持一个。

    $content = mysql_real_escape_string($content);
    $rowcount = mysqli_num_rows(mysqli_query($con,$sql));

在上面的代码中,我可以看到你正在使用mysqli_query(),但是,你没有使用prepared statementsAlways,使用 Prepared Statements,当你使用mysqli_因为,这就是它的用途。

还有一件事,mysql_real_escape_stringis 一个mysql_函数,而不是mysqli_'s 所以你需要把它改成mysqli_real_escape_string()

于 2013-07-14T12:16:48.453 回答
2

关于如何正确保存您的内容,Simon _eQ 的回答是正确的。但是,我认为值得指出的是,您遇到的问题是您的数据库对 SQL 注入开放的警告信号。基本上,您的内容没有被保存的原因是因为 ' 被视为查询的一部分。在插入中很难利用这一点,但许多黑客在选择中对您的数据库执行恶意操作,并因此删除查询。

在您尝试转义 $content 时查看您的代码(尽管正如 Simon 指出的那样使用了错误的转义函数),您的 $page 变量似乎没有被转义。我通常会假设该页面是通过 POST 或 GET 传递的值,如果是这样,则可以进行操作...

我建议您研究如何避免使用 mysqli 进行 sql 注入,因为它不仅可以帮助您每次解决问题,还意味着您可以确信您的代码始终是安全的。

这是一个包含更多信息的链接...如何防止 PHP 中的 SQL 注入?

于 2013-07-14T12:29:32.640 回答