Запретить пользователю манипулировать запросами POST в ASP.NET Core

У меня есть простой сайт страниц ASP.NET Core Razor, на котором пользователь вводит номер комнаты, и он выводит результат, доступен он или нет.

После завершения разработки он был отправлен команде безопасности, и мы получили следующее сообщение:

Проблема существует на стороне POST: когда мы манипулируем запросом, мы можем передавать специальные символы (необработанные) или закодированные URL-адреса.

Это часть Index.cshtml.

<input class = "form-control" asp-for = "InputRoomNo" pattern = "[a-zA-Z0-9]+" title = "Only charcters and letters please" minlength = "3" maxlength = "5">

Это большая часть Index.cshtml.cs

public class IndexModel : PageModel
{
    public readonly IConfiguration config;
    [BindProperty(SupportsGet = false)]
    public string InputRoomNo { get; set; }
    public Room roomInfo = null;
    public string conn;
    
    public IndexModel(IConfiguration Configuration)
    {
        config = Configuration;
    }
        public void OnPost()
        {
            conn = config.GetConnectionString("ConnectionString");
            string b = $"{InputRoomNo}";
            b = Request.Form["inputRoomNo"];
            roomInfo = Search($"{InputRoomNo}");
        }

        public void OnGet()
        {
        }

Поиск — это метод, который открывает соединение с базой данных и выполняет выбор.

Что не так и как можно решить проблему безопасности?

ОБНОВЛЕНИЕ: После применения предложенного ответа я получил такой ответ: Проблема все еще существует при обработке запроса, специальные символы (включая пробел (%20) проходят) Его можно обойти, используя кодировку URL-адреса или перехватив запрос и отправив специальные символы длиной до 5 символов.

Похоже, вы не выполняете никакой очистки ввода по запросу. Вам необходимо проверить данные на клиенте И на вашем API, чтобы убедиться, что получаемые вами данные заслуживают доверия.

Peppermintology 17.04.2024 10:12

Я новичок в мире веб-разработки, есть какие-нибудь предложения?

user10191234 17.04.2024 10:14

Прочтите некоторые документы по проверке ввода данных пользователем.

Peppermintology 17.04.2024 11:40

По моему мнению, вам также необходимо установить аннотации данных для модели «InputRoomNo», чтобы сервер уловил неожиданный символ. Специальное промежуточное программное обеспечение для проверки возможности HTTP-запроса.

Fengzhi Zhou 17.05.2024 07:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы путаете понятия, поэтому вам может помочь упрощение.

  1. У вас уже есть InputRoomNo в качестве BindProperty, что означает, что метод OnPost может прочитать значение оттуда.
  2. В результате нет необходимости использовать Request.Form, поскольку вы можете ссылаться на значение вашего объекта недвижимости.
  3. Непонятно, для чего используется b

Ваш код можно упростить следующим образом (если b не используется в коде, который не был включен в ваше сообщение):

public void OnPost()
{
    roomInfo = Search(InputRoomNo);
}

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

ПС. Поскольку это метод Search, который открывает соединение с базой данных для выбора данных, вам также не нужно соединение в OnPost.

Фактически, вы можете абстрагировать это до именованного обработчика страницы, и в этом случае ваша функция поиска изменит имя с Search на OnPostSearch или OnPostSearchAsync, если вы выполняете в ней асинхронные операции.

public async Task OnPostSearchAsync()
{
    conn = config.GetConnectionString("ConnectionString");
    // Do your search logic here.

    roomInfo = ...; // Assign roomInfo to your search results
}

Your form would change:

    <form method = "post">

Would become

     <form method = "post" asp-page-handler = "Search">

b — это строка b = $"{InputRoomNo}", но как продезинфицировать, чтобы предотвратить то, что они сказали?

user10191234 17.04.2024 10:23

Когда вы напрямую ссылаетесь на свойство, как я показал, в этом нет необходимости. Ядро Asp.net создано для предотвращения вмешательства злоумышленников описанным способом.

Ortund 17.04.2024 10:27

Спасибо, отправлю и посмотрю на реакцию.

user10191234 17.04.2024 13:38

Другие вопросы по теме