#asp.net #sql #sql-server #security
#asp.net #sql #sql-сервер #Безопасность
Вопрос:
Я не уверен, что мой SQL-код и практика здесь хороши, поэтому, надеюсь, кто-нибудь сможет просветить меня. Чтобы попытаться отделить мой DAL от бизнес-уровня, я не использую SqlDataSource на странице. Вместо этого я создал gridview для отображения результатов и вызвал команду SQL для извлечения результатов. У меня есть следующая команда SQL:
string CommandText = "SELECT User.FName User.Surname, Product.Name, Product.Quantity, Product.Price FROM User, Products WHERE Product.UserID = User.UserID";
Затем результаты загружаются в datareader и привязываются к элементу управления gridview. Это работает нормально. Однако является ли инструкция SQL неэффективной? Я заметил, что некоторые инструкции SQL заключены в квадратные скобки вокруг каждого поля, но когда я пытаюсь поместить их вокруг своих полей, результаты не отображаются.
Я также пытаюсь объединить имя и фамилию в один столбец с пробелом между ними, но в приведенном выше примере пробел между ними не ставится, и, похоже, я не могу добавить пробел в инструкцию SQL.
Наконец, все это происходит в коде страницы корзины покупок. Однако небезопасно ли иметь инструкцию connectionstring и выше SQL в коде? Моя строка подключения зашифрована в файле web.config и вызывается через Configuration API.
Спасибо за любую помощь.
Комментарии:
1. Где находится ProductDetail. Откуда берется цена?
2. Извините, это было из более старого файла. Я исправил код.
Ответ №1:
Во-первых, использование квадратных скобок в большинстве случаев необязательно (IIRC, существует очень мало случаев, когда они действительно необходимы, например, использование ключевых слов в инструкции). Каждый идентификатор заключен в квадратные скобки, например,
SELECT [Server_Name].[Database_Name].[Table_Name].[Field_Name], ...
Во-вторых, чтобы добавить пробел, вы можете использовать SELECT User.FName ' ' User.Surname
. Вы также можете захотеть присвоить ему псевдоним — SELECT User.FName ' ' User.Surname AS [name]
В-третьих, сохраните строку подключения в web.config и зашифруйте ее с помощью ключа.
Наконец, вы можете рассмотреть возможность внедрения в проект уровня доступа к данным, который может возвращать объекты из вашего источника данных (возможно, для этого стоит взглянуть на NHibernate, LINQ to SQL или Entity Framework). Затем вы можете привязать коллекцию объектов к вашему GridView.
Ответ №2:
Долгое время SQL не использовался, но я не вижу проблемы с вашим запросом, если база данных спроектирована хорошо. Чтобы объединить два столбца string, используйте что-то вроде этого:
User.FName ' ' User.Surname AS UserName
Просто добавьте пробел между двумя строками.
Что касается соображений безопасности: все, что другие люди могут видеть, — это отображаемая веб-страница. Если вы не предоставляете строку подключения или запросы в отображаемом HTML / JS коде (например, в комментариях и т.д.), вам не следует беспокоиться. Строка подключения, хранящаяся в web.config, и структура базы данных, видимая в запросах в коде сервера, безопасны до тех пор, пока сервер безопасен.
Ответ №3:
Попробуйте это:
string CommandText = "SELECT
User.FName ' ' User.Surname AS Fullname,
Product.Name,
Product.Quantity,
ProductDetail.Price
FROM
User, Products
WHERE
Product.UserID = User.UserID";
С наилучшими пожеланиями,
Фабиан