#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);
поскольку вы этого не делаете, вы в безопасности 🙂