maysam_p82 Ответов: 1

Как я могу использовать что-то вроде оператора getdbnumbervalue в качестве параметра, подобного этому коду?


How can I use something like getdbnumbervalue statement as parameter like this code?

Это утверждение (GetDBNumberValue) предотвращает sql-инъекцию, сказал мой босс. Но я собираюсь найти что-то подобное и использовать его в своих проектах

Что я уже пробовал:

public bool UpdateInfo_ToDownloadQueueStatus(string strAutoID)
        {
            string strQuery = " UPDATE tb_NGD_ToDownloadQueue SET ";
            strQuery += " Status = 2 ";
            strQuery += ",";
            strQuery += " DownloadEnd = " + GetDbStringValue(DateTime.Now.ToString());
            strQuery += " WHERE AutoID = " + GetDbNumberValue(strAutoID);

            strQuery += " DECLARE @RowCount int; ";
            strQuery += " SELECT @RowCount = COUNT(*) FROM tb_NGD_ToDownloadQueue ";
            strQuery += " WHERE fk_DownloadRequestScales = ( SELECT TOP 1 fk_DownloadRequestScales FROM tb_NGD_ToDownloadQueue WHERE AutoID = " + GetDbNumberValue(strAutoID) + " ) AND [Status] = 1 ";

            strQuery += " IF @RowCount > 0 ";
            strQuery += " BEGIN ";
            strQuery += " UPDATE tb_NGD_DownloadRequestScales SET JobStatusID = 5 WHERE tb_NGD_DownloadRequestScales.AutoID = ( SELECT TOP 1 fk_DownloadRequestScales FROM tb_NGD_ToDownloadQueue WHERE AutoID = " + GetDbNumberValue(strAutoID) + " ) ";
            strQuery += " END ";
            strQuery += " ELSE ";
            strQuery += " BEGIN ";
            strQuery += " UPDATE tb_NGD_DownloadRequestScales SET JobStatusID = 2 WHERE tb_NGD_DownloadRequestScales.AutoID = ( SELECT TOP 1 fk_DownloadRequestScales FROM tb_NGD_ToDownloadQueue WHERE AutoID = " + GetDbNumberValue(strAutoID) + " ) ";
            strQuery += " END ";


            //strQuery += " UPDATE tb_NGD_DownloadRequestScales SET ";
            //strQuery += " JobStatusID = 2 ";
            //strQuery += " WHERE AutoID = ( SELECT TOP 1 fk_DownloadRequestScales FROM tb_NGD_ToDownloadQueue WHERE AutoID = " + GetDbNumberValue(strAutoID) + " ) ";

            if (!baseClass.MapInfo_NoRetValue(strQuery))
            {
                ErrMessage = baseClass.ErrMessage;
                return false;
            }

            return true;
        }

1 Ответов

Рейтинг:
0

OriginalGriff

Нет, это не так - если только ваш набор методов GetDbXValue не обрабатывает данные и не удаляет любые данные, подверженные SQL-инъекциям. И мы понятия не имеем, что они делают, мы их не видим. И даже если они делают, они не делают вещи, которые отлично работают на всех, потому что просто проходя даты для SQL в виде строки опирается на интерпретацию даты в две разные системы: если С~ код ПК возвращает короткое дата от метода toString 01/02/03 он опирается на SQL interpretting, что правильно, но это должно быть "1 февраля 2003", "2-го января 2003 года", или "3-го февраля 2001 года"? SQL этого не знает, как и ваше программное обеспечение для презентаций, когда оно его извлекает!

Вместо того чтобы возиться с раундами взлома, чтобы попытаться избежать этого, просто используйте параметризованные запросы для передачи фактических значений в однозначной форме, которая вообще не подлежит SQL-инъекции:

string strQuery = "UPDATE tb_NGD_ToDownloadQueue SET Status = 2, DownloadEnd = @DLE WHERE AutoID = @AID";
using (SqlCommand cmd = new SqlCommand(strQuery, con))
   {
   cmd.Parameters.AddWithValue("@DLE", DateTime.Now);
   cmd.Parameters.AddWithValue("@AID", strAutoID);
   ...
   }