ASP.NETでのデータベース接続文字列の記述場所
最近、仕事関連でASP.NET2.0をいぢってます。
システム管理者の目でいぢってて気がついたのですが、
ASP.NET2.0からデータベースの接続文字列を、Web.configの「connectionStrings」セクションに記述できるようになっているのですね。
で、MS SQL ServerなんかでWindows認証する場合以外は、接続文字列中にデータベースへの接続時のユーザ名とパスワードをweb.configファイル中に記述してしまうことになります。
具体例はこんな感じ。
<configuration> : <connectionStrings> <add name="xxsystem" providerName="system.data.mysqlclients" connectionString="Database=xxsystem;Data Source=DBサーバ; User Id=ユーザ名;Password=パスワード" /> </connectionStrings>
ところが、このweb.configファイルはデフォルト平文なので、Webサーバのコンソールを扱う権限のある人であれば簡単にweb.configの設定情報を参照してデータベースの接続ユーザ名とパスワードを知ることができてしまいます。
これはセキュリティ上問題です。
この問題の回避策として、Microsoftから「aspnet_regiis」というツールが提供されているので、これを使ってweb.configの重要な部分を暗号化できるそうです。
参照元:知識.com様
http://www.e-chishiki.com/jpn/articles/information_security/application_security/cryptography/encrypting_web_config
しかし、ここで問題点。
例えば、テスト環境のデータベースに接続して一時的にテストしたい場合、
- 本番環境のweb.configをバックアップ
- 一旦web.configの暗号化を解除
- connectionStringsのDatabase、またはData Sourceの部分をテスト環境に書き換え
- 再度web.configの暗号化
- テストが終了したらバックアップしておいたweb.configに置き換え
という流れになり、非常にめんどくさいことになります。
また、web.configの管理をしっかりしていないと、どれがテスト環境用でどれが本番環境用だったかわからなくなる、といった情けない事態にならないとは限りません。
そこで、やってみたのが以下の手段。
- データベース接続用のvbモジュールファイルを作成(ASP.NETの言語にVisual Basicを使用する場合)。
- vbモジュールに、Public Const でユーザ名とパスワードを定数で記述。
- web.configのconnectionStringsのユーザ名とパスワードに該当する部分をダミーで記述。
- vbモジュールにweb.configからconnectionStringsを取得した後、ダミーのユーザ名とパスワードを2.で定義したユーザ名とパスワードにreplaceする関数を記述。
- データベースに接続する際には、4.の関数を呼び出すようにする。
この方法だと、web.configを暗号化する必要がないので、テスト環境に切り替え時もweb.configを直接書き換えることで対処できる。
ただし、本番環境とテスト環境のデータベース接続ユーザ名とパスワードは同一にしておかないといけないけど。
参考までに上記のモジュール例を。
web.config
<?xml version="1.0" encoding="utf-8"?> <configuration> : <connectionStrings> <add name="xxsystem" providerName="system.data.mysqlclients" connectionString="Database=xxsystem;Data Source=localhost; User Id=username;Password=passwd" /> </connectionStrings>
mDbConnect.vb
Module mDbConnect Public Const DB_USERNAME = "USER01" Public Const DB_PASSWORD = "Pass01" : Public Function fncGetDbConnectionString() As String Dim strConnString = ConfigurationManager.ConnectionStrings("helpdesk").ConnectionString strConnString = Replace(strConnString, "username", DB_USERNAME) strConnString = Replace(strConnString, "passwd", DB_PASSWORD) Return strConnString End Function
データベース接続記述部分(MySQL使用)
Imports MySql.Data.MySqlClient : Dim objConn As MySqlConnection : ' データベース接続 objConn = New MySqlConnection(fncGetDbConnectionString) :
関数じゃなくってクラスにしようかとも思ったのだが、ま、いいか。
あ、当然vbモジュールは本番環境のWebサーバに置いちゃだめよ。
You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.
Leave a Reply