1

以下のフォームがあり、以下のエントリのいずれかが正しくない場合は、ユーザーに警告したいと思います。コードの下のどこに例外を追加できますか?

ここに画像の説明を入力

マイコード:

 public static void GetTables(Members src)
    {

        OracleConnection conn1 = MyConnectionClass.GetConnection(src.DB, src.ID, src.Password);

        conn1.Open();
        using (OracleCommand command= new OracleCommand("SELECT * FORM DBA_USERS WHERE USER NAME=" + src.ID + " and PASSWORD=" + src.Password + "", conn1))
        {
            using (OracleDataReader reader = command.ExecuteReader())
            {
                int count = 0;
                while (reader.Read())
                {
                    count = count + 1;
                }
            }
        }
  }
4

1 に答える 1

3

コードをもう一度見たところ、これは完全な災害です。つまり、アプリケーションによって確立された接続が DBA_Users テーブルにアクセスできるということですか? これは大きなサイズの赤い旗です。

あなたがすべき:

  • アプリケーションスキーマとなるスキーマを作成します

  • 接続文字列でそのスキーマの pwd とユーザー名を使用し、暗号化して、ユーザーが到達できないようにします

  • アプリケーション内に、「users」だけでなく「users1f0tm34m」のような名前のテーブルがあります。

  • そのテーブルを使用して、アプリケーションの着信ユーザーを確認します。

基本的に、アプリケーションで暗号化された conn 文字列を使用して接続を確立します。ここで、接続が正しいかどうかを確認します。ユーザー資格情報が正しい場合、2 番目のチェックはテーブルに対して行われます。

ここで、これについての議論を停止する必要があります。

"SELECT * FROM DBA_USERS WHERE USERNAME=" + src.ID + " and PASSWORD=" + src.Password + ""

SQL インジェクションの他に最適化があります。上記のコードにより、次のユーザーがログオンするたびに、Oracle オプティマイザーがクエリのプランを作成します。これを回避するには、パラメーターを介してバインド変数を使用する必要があります。

SELECT * FROM DBA_USERS WHERE USERNAME=:uname and PASSWORD=:pwd

これはオラクルが推奨する方法であり、あなたが行ったのはオラクルが推奨しない動的SQLです。

あなたの会社が監査を受けたことがあるなら、あなたは大丈夫です。

于 2013-09-14T01:30:51.913 に答える