-1

みなさん、こんにちは。mvc4を使用して別のアプリケーションの設定ページを作成しています。設定ページ:

1.ユーザーが何でも入力できる2つのテキスト領域が含まれています。

2.ユーザーが送信ボタンをクリックした場合に入力した後、ユーザーが書き込んだテキストはSQLデータベースに保存されます。

3.メインアプリケーションはデータベースからそのデータを読み取り、表示します。

これが私のそれぞれのコードです:

モデル:

 public string PartnerInfo1 { get; set; }
 public string PartnerInfo2 { get; set; }

コントローラ:

[HttpPost]
        public ActionResult Index(AddDetailModel model)
        {
            pinfo1 = model.PartnerInfo1;
            pinfo2 = model.PartnerInfo2;
            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["Sample"].ConnectionString);
            con.Open();
            SqlCommand cmd = new SqlCommand("update dbo.Partner_Design set PartnerInfo1='" + pinfo1 + "',PartnerInfo2='" + pinfo2 + "' where [PartnerID]='cs'", con);
            cmd.ExecuteNonQuery();
            return RedirectToAction("Index");
        }

とビューで:

 @Html.TextAreaFor(m => m.PartnerInfo1)
@Html.TextAreaFor(m => m.PartnerInfo2)

データベースでは、対応するテーブルに2つの列PartnerInfo1、PartnerInfo2が含まれ 、それらのデータ型はnvarchar(max)です。

私の問題は、テキスト領域にアポストロフィを入力するとエラーが発生することです。たとえば、「world's」と入力すると、送信ボタンをクリックするとエラーが発生します。

これはエラーです:

Incorrect syntax near 's'.
Unclosed quotation mark after the character string ''.

これを避けるために私ができることを提案してください。どんな助けもいただければ幸いです。

4

3 に答える 3

4

決してそれをしないでください-それは安全ではなく、SQLインジェクションを行うことを許可します:

SqlCommand cmd = new SqlCommand("update dbo.Partner_Design set PartnerInfo1='" + pinfo1 + "',PartnerInfo2='" + pinfo2 + "' where [PartnerID]='cs'", con);

その代わりに、次のパラメーター構文を使用します。

SqlCommand cmd = new SqlCommand("update dbo.Partner_Design set PartnerInfo1=@pinfo1, PartnerInfo2=@pinfo2 where [PartnerID]='cs'", con);
cmd.Parameters.AddWithValue("@pinfo1", pinfo1);
cmd.Parameters.AddWithValue("@pinfo2", pinfo2);
于 2013-02-12T11:05:45.200 に答える
3

メソッドはクエリをsql injection攻撃にさらします。問題を整理するパラメータ化されたクエリを使用する方がはるかに優れています'

string connString = ConfigurationManager.ConnectionStrings["Sample"].ConnectionString;

using (SqlConnection con = new SqlConnection(connString))
{
   SqlCommand cmd = new SqlCommand("Update dbo.Partner_Design " +
                                    "Set PartnerInfo1=@pinfo1, " +
                                        "PartnerInfo2=@pinfo2 " +
                                    "Where [PartnerID]=@partnerId", con);

   cmd.Parameters.AddWithValue("@pinfo1", model.PartnerInfo1);
   cmd.Parameters.AddWithValue("@pinfo2", model.PartnerInfo2);
   cmd.Parameters.AddWithValue("@partnerId", "cs");
   con.Open();
   cmd.ExecuteNonQuery();
}
于 2013-02-12T11:10:06.500 に答える
1

一重引用符の前に別の一重引用符を付けることで、一重引用符をエスケープできます。これには、文字列をクエリに追加する前に、文字列を置換する必要があります。

pinfo1 = pinfo1.Replace("'", "''");
pinfo2 = pinfo2.Replace("'", "''");
SqlCommand cmd = new SqlCommand("update dbo.Partner_Design set PartnerInfo1='" + pinfo1 + "',PartnerInfo2='" + pinfo2 + "' where [PartnerID]='cs'", con);

ただし、これに強く反対し、代わりにはるかに安全なパラメーター化されたSQLを使用する他の応答のアドバイスを利用します。このソリューションは一重引用符の問題のみを解決し、個別にエスケープする必要がある他の特殊文字で問題を引き起こすことにも注意してください。このように、これはあなたの質問に答えるはずですが、SławomirRosiekとKafによって提案されたソリューションは、はるかに包括的で、はるかに安全であり、ベストプラクティスです。

使用している方法では、SQLインジェクション攻撃にさらされる可能性があります。

于 2013-02-12T11:13:00.830 に答える