5

次のように、ユーザーに名前を入力してもらいますO'riley

このデータをMySQLDBに入力する前に、を実行しますmysql_real_escape_string

問題は、このデータを選択して後で表示して使用すると、次のように表示されることですO\'riley

明らかに、これは意図された操作です。私が疑問に思っているのは、それをDBに保存できるかどうか(悪意のあるコードを安全に回避できるかどうか)です。これによりstrip_slashes()、Web全体でデータを呼び出すたびに出力で使用する必要がなくなります。アプリ?または、私はここで何かが欠けていますか?

ありがとう。

更新 Decezeの回答のコメントを参照してください。

4

9 に答える 9

10

いいえ、文字列を「O\'riley」として保存することは意図された操作ではありません。クエリでエスケープする必要がありますが、この方法で保存しないでください。PHPはMagicQuotesを介してバックスラッシュを入れていると思いますが、もう一度エスケープして固定します。

MagicQuotesを無効にします。

于 2012-02-15T00:52:13.167 に答える
4

マジッククォートが無効になっていて、get_magic_quotes_gpcが1を返し、@ Michael showのようなことをしたのにこれがまだ発生する場合は、マジッククォートランタイムが有効になっている可能性があります。

Magic Quotesランタイムは、データベースクエリを実行するとき、およびファイルに書き込むときにも、文字列にスラッシュを追加します。現在実行中のスクリプトでこれを無効にするには、次のようにします。

if(function_exists('get_magic_quotes_runtime') && get_magic_quotes_runtime())
{
    set_magic_quotes_runtime(false);
}

可能であれば、この構成オプションをphp.ini無効にすることもできます。ただし、永続的に無効にできない場合はphp.ini、前に@を追加する必要があります。get_magic_quotes_runtimeまたset_magic_quotes_runtime、PHPがE_DEPRECATEDエラーerror_reportingをログに記録するように設定されている場合は、エラーが発生する可能性があります(これはかなり煩わしいものになります)。

于 2012-06-04T00:06:53.583 に答える
4

了解しました。これがあなたがする必要があることです。まず、コメントに基づいて、他の質問から:

分離

問題の原因を特定する必要があります。サーバーですか?それはどこかに隠されたコードですか?何?一部のプログラマーは、構成ページに次のようなコードを含めることができます。

<?php if (isset($_POST)) 
    foreach ($_POST as $key => $value) $_POST[$key] = addslashes($value); 
?>

それで、それがサーバーであるかどうかを確認するためのいくつかのチェックがあります。これは、可能な限り確実なチェック方法です。新しいページを作成します。完全に空白のままにして、次のコードを追加します。

<?php print_r($_POST); ?>
<form action="" method="POST">
<input type="text" name="test" value="O'riley" />
<input type="submit" name="submit" value="submit" />
</form>

保存してブラウザにロードします。送信を押します。スラッシュがまだ追加されているかどうかを確認します。

それでも追加される場合は、サーバー/構成のトラブルシューティングを行う必要があります。それがあなたが支払っているサーバーであるならば、あなたはそれを修正するか、それを突き刺すように彼らに言う必要があります。それがあなた自身のサーバーであるなら、あなたは魔法の引用符をオフにする方法を理解するためにいくつかの混乱/グーグルをする必要があるでしょう。

引用符が表示されない場合は、投稿変数にスラッシュを追加するコードが間違いなくあります。ただし、上記のコードほど明白ではない場合があります。コードで「addslashes」、「mysql_real_escape_string」、場合によっては「str_replace」を検索する必要があります。これらのいずれかを見つけた場合は、無効にする必要があります。ただし、これにより、このアクションが実行されていると想定しているサイトの他の部分が破損する可能性があることに注意してください。データベースに保存するための他のオプションは、上記のコードと同様の機能を実行することですが、代わりに、ストリップスラッシュを実行します。その後、後でmysql_real_escape_stringを実行できます。(もう少し不要なオーバーヘッド。)

于 2012-06-05T01:53:48.177 に答える
4

魔法の引用符は、私が指示していないことをしているので、個人的には常にオフにします。オフにする機能がない場合は、すべてのページの上部にこのコードを含めることを検討してください。

if (get_magic_quotes_gpc()) {
    function strip_array($var) {
        return is_array($var)? array_map("strip_array", $var):stripslashes($var);
    }

    $_POST = strip_array($_POST);
    $_SESSION = strip_array($_SESSION);
    $_GET = strip_array($_GET);
}
于 2012-06-03T04:18:33.460 に答える
3

使用する

var_dump(get_magic_quotes_gpc());

投稿されたデータの実際の使用に近い場所で、MagicQuotesが実際にオフになっているかどうかを確認します。

また、いくつかの奇妙なフレームワークは、あなたのために上記の引用符を追加する可能性があるので、コードaddslashesや他の同様のescape_string関数をgrepします。

于 2012-05-30T01:03:16.597 に答える
2

正直に言って、PDOの使用をお勧めします。

PDOは、prepareステートメントとexecuteステートメントを使用します。これにより、セキュリティが強化され、余分な問題が解消されます。

$pdo = new PDO();
$stm = $pdo->prepare('INSERT... (LastName) VALUES (:LastName)');
$stm->execute(array(':LastName' => "O'Rily"));

$stm->fetchAssoc(PDO::FETCH_ASSOC);

基本的なSQLインジェクションの戦術を確保するだけでなく、エスケープするスラッシュを削除することについて心配する必要はもうありません。

于 2012-06-04T16:12:07.227 に答える
0

httpd.confまたは仮想ホスト宣言で魔法の引用符がオンになっている可能性があります。

正確な場所とファイルは、OSとディストリビューションによって異なります。Apache構成ファイルでphp_flag設定を確認します。

于 2012-06-05T04:09:31.100 に答える
-1

データベースに挿入する前に、データをクリーンアップするだけです。

function check_input($value)
{
    if( get_magic_quotes_gpc() )
    {
        $value = stripslashes( $value );
    }

    //check if this function exists
    if( function_exists( "mysql_real_escape_string" ) )
    {
        $value = mysql_real_escape_string( $value );
    }

    //for PHP version < 4.3.0 use addslashes
    else
    {
        $value = addslashes( $value );
    }

    return $value;
}


$cleandata = check_input($value);

$sql = "INSERT INTO `table_name` SET `field_name`='".$cleandata."'";

データをフェッチして表示しながら、stripslashes($val)

于 2012-06-05T08:13:03.120 に答える
-1

みなさん、ありがとうございました。私は+50を授与しますが、ここで私の本当の解決策を伝えたかったのです。

mysql_real_escape_string投稿されたとおりに(処理前に)すべてのデータをすぐに実行していました。そこで、'提出されたキャラクターをエスケープするためにスラッシュが追加されました。これは正常です。

ただし、バックスラッシュがDBエントリに表示される理由はありませんでした\ね。脱出は、'が入力されたことを確認するためにありました。

エスケープした後、すべてのフォームフィールドの検証中にPHPが検出したエラーがユーザーに発生した場合に備えて、セッションのページに再ロードする変数を保存します。この場合、ユーザーの入力(以前O'rileyはとして画面に出力されていましO\'rileyた。その後、ユーザーはこれをキャッチしませんでした。そのため、検証中にPHPがキャッチしたエラー(名前フィールドとは関係ありません)を修正するだけでした。文字をエスケープするためO\'riley、データベースに到達します。mysql_real_escape_string

レッスン:フォームを処理するときは、最初にフォームの補充に使用するためにデータを保存します。SECONDはフォームフィールドを検証します。THIRDは、データベースに処理するためにデータをエスケープします。

または、さらに良いことに、PDOを使用し、これを避けてください=)。

コメントを歓迎します。皆さんありがとう!

于 2012-06-07T00:52:30.250 に答える