razor и cshtml: как выполнить db.Выполнить для оператора select?

#c# #razor

#c# #razor

Вопрос:

Я делаю быструю страницу CSHTML с целью тестирования.

Мне нужно получить доступ к базе данных на основе параметра id в URL:

 var id = Request.QueryString["id"];
var db = Database.Open("mydatabase_connection");
var query = "select * from myrecord where id =  "   id;
var row = db.QuerySingle(query);
  

// я могу отобразить поле (называемое именем) выбранной записи следующим образом:

 @row.name
  

Очевидно, что описанный выше подход подвержен атакам безопасности. Я надеюсь получить запись следующим образом:

 var query = "select * from myrecord where id=@0";
var row = db.Execute(query, id);
  

Однако я получаю ошибку во время выполнения при получении значения поля:

 @row.name
  

Каков правильный способ получения «строки» во втором подходе?

Спасибо и с уважением.

Ответ №1:

Database.Execute предназначен для выполнения оператора SQL без запроса и возвращает количество записей, на которые влияет оператор SQL, как Int .

Я думаю, что метод, который вы действительно хотите использовать Database.QuerySingle , который возвращает an Object .

т.е.

 var query = "select * from myrecord where id=@0";
var row = db.QuerySingle(query, id);
  

Razor:

   @row.name
  

Что касается безопасности от внедрения SQL, этот подход безопасен. Вы передаете значение URL в свой запрос в качестве параметра.

Небезопасным способом выполнения запроса было бы объединение строк:

    var query = "select * from myrecord where id="   id; 
  

Не делайте этого! Это позволяет злоумышленнику добавлять операторы SQL к вашему запросу! Вместо этого всегда используйте параметризованные запросы.

Комментарии:

1. Спасибо!!! Правильной командой должна быть db.QuerySingle(запрос, идентификатор). Вы не возражаете обновить свой пост?

2. О, я думаю, я неправильно понял ваш вопрос. Вы задавались вопросом о безопасности использования переменных URL с db.QuerySingle . Способ использования метода безопасен, поскольку вы передаете id метод в качестве параметра. Небезопасной альтернативой было бы прямое добавление переменной URL в строку запроса: var query = String.Format("select * from myrecord where id={0}", id); поскольку вы этого не делаете, вы в безопасности 🙂