問題タブ [dbi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
windows - Perl DBIモジュールを使用するのが良いですか、それともシステムDSNをセットアップしてODBCを使用するのが良いですか?
Perlを使用して、複数のログファイルからデータを収集し、スクリプトを実行しているのと同じWindows2003ホスト上のOracleデータベースに保存しています。Perl DBIモジュールを使用するのが良いですか、それともシステムDSNをセットアップしてODBCを使用するのが良いですか?
sql-server - Perl DBI から SQL Server への接続を保護するにはどうすればよいですか?
Perl DBI を使用して安全な SQL Server データベースに接続する必要があります。ユーザーを安全に認証する方法を見つける必要があります (盗聴の恐れがなく、クライアント側にパスワードを保存する必要もありません)。XPでonSQL Server 2008
を使用しています。Windows Server 2008, and Perl 5.10
SQL Serverは「SQL Server Native Access Client API」と呼ばれるものを介した暗号化接続をサポートしていますが、これがDBDドライバーでサポートされているかどうか、またはサポートされている場合の使用方法はわかりません.
DBD::ODBC
ODBC はユーザー ID とパスワードをクリアテキストで送信するため、ドライバーを SQL Server 認証で使用するのは気が進まない。
クライアントのネットワークからアクセスできる Active Directory ドメイン上にサーバーがないため、Windows 認証 (信頼できる接続) で DBD::ODBC ドライバーを使用できません。
データベースへの接続を保護するにはどうすればよいですか? ありがとう。
perl - DBD :: Oracleを使用して、1つのクエリで複数のステートメントを実行することは可能ですか?
execute()
1つのSQLステートメント内で複数のSQLステートメントを実行できるかどうか、またはPerlを介してdo()
呼び出しを実行できるかどうかを知りたいです。例:DBD::Oracle
DBI
私は実際にそのようなことをしたいのではなく、SQLインジェクション攻撃の成功によって起こりうる被害を測定したいので、これを尋ねます。はい、この質問への回答に関係なく、バインド値や信頼できる入力のみを使用して、SQLインジェクションの可能性をルートで排除する必要があることを私は知っています。しかし、問題は依然として存在しますDBD::Oracle
。ステートメント?
関連する例として、この「機能」を明示的に有効にDBD::mysql
する接続オプションがあります。mysql_multi_statements
似たような、おそらく文書化されていない、あいまいなOracle OCIオプションがあり、それを介して何らかの方法でアクセスDBD::Oracle
できると、同じことが可能になるという気持ちを揺るがすことはできません。
重要な場合、これは次のとおりです。
perl
5.8.8DBD::Oracle
1.22- Oracle 11g(11.01.0700)
perl - Template Toolkit with DBI を使用して FastCGI を利用する Perl コードをリファクタリングするにはどうすればよいですか?
バックグラウンド
以下は、 CGI を使用して送信されたフォーム データを取得し、フォーム データを DBI に渡し、必要な行を MySQL から取得し、結果を Template Toolkit に渡す典型的な Perl コード (説明のためにsample.pl ) です。表示用の HTML ドキュメントにレンダリングします。
sample.plのコードリスト:
パフォーマンスとスケーラビリティを向上させるために、Dreamhost などの共有サーバーを提供する Web ホストは、すべての運用 Perl スクリプトが FastCGI をサポートすることを強く推奨します。FastCGI のドキュメントには、FastCGI をサポートするために既存の Perl コードを変更する方法が明確に記載されています。以下の単純なコードは、多くの場合、例として示されています。
あまり明確でないのは、while ループのどこに何を入れるかです。
サブ質問
A. sample.pl のコードは、次のように既存のコードを単純にラップする必要があります。
B. それ以上のことはありますか? たとえば、CGI、データベース、およびテンプレートを処理するコードは、独自のサブにリファクタリングする必要がありますか?
C. DBI->connect() と $db_handle->disconnect() は、FCGI while ループの内側または外側で呼び出す必要がありますか? また、パフォーマンスへの影響は?
D. $tt->process() は FCGI while ループの内側または外側で呼び出す必要がありますか?
perl - Perl DBI を使用して Oracle で「select for update」をタイムアウトする方法
SQL ステートメントをタイムアウトして、ジョブのリソース予約を失敗させ、別のリソース予約にチャンスを与えることができるように、待機する代わりに失敗する (たとえば、空の結果セットやエラー メッセージなどを配信するなど) 簡単な方法はありますか? これまで見落としていた DBI オプションを探しています。自殺するために SIGALRM を自分に送信することは、私が考えていることではありません (必要に応じてそれに頼る必要があるかもしれませんが)。
切り取ったコードは極限まで疑似化・短縮化していますが、ズレを掴んでいただければ幸いです。
興味のある人のための悲惨な詳細は次のとおりです。
大規模な並列処理を行うアプリケーションでは、Oracle テーブルを使用するリソース ロック メカニズムが実装されています。各ジョブは、読み取り用の多数のリソースおよび/または書き込み用の多数のリソースをロックする必要があり、すべてのロックが正常に取得された場合にのみ開始できます。リソースが解放されるのを辛抱強く待つのではなく、ジョブが失敗して後でマスターによって再実行される必要があります (これにより、実際にクランチするジョブが増えることでパフォーマンスが向上し、開いているトランザクションの数が少なくなります)。
もちろん、実際にテーブルを更新する前に、「SELECT ... FOR UPDATE」ステートメントを使用して各行が予約されているため、Oracle は行レベルのロックを使用し、テーブルで同時トランザクションが発生する可能性があります。競合状態とデッドロックの可能性をさらに減らすために、すべてのジョブはまずリソース行を選択し、更新を実行する前に同じ順序で行をロックします。
現在の実装では、これはほとんどの場合にうまく機能します。しかし、「Select for update」は Oracle が実際に行ロックを許可するまでブロックされるため、ジョブがアイドル状態でそのリソースを待機している可能性があります。1 ~ 2 秒待つのは問題ありませんが、ロックのためだけに 10 秒以上待つことはできません。後でロックを解除するには、もちろん待機が必要であるため、DB 接続全体を即時の結果のみを受け入れるように設定しても機能しません。
TFがRを持っている必要があるMの場所を指している限り、 RTFMの回答には常に感謝しています;-))
事前にどうもありがとう、
オルファン
perl - Perl の DBI でユニコードを処理するにはどうすればよいですか?
私のおいしいto wp perlスクリプトは機能しますが、すべての「奇妙な」文字に対してさらに奇妙な出力が得られます。だから私は試しました
しかし、それは違いはありません。たとえば、「go live」を「go live」ではなく「go live」にしたいのですが、これが機能するように Perl で Unicode を処理するにはどうすればよいですか?
更新: 問題は、Perl で設定しなければならなかった DBI の utf を設定することであることがわかりました:
それは私が設定しなければならなかった部分でした。ありがとう!
perl - SQL テーブル名インジェクションからの保護 - どこまで遠すぎるか?
私は PostgreSQL と通信する比較的小さなアプリケーションを開発していますが、SQL インジェクションに対する保護に関しては、どこまで行き過ぎているかについてフィードバックを得たいと考えていました。
アプリケーションは Perl であり、ORM モジュール (DBI のみ) を使用しません。SQL ステートメントは、プレースホルダーを使用して一般的な方法で構築されます。
テーブル名が補間される理由は、アプリケーションが複数のテーブルに対して同じ操作を実行する必要があるためです。これらのテーブルにはすべて「foo」列があります。
? の使用 placeholder は、ほとんどの単純な SQL インジェクション攻撃から保護します。私の質問は、プレースホルダーを使用できないテーブル名に関するものです。テーブルは構成ファイルから取得されますが、アプリは代替構成ファイルを使用する --configfile スイッチをサポートしています。
データベース資格情報は構成ファイルに保存されます。そのため、攻撃者が $cfg->{tablename} を悪意のあるものに置き換えた構成ファイルを作成する (または既定のファイルを置き換える) ことができる場合、アプリケーションは「だまされて」悪意のあるコードを実行される可能性があります。
攻撃者がこれを行うには、有効なデータベース資格情報を既に持っている必要があります。そうでない場合、アプリケーションは接続できません。資格情報を持っている場合、DBI を使用して独自のコードを作成するか、psql cli を使用して悪意のあることを行うことができます。
これを防ぐには、次の 2 つの方法が考えられます。
- ORM に切り替えます。この場合、$orm->get_class_for_table($cfg->{tablename} の順序で何かを行うことになります。
- SQLステートメントを準備する前に、正規表現を使用してテーブル名をサニタイズします
- $dbh->quote_identifier() を使用
明らかに 2 番目の方法は「安くて楽しい」方法です。しかし、上記の資格情報に関する声明を考えると、これらのアプローチのいずれかが本当に正当化されるのでしょうか? 攻撃者に別の攻撃ベクトルを使用するように強制することになると、どのくらいの労力がかかりすぎますか (実際に攻撃を防ぐ努力とは対照的に?)
perl - PostgreSQLからJSON::XSを介してPerlを介してブール値を適切にエンコードできないのはなぜですか?
ブール値を返すPostgreSQLシステムに関するクエリがあります。
DBD :: Pg docsによると、
PostgreSQLの現在の実装では、trueの場合は「t」、falseの場合は「f」が返されます。Perlの観点からは、これはかなり不幸な選択です。したがって、DBD :: Pgは、BOOLデータ型の結果をPerlishの方法で変換します。「f」は数値0になり、「t」は数値1になります。このようにして、アプリケーションはデータベース固有の戻り値をチェックする必要がありません。 Perlは0をfalseとして扱い、1をtrueとして扱うため、データ型はBOOLです。必要に応じて、pg_bool_tf属性をtrue値に設定して、値を「t」および「f」に戻すことができます。
したがって、pg_bool_tfが0を返す限り、そのステートメントは0を返す必要があります。ただし、途中のどこかで、JSON :: XS(およびプレーンJSON)は返された0を文字列として解釈します。
...で死ぬ:
{"layout":0、 "show_widget_help": "0"}
...これは問題ありませんが、JavaScriptがブール値を期待していて、空でない文字列「0」がtrueと評価される点が異なります。後者の0が引用され、前者が引用されないのはなぜですか?
JSON :: XSドキュメントによると、これは主な機能です。
往復の整合性
JSONでサポートされているデータ型のみを使用してperlデータ構造をシリアル化する場合、逆シリアル化されたデータ構造はPerlレベルで同じです。(たとえば、文字列「2.0」が数字のように見えるからといって、突然「2」になることはありません)。これにはマイナーな例外があります。それらについては、以下のマッピングセクションをお読みください。
...これは言う:
単純なPerlスカラー(参照ではないスカラー)は、エンコードするのが最も難しいオブジェクトです。JSON:: XSは、未定義のスカラーをJSON null値としてエンコードし、JSON文字列としてエンコードする前に文字列コンテキストで最後に使用されたスカラーをエンコードします。数値として他のもの。
しかし、文字列コンテキストで@vals[0]を使用することはありません。たぶんDBD::Pgはブール値0を返す前に、どこかで文字列として使用しますか?
sql-server - 配列のトリミング(DBIを介して入力)
PerlとDBIモジュールを使用してSQLServerデータベースからデータを読み取ろうとしています。私の意図は、データを読み取り、テキストファイル(カンマ区切り)に印刷することです。これを行うと、次のような結果が得られます。
したがって、2番目の変数データとコンマの間には空白があります。以下のコードを使用してこれをトリミングしようとしましたが、機能しませんでした。これらの空白を取り除くためにコードをどのように変更する必要がありますか?
私のコードはここにあります:
perl - DBD::SQLite が Perl CGI スクリプトを介してデータベースに挿入できないのはなぜですか?
DBD::SQLiteによってアクセスされている Perl CGI スクリプト内で SQLite データベースを実行しています。これは、Apache 上でストレート CGI として実行されています。
DBI 接続は正常に機能し、選択を実行できます。ただし、挿入しようとすると、次のエラーでサイコロが表示されます。
これを修正するために、データベース ファイルのアクセス許可を 666 に変更しようとしましたが、まだエラーが発生します。
何かアドバイス?