Perl で SQL 文字列をサニタイズする正しい方法は、準備されたステートメントを使用することですが、この特定の Perl スクリプトは、後で Perl ではなく別の環境で実行されるステートメントを生成しています。接続するデータベースがありません。
MySQL クエリに挿入する文字列を安全にエスケープするにはどうすればよいですか。ソリューションは移植可能である必要はありません。
Perl で SQL 文字列をサニタイズする正しい方法は、準備されたステートメントを使用することですが、この特定の Perl スクリプトは、後で Perl ではなく別の環境で実行されるステートメントを生成しています。接続するデータベースがありません。
MySQL クエリに挿入する文字列を安全にエスケープするにはどうすればよいですか。ソリューションは移植可能である必要はありません。
残念ながら、DBD::mysql で使用される引用符機能、および一般的な MySQL クライアント ライブラリには、アクティブなデータベース ハンドルが必要です。ドキュメントによると、「エスケープはサーバーで使用されている文字セットに依存するため、これが必要です」。
私はいくつかのハッキーな解決策を考えることができますが、どれも本当に満足のいくものではないので、ドキュメントからこれを使ってみましょう:
エンコードされる文字は、「\」、「'」、「"」、NUL (ASCII 0)、「\n」、「\r」、および Control+Z です。厳密に言えば、MySQL で必要なのはバックスラッシュと、クエリ内の文字列を引用符で囲んでエスケープします。
これは、おそらく次のいずれかを行う引用関数で回避できることを示唆しています
s/([\\"'])/\\$1/g;
また
s/([\\"'\0\n\r\cZ])/\\$1/g;
私はまだ警戒していますが。
「;」などのSQLインジェクションを実行するために必要な、クエリ文字列に追加する変数の特殊文字を確認するだけです。またはブラケットとそれらを交換するか、それらを捨てる?!?