1

mysql_real_escape_string()一重引用符を含むコンテンツをエスケープするために使用する php ページがあります。私はそれがutf-8を使用していると信じています(しかし、よくわかりません)。コンテンツを挿入すると、次の mysql 警告が表示されます (コンテンツに ' の代わりに ? が追加されます)。

正しくない文字列値: '\x92t ...

これが私のphpの例です:

    $link = ConnectToServer($theIntranet, $theUser, $thePW);
$theTagToFind = 'ac';
$theTagToUse = 'trc';
$database = '{databaseName}';
$theQuery = "SELECT * FROM {$database}.templates
            WHERE content like '%{" . $theTagToFind . ":%'";
$updates = fopen('001_intranet_change' . strtoupper($theTagToFind) . 'to' . strtoupper($theTagToUse) . '.sql', 'w+');
$rollback = fopen('001_intranet_change' . strtoupper($theTagToUse) . 'backto' . strtoupper($theTagToFind) . '.sql', 'w+');
$theResultHandle = mysql_query($theQuery, $link);

$comment = "--Update All $theTagToFind tags to $theTagToUse tags in $database --";
fwrite($updates, $comment . "\r\n\r\n");
fwrite($rollback, "--Rollback - Convert all $theTagToUse tags back to $theTagToFind tags --\r\n\r\n");
mysql_set_charset('latin1');
while (($data = mysql_fetch_assoc($theResultHandle)) != false)
{
    $rb_content = $data['content'];
    $data['content'] = preg_replace("/{" . $theTagToFind . ":/", "{" . $theTagToUse . ":", $data['content']);
    $theResult[] = $data;
    $update_script = "\r\n 
    Update $database.templates
    SET content = '" . mysql_real_escape_string($data['content']) . "'
    WHERE _id = " .$data['_id'] . ";";

    $rollback_script = "\r\n
    UPDATE $database.templates
    SET content = '" . mysql_real_escape_string($rb_content) . "'
    WHERE _id = " . $data['_id'] . ";";;
    fwrite($updates, $update_script);
    fwrite($rollback, $rollback_script);
}
fclose ($updates);
fclose($rollback);

print_r($theResult);

次の$data['content']ようになります。

「こんにちは、忘れずに診療所に連絡してください……」

4

2 に答える 2

1

サーバーが正しく構成されており、マジック クォートがオフになっていますか? これらは、値を二重にエスケープする効果があります。

これをテストするには、$_POSTデータを調べて、期待どおりに変更されているかどうかを確認します。その場合は、 で設定を修正できるかどうかを確認してくださいphp.ini

注意として、mysql_query新しいコードでは使用しないでください。これは危険で非推奨であり、PHP の将来のバージョンでは削除される予定です。SQL プレースホルダーを使用することは、エスケープを行うための最も安全で簡単な方法です。

ここでの短い例では、エスケープするのを忘れているように見えます。$data['_id']つまり、SQL インジェクションのバグである可能性があります。1 つのミスでも重大な結果を招く可能性があるため、エスケープされていないデータをクエリ文字列に挿入することは決してありません。

于 2013-04-02T18:38:40.413 に答える