Zend の DB コンポーネントのように、NodeJS の SQL クエリを作成するためのオブジェクト指向レイヤーを作成しようとしています。だから私は値をエスケープできるようにしたい。はい、パラメーター化されたクエリが理想的であることはわかっています。しかし、私がエスケープしたい理由:
- 作成されたクエリをドライバーに依存せずに実行できるようにしたい (パラメーター化されたクエリのために 1 つのライブラリのインターフェイスに依存するのではなく、プラットフォーム固有の SQL 文字列を作成するという点で)、一般的なドライバー用に準備されたクエリのサポートを追加します。
- Zend の Db コンポーネントは escapingを行うため、可能 (安全) なはずです
- 私が知っているNodeJSにはそのようなものはないので、例を見つけたり、別のライブラリのエスケープ関数を使用したりすることはできません
Zend はこれを使用しているため、このアプローチから始めました。MySQLとPostgresSQLの文字列をエスケープする例は見つかりましたが、Sqlite3 の例は見つかりませんでした。
PHP のSqlite3::escapeString関数をトレースしてみましたがsqlite3VXPrintf
、sqlite3.c の 19016 行に行き着きました。これは大量の printf 関数です。私はそれが私がどこに行き着くべきだったのかさえ確信が持てません。とにかく、私はそれを理解しようとして運がなかった:P
だから、誰かがこれを行う方法についてもっと多くの指針を教えてくれることを願っています。また、エスケープ機能を安全にするために何に注意する必要がありますか? '
すべてを\\'
安全に置き換えないのはなぜですか? 二次 SQL インジェクションのような欠陥は認識していますが、それは誰かが何かをエスケープするのを忘れたためです。SQL クエリを作成するためのインターフェイスは、開発者が明示的に「これは安全です」と言わない限り、値を自動的に引用できます。
以前のMySQL の質問の解決策については、非常に単純に見えます (特別なケースはありませんか?)。本当にそれだけですか?unsafeinput は常にエスケープされると仮定します。mysqli_real_escape_stringは、NUL (ASCII 0)、\n、\r、\、'、"、および Control-Z をエスケープします。Sqlite3 のドキュメントでは、単一引用符についてのみ言及していますが、NUL のような特定の文字は怪しく見えます。これについて詳しく知ることができる場所はありますか?
libpqの PostgresSQL のエスケープ関数も、引用符をエスケープされた引用符に置き換えているように見えます。「パラメーター化されたクエリを使用してください!」といつも聞いているので、これが問題ないことを確認しているだけだと思います。あたかもエスケープ関数が役に立たないかのように。
TLDR : 主な質問が 2 つあります
- クエリの特殊文字のエスケープは、どこでも適切に行われれば安全ですか?
- Sqlite3 エスケープ コードの例はどこにありますか? 公式ドキュメントには、リテラルの一重引用符しか記載されておらず (確認したい)、PHP ソースをトレースすることはできませんでした。