3

重複の可能性:
mysql_real_escape_string と一重引用符

編集:確認しましたが、ホスティング サービスの mysql データベースは次のように設定されています。

  Language: English (en-utf-8)
   MySQL charset: UTF-8 Unicode (utf8)

以下の「userItem」変数は、ユーザーがフォームに入力したテキスト文字列に由来します。

「これは A のユーザー アイテムです」と入力し、それに mysql_real_escape_stringを使用すると、次 のようにデータベースに保存されます。

       "this is A\'s user item"

悪い。backslsh がテスト文字列と共に保存されました。

mysql_real_escape_string($userItem)をコメントアウトし、クエリ文字列で$userItemを 使用すると、データベースに格納されます。

       "this is A's user item"

良い!!バックスラッシュなし。

しかし、正直に言うと、安全上の理由からmysql_real_escape_stringを使用したいのです 。文字列をデータベースに保存する前に mysql_real_escape_string を使用する方が安全であると信じるようになりました。

問題: テキスト文字列"this is A\'s user item"を取得 してブラウザに表示すると、文字列にスラッシュが含まれています。そして、それはユーザーを驚かせます -- 彼らは「これは A のユーザー アイテムです」と入力したのではなく、 「これは A のユーザー アイテムです」と入力しました。

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

 $newItemInsertQuery = "INSERT INTO " . Dbases::$USERITEMS_TABLE 
   . " VALUES "
   . "('" 
   . mysql_real_escape_string( $loggedInUser ) . "', '" 
  //. mysql_real_escape_string($userItem) . "', '" COMMENTED OUT due to extraneous backslash
   . $userItem . "', '"
   . mysql_real_escape_string($description) . "', '" 
   . mysql_real_escape_string($itemImage) . "', '"
   . mysql_real_escape_string($userSubfolder) .  "')";

   $result = mysql_query($newItemInsertQuery);

私は次のことを疑っています。

  • データベース挿入の前に文字列に mysql_real_escape_string を使用するのは良いことであるという私の期待は有効です。

  • しかし、私は取らなければならない他のステップに気づいていません

4

3 に答える 3

2

または(どちらも PHP に組み込まれています) を介してパラメーター化されたクエリを使用することを強くお勧めします。mysqliPDO

mysql_real_escape_string()せいぜいその場しのぎの措置です。パラメーター化されたクエリを使用すると、面倒が少なくなり (このような問題を回避できます)、より安全になります。さらに、多くの場合、より効率的になります。

また、いかなる種類のエスケープも実行する必要がないため、どのデータが渡され、データベースに入力されるかがより明確になります。

于 2012-04-29T17:25:52.423 に答える
0

余分なバックスラッシュの原因と解決策を見つけたと思います。ここに投稿し、現在取り組んでいるソリューションを投稿するために戻ってきます。

フォームの inputtype = "text"フィールドが送信され、アポストロフィを含むテキスト文字列がPHPのサーバー側で$ _POST配列から抽出され、エコーによって表示されると、スラッシュはすでにテキストに含まれています。 STRING、このように:

「これはどのように見えるか」

ウェブサイトディレクトリの.htaccessファイルを使用して、次の行を使用して「マジッククォート」をオフにすることができません

php_flagmagic_quotes_gpcオフ

1and1ホスティングサーバーがエラーを表示し(上記の私のコメントを参照)、私のWebサイトを実行しないためです。

証明されたら投稿するソリューションがあります。

次のコードをテストしましたが、機能します。フォームで「bの6番目のアイテム」という文字列を入力すると、フォームが送信されると、このコードがフォームのPOSTを処理します。

 $itemName = $_POST['theItemname'];
 echo $itemName; 
 if (get_magic_quotes_gpc())
 {
    $stripped = stripslashes($itemName);
    echo "<br /> This is itemName string after stripping: " . $stripped;
 }

出力は次のとおりです。

     b\'s 6th item
     This is itemName string after stripping: b's 6th item

以下のコメントを読み、すべてのオプションを検討します。今のところ、私は今解決策を必要としていました、そして上記は'魔法の引用符'がオンになっていない限りstripslashes()を呼び出すことを避けます-それは機能します。

私は応答を準備し、よりエレガントな方法を見つけようとします!ありがとうございます。

于 2012-04-29T19:58:09.933 に答える
0

データベースに保存する前に、文字列に対して mysql_real_escape_string を使用する方が安全です。

それは「より安全」ではありません。実は 厳しいルール
です。

しかし、あなたの問題はこの関数からではなく、データを台無しにする他のコードまたは設定から​​来ています。

したがって、ここには 2 つの問題があります。

  1. この関数のせいではないことをどのように納得させるか。
  2. 本当の原因を見つける方法。

最初のものについては、最後のクエリをエコーアウトしてください

echo $newItemInsertQuery;

あなたが得たものをここに投稿してください

投稿していただきありがとうございます。投稿 したクエリが構文エラーのために実行されないことを
確認しましょう。

INSERT INTO useritems VALUES ('b@b.com', 'b' s 4th item', 'the 4th item', '', '')

強調された部分を参照してください。ここでは、適切な構文キーワードが続くことなく、文字列リテラルが閉じられています。

これでクエリ呼び出しを変更します

$result = mysql_query($newItemInsertQuery) or trigger_error(mysql_error()." ".$query);
exit;

そして見る

于 2012-04-29T17:40:55.583 に答える