2

System.Reflection の MethodInfo と MethodBody クラスを使用してメソッドを呼び出したいのですが、メソッドの名前と本体が SQL サーバーにあります。

         SqlConnection con = new SqlConnection(GlobalData.GetConnectionString());
            SqlCommand cmd = new SqlCommand("select CodeSnippet from SubMenu where Role_ID='"+GlobalData.RoleID+"' and ChildMenu='"+sender.ToString()+"'", con);
            if (con.State == ConnectionState.Closed)
            {
                con.Open();
            }
            SqlDataReader reader = cmd.ExecuteReader();
            if (reader.Read())
            {
                string codeSnippet = reader["CodeSnippet"].ToString();
                Type type = typeof(Helper);
                MethodInfo method = type.GetMethod(codeSnippet);

                Helper c = new Helper();
                method.Invoke(c, null);
            }
            if (con.State == ConnectionState.Open)
            {
                con.Close();
            }

これで完了です。Microsoft SQL サーバーからメソッド本体が必要です

4

1 に答える 1

2

実稼働サーバーで任意のコード スニペットを実行できないようにすることを強くお勧めします。バグや悪意のあるコードが非常に悪いことをするリスクがあります。可能であれば、コードをプロジェクトに保持し、何らかのキーで参照するだけです(名前でもかまいませんが、一意の識別子で十分です)-つまり、「LaunchTheMissiles」操作を実行します。「LaunchTheMissles」列挙型またはそのような操作の受信者になるように明示的に設計されたクラスで定義されます。

本当にスニペットを使用したい場合、C# は最も便利なスニペット言語ではないかもしれませんが、 CSharpCodeProviderを介して実行できます。ただし、スクリプト言語で使用するように設計されたツールがあります。IronPython などです。別の言語を使用したい場合は、IronPython を非常に簡単に埋め込むことができます。ただし、これには、任意のコードの実行に関連するほとんどのリスクがあります。

スニペットが開発者によって提供される場合は、代わりにコードをメイン プロジェクトに配置してください。

スニペットがユーザーによって提供される場合、私は次のように言います。ただしないでください。

また:あなたのSQLは注入を求めています。

于 2013-03-07T13:09:19.980 に答える