3

LINQ to Entities で引用符をエスケープする方法を知りたいです。

これが私の環境です。Silverlight 5 と WCF RIA サービスを備えた Entity Framework 5、MySQL 5.6 と MySQLConnector 6.5.6 です。

次のクエリがあります。

DomainContext.Load<Product>(DomainContext.GetProductQuery()
                                         .Where<Product>(p => p.name.Contains(parameter))
                                         .Take<Product>(30));

パラメータ変数に引用符が含まれている場合'、MySQL 構文エラー例外が発生します。メソッド (StartWith、Contains) に関係なく、常に例外が発生します。

これは、DomainDataSourceFilterDescriptorを使用して同じことを行います。

重要な注意%:や二重引用符などの文字を使用しても例外は発生しません"また、次のように演算子がequal strictの場合、単純な引用符で例外を発生させません。

DomainDataSource.FilterDescriptors.Add(new FilterDescriptor("productName", FilterOperator.IsEqualTo, SelectedProductName));

また

DomainContext.Load<Product>(DomainContext.GetProductQuery()
                                         .Where<Product>(p == parameter)
                                         .Take<Product>(30));

データの挿入に問題はありません。

どんな助けでも大歓迎です。ありがとうございました。

更新:いくつか言及するのを忘れていました。

これはサービス側の私の方法です。

public IQueryable<Product> GetProduct()
{
    return this.ObjectContext.product;
}

これを SQL インジェクションから保護するにはどうすればよいですか? フィルターを管理するために何十行ものコードを書かなければなりませんか?

EDIT : 問題は、EF 用の MySQL プロバイダーの最新バージョンで解決されています。

4

2 に答える 2

0

正確な問題をすばやく解決するには:

string cleanParameter = parameter.Replace("'", "\'")

また

mysql_real_escape_stringに相当する C# を説明するより一般的なソリューションについては、こちらをご覧ください。

string cleanParameter = MySQLEscape(parameter)

上記の記事で説明されている MySQLEscape:

private static string MySQLEscape(string str)
{
    return Regex.Replace(str, @"[\x00'""\b\n\r\t\cZ\\%_]",
        delegate(Match match)
        {
            string v = match.Value;
            switch (v)
            {
                case "\x00":            // ASCII NUL (0x00) character
                    return "\\0";   
                case "\b":              // BACKSPACE character
                    return "\\b";
                case "\n":              // NEWLINE (linefeed) character
                    return "\\n";
                case "\r":              // CARRIAGE RETURN character
                    return "\\r";
                case "\t":              // TAB
                    return "\\t";
                case "\u001A":          // Ctrl-Z
                    return "\\Z";
                default:
                    return "\\" + v;
            }
        });
}

補足: あなたのコードは、SQL インジェクション攻撃を受けやすいように思えます。(これ以上の文脈がないとわかりません)。この記事では、SQL インジェクション攻撃とは何か、およびそれらを防ぐ方法について説明します。

于 2013-06-01T14:58:16.977 に答える