sql >> データベース >  >> RDS >> Mysql

sockets.io/node.js/javascriptを使用してmysqlの特殊文字をエスケープする方法

    やらないでください

    問題の間違った解決策について質問しています。

    アポストロフィをバックスラッシュアポストロフィに置き換えるには、次を使用します。

    str = msg.replace(/'/g, '\\\'');
    

    しかし、そうすべきではありません 。私はその情報を提供しているだけです。それはあなたの質問が尋ねるものだからですが、以下を読んでください。

    なぜそれが悪い考えなのか

    クライアント側で行うべきではなく、サーバー側でも行うべきではありません。 SQLインジェクションの脆弱性を回避することが、アポストロフィをバックスラッシュアポストロフィに置き換えるという単純な問題である場合、それは問題にはなりません。残念ながら、それはもっと複雑です。

    あなたが提供した情報を持っていると、実際にデータベースクエリを実行するコードを見ずに、バックスラッシュアポストロフィが最初に期待したことを実行するかどうかを判断することさえ不可能です。しかし、決してそうするべきではないので、それは問題ではありません。一度もない。これらの回答を参照して理由を確認してください。これらの質問はSQLインジェクションに関するものではありませんが、コード例にはSQLインジェクションの脆弱性が含まれており、回答はそれを説明しています。

    必須の漫画

    代わりにすべきこと

    そうは言っても、データベースのクエリに使用しているモジュールはわかりませんが、mysqlを使用しているかどうかは関係ありません。 moduleまたはSequelize、あるいはその価値のあるものであれば、文字列を手動でエスケープして連結することなく、安全な方法で変数を補間するメカニズムが常に存在する必要があります。

    ここに関連するコードが1行も表示されていないため、修正方法を説明できませんが、次の例を検討してください。

    安全ではない:

    connection.query(
      "SELECT * FROM player WHERE nick = '"
      + data.login + "' AND pass = '" + data.pass + "'",
      function (err, rows) {
        //...
      }
    );
    

    それでも安全ではなく、複雑で、読みにくく、保守できず、信頼できない:

    connection.query(
      "SELECT * FROM player WHERE nick = '"
      + data.login.replace(/'/g, '\\\'') + "' AND pass = '" + data.pass.replace(/'/g, '\\\'') + "'",
      function (err, rows) {
        //...
      }
    );
    

    安全でシンプル:

    connection.query(
      "SELECT * FROM player WHERE nick = ? AND pass = ?", [data.login, data.pass],
      function (err, rows) {
        // ...
      }
    );
    

    詳細

    詳細については、ドキュメントを参照してください:




    1. MySqlは、日次、週次、月次、および年次でレコードまたはデータを取得します

    2. UNION、EXCEPT、またはINTERSECTを使用している場合、PostgreSQLの「エラー:列「colname」が存在しません」を修正しました

    3. mysql永続接続を使用する必要がありますか?

    4. mysqlバイナリログを使用してdropdatabaseコマンドから復元するにはどうすればよいですか?