1

私はしばらくの間この問題を修正しようとしてきました、私はそれの解決策を探すためにウェブ上で無限の時間を費やしました。ですから、私はこの問題で終わりを迎えているので、皆さんのところに来ると思いました。基本的に私はしばらく前に設計したCMSシステムを持っていますが、最近PDOなどを使用して最新の標準に更新しました。MySQLデータベースへのアンパサンド(&)の挿入に問題があるようです。すべてが'UTF-に設定されています。 8'、PDO接続、MySQL照合、すべてですが、何らかの理由で、textareaからのフォームにアンパサンドがある場合、データは送信されますが、アンパサンドに達すると、それを解析しているかのように切断されます。アンパサンドは脆弱性であると考えているため、切断します。

PHPで挿入するための私のコードは次のとおりです。

            $fbl = $_POST['fblValue'];
        $fbr = $_POST['fbrValue'];
        $sbl = $_POST['sblValue'];
        $sbr = $_POST['sbrValue'];
        $tbl = $_POST['tblValue'];
        $tbr = $_POST['tbrValue'];
        $fblDisabled = $_POST['fblDisabled'];
        $fbrDisabled = $_POST['fbrDisabled'];
        $sblDisabled = $_POST['sblDisabled'];
        $sbrDisabled = $_POST['sbrDisabled'];
        $tblDisabled = $_POST['tblDisabled'];
        $tbrDisabled = $_POST['tbrDisabled'];
        $footer = $_POST['footerValue'];
        $copyright = $_POST['copyrightValue'];

        $statement = $conn->prepare("UPDATE pages SET FBL = :fbl, 
                                                    FBLDisabled = :fblDisabled, 
                                                    FBR = :fbr, 
                                                    FBRDisabled = :fbrDisabled, 
                                                    SBL = :sbl, SBLDisabled = :sblDisabled, 
                                                    SBR = :sbr, SBRDisabled = :sbrDisabled, 
                                                    TBL = :tbr, TBLDisabled = :tblDisabled, 
                                                    TBR = :tbr, TBRDisabled = :tbrDisabled, 
                                                    Footer = :footer, 
                                                    Copyright = :copyright 
                                                    WHERE ID = :pageToEdit");
        $statement->bindParam(":fbl", $fbl);
        $statement->bindParam(":fblDisabled", $fblDisabled);
        $statement->bindParam(":fbr", $fbr);
        $statement->bindParam(":fbrDisabled", $fbrDisabled);
        $statement->bindParam(":sbl", $sbl);
        $statement->bindParam(":sblDisabled", $sblDisabled);
        $statement->bindParam(":sbr", $sbr);
        $statement->bindParam(":sbrDisabled", $sbrDisabled);
        $statement->bindParam(":tbl", $tbl);
        $statement->bindParam(":tblDisabled", $tbDisabled);
        $statement->bindParam(":tbr", $tbr);
        $statement->bindParam(":tbrDisabled", $tbrDisabled);
        $statement->bindParam(":footer", $footer);
        $statement->bindParam(":copyright", $copyright);
        $statement->bindParam(":pageToEdit", $pageToEdit);
        $statement->execute();              
    }

また、ajaxを使用してデータを送信していることを付け加えてもよいですか、それが何か関係がある可能性はありますか?

AJAXコードは次のとおりです。

<script type="text/javascript">


        function savePage(str1, str2, str3, str4, str5, str6, str7, str8, str9, str10, str11, str12, str13, str14)
        {
            var xmlhttp;

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

            xmlhttp.open("post", "putEditedPage.php", true);
            xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
            xmlhttp.send("fblValue=" + str1 + "&fbrValue=" + str2 + "&sblValue=" + str3 + "&sbrValue=" + str4 + "&tblValue=" + str5 + "&tbrValue=" + str6 + "&fblDisabled=" + str7 + "&fbrDisabled=" + str8 + "&sblDisabled=" + str9 + "&sbrDisabled=" + str10 + "&tblDisabled=" + str11 + "&tbrDisabled=" + str12 + "&footerValue=" + str13 + "&copyrightValue=" + str14);
            document.getElementById('blackout').style.display="block";
            document.getElementById('Alert').style.display="block";
            document.getElementById('Alert').style.marginTop=((window.innerHeight/2)+((window.innerHeight/100) * 35))+"px";
            setTimeout(function(){
                document.getElementById('blackout').style.display='none';           
                document.getElementById('Alert').style.display='none';
            }, 1250);
        }
        function insertTab(o, e)
        {
            var kC = e.keyCode ? e.keyCode : e.charCode ? e.charCode : e.which;
            if (kC == 9 && !e.shiftKey && !e.ctrlKey && !e.altKey)
            {
                var oS = o.scrollTop;
                if (o.setSelectionRange)
                {
                    var sS = o.selectionStart;
                    var sE = o.selectionEnd;
                    o.value = o.value.substring(0, sS) + "\t" + o.value.substr(sE);
                    o.setSelectionRange(sS + 1, sS + 1);
                    o.focus();
                }
                else if (o.createTextRange)
                {
                    document.selection.createRange().text = "\t";
                    e.returnValue = false;
                }
                o.scrollTop = oS;
                if (e.preventDefault)
                {
                    e.preventDefault();
                }
                return false;
            }
            return true;
        }

    </script>

よろしくお願いします。

4

3 に答える 3

3

ここで:

xmlhttp.send("fblValue=" + str1 + "&fbrValue=" + str2 + "&sblValue=" + str3 + ...
                                   ^                     ^

それらのアンパサンドを見ますか?これらはURLエンコードの特殊文字です。アンパサンド自体を含む値を送信するには、URLエンコードを使用してそのアンパサンドをエスケープする必要があります。したがって、encodeURIComponent値をURLエンコードされた文字列に連結する前の値。

多分私はあなたに興味を持ってもらうことができます:偉大な現実逃避(または:テキスト内のテキストを扱うためにあなたが知る必要があること)

于 2012-11-05T19:34:29.943 に答える
0

特殊文字は、PDO、Ajax、XMLでサポートされています。

ここには小さな穴が必要です:「すべてが「UTF-8」に設定されています」。

これらを確認してください。

  1. HTMLページの文字セット(ここでは<head></head>:)

  2. JSファイルのエンコーディング?

    <script src="file.js" type="text/javascript" charset="utf-8">

  3. XML(どこにあるのかわかりません)

  4. データベース接続(セット名、照合)

  5. 特定の列に設定された照合

  6. ソースファイルの文字セット

  7. JavaScriptでエディタを使用している場合、設定ファイルに文字セットが含まれている可能性がありますか?

「ステップバイステップ」のデバッグを試すことができます。AJAXなしでアンパサンドを挿入しようとする場合があります。

于 2012-11-05T20:15:36.850 に答える
-2

http://php.net/manual/en/function.urlencode.phpおよびhttp://php.net/manual/en/function.urldecode.phpを使用する能力を忘れないでください

于 2012-11-05T19:34:05.643 に答える