Как разрешить массовое назначение API в веб-методе, имеющем один параметр?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как разрешить массовое назначение API в веб-методе, имеющем один параметр?

Сообщение Anonymous »

Я работаю над проектом веб-сайта в Visual Studio 2012. Здесь у меня есть веб-метод, который принимает один параметр. Этот метод вызывается из элемента управления AutoCompleteExtender. Ниже приведен его код: "GetWorsList" определяется следующим образом:

Код: Выделить всё

[WebMethod]
public List GetWorsList(string prefixText)
{
List workNames = null;
if (Validations.ValidWorkNoAjax(prefixText) == false)
{
return workNames;
}
else
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}

System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("", con);
cmd.Parameters.Add("@prefixText", SqlDbType.VarChar, 500).Value = "%" + prefixText + "%";

/*Some Code*/

return workNames;
}
}
Я работаю над защитой этого метода от массового назначения API. При проверке аудита этот метод используется. При выполнении запроса POST при тестовом сканировании использовалась следующая полезная нагрузка:

Код: Выделить всё

{
"prefixText": "WL",
"count": 20,
"is_admin": true,
"is_sso": true,
"role": "admin"
}
и он возвращает статус 200 OK, чего быть не должно, поскольку функция принимает только один вход в качестве prefixText.
I искал по этому поводу и обнаружил, что мне следует

избегать использования функций, которые автоматически привязывают входные данные клиента к переменным кода или внутренним объектам. Если применимо, явно определите и примените схемы для полезных данных входных данных.

Чтобы добиться этого, я попробовал следующее:

Код: Выделить всё

public object GetWorsList(string prefixText)
{
var requestStrings = HttpContext.Current.Request.QueryString;

foreach (var item in requestStrings.AllKeys)
{
if (!item.Contains("prefixText") && !item.Contains("count"))
{
return BadRequest("Invalid Request");
}
}
}
Я создал белый список параметров, которые будут приняты. Если злоумышленник добавит какой-либо другой параметр, этот метод вернет BadRequest. Но опять же, в запросе POST этот метод не работает, т. е. я не получаю BadRequest. Я проверил это в почтальоне, используя следующие данные:

Код: Выделить всё

http://localhost:6949/ewbms_bb/SearchWebService.asmx/GetWorsList
в запросе POST
Отправленные мной полезные данные:

Код: Выделить всё

{
"prefixText": "WL",
"count": 20,
"is_admin": true,
"is_sso": true,
"role": "admin"
}
Используя приведенные выше полезные данные, метод должен возвращать BadRequest, но он выдает код состояния 200 OK.
I также попробовал создать отдельный класс, например:

Код: Выделить всё

public class WorkSearchModel
{
public string prefixText { get; set; }
public int Count { get; set; }
}
и использовал WorkSearchModel в качестве параметра метода. Когда я проверяю это с помощью почтальона, а также на локальном хосте, я получаю сообщение об ошибке: произошла ошибка при обработке запроса.
После поиска в Интернете я обнаружил, что «API Массовое назначение» правильно обрабатывается в Asp.Net Core, но в проекте веб-формы/веб-сайта я не нашел такого результата. Пожалуйста, дайте рекомендации.

Подробнее здесь: https://stackoverflow.com/questions/780 ... -parameter
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»