سؤال

إذا كنت تستخدم دون سرعة الصوت لخلق DAL لمشروع الويب الخاص بي أحتاج للقلق حول منع الهجمات SQL حقن؟

هل كانت مفيدة؟

المحلول

وهذا يتوقف على كيفية إنشاء الاستعلامات. فمن الممكن تماما لكتابة الاستفسارات غير آمنة مع دون سرعة الصوت إذا كنت لا تستخدم المعلمات.

// Bad example:

string sql = "delete from Products where ProductName = " + rawUserInput;
QueryCommand qry = new QueryCommand(sql, Product.Schema.Provider.Name);
DataService.ExecuteQuery(qry);

// Should be:

string sql = "delete from Products where ProductName = @TargetName";
QueryCommand qry = new QueryCommand(sql, Product.Schema.Provider.Name);
qry.AddParamter("@TargetName", rawUserInput, DbType.String);
DataService.ExecuteQuery(qry);

نصائح أخرى

لا، يستخدم دون سرعة الصوت المعلمات لتمرير البيانات في قاعدة البيانات، أنها تحرص على ذلك.

والجواب باختصار هو لا. إذا كنت تستخدم الطبقات دون سرعة الصوت ولدت أو الطبقة Subsonic.Select لتوليد ما تبذلونه من الاستفسارات / عبارات التحديث / إدراج ثم كنت لا داعي للقلق في يستخدم دون سرعة الصوت معلمات بشكل صحيح.

وبول لم نشير إلى ذلك أنه إذا قمت بالخروج من طريقك لكتابة SQL غير آمنة أن سرعة الصوت تسمح لك ل. دون سرعة الصوت ليست أمك انها لن توقف لكم انه أشبه أفضل صديق، وسوف اقول لكم لا ولكن إذا كنت قررت أن تفعل ذلك وهذا هو قرارك.

وفقط لإعادة الحاضر مثال بول (إذا كنت كيه القيود)

        string rawUserInput = "Queso Cabrales1";
        #region  BadExample
        //string sql = "delete from Products where ProductName = " + rawUserInput;
        ////QueryCommand objQueryCommand = new QueryCommand(sql, Product.Schema.Provider.Name);
        ////DataService.ExecuteQuery(objQueryCommand);
        #endregion BadExample

        #region BetterExample
        // Should be:

        string sql = "update Products set ProductName =  @ProductName where ProductName='Queso Cabrales'";
        QueryCommand objQueryCommand = new QueryCommand(sql, Northwind.Product.Schema.Provider.Name);
        objQueryCommand.AddParameter("@ProductName" , rawUserInput, DbType.String);
        DataService.ExecuteQuery(objQueryCommand);


        panGvHolder.Controls.Clear();

        Query qry = Northwind.Product.CreateQuery();
        qry.Columns.AddRange(Northwind.Product.Schema.Columns);
        qry.WHERE("UnitPrice > 15").AND("UnitsInStock < 20 ");
        //WHERE("UnitPrice > 15").AND("UnitsInStock < 30 ");
        #endregion BetterExample

        #region PresentResultsReplaceResponseWriteWithConsole.WriteLineForConsoleApp
        using (IDataReader rdr = qry.ExecuteReader())
        {
            Response.Write("<table>");
            while (rdr.Read())
            {
                Response.Write("<tr>");
                for (int i = 0; i < rdr.FieldCount; i++)
                {
                    Response.Write("<td>");
                    Response.Write(rdr[i].ToString() + " ");
                    Response.Write("<td>");
                } //eof for 
                Response.Write("</br>");
                Response.Write("</tr>");
            }
            Response.Write("<table>");
        }
        #endregion PresentResultsReplaceResponseWriteWithConsole.WriteLineForConsoleApp

    } //eof method
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top