Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

В шестом выпуске рассылки ‘.Net Собеседник’ вы можете познакомиться с обзором новых компонент и продуктов, разработанных с использованием платформы, прочесть перевод статьи ‘Предварительный обзор Whidbey’ и рассказ ещё об одном способе передачи значений переменных между страницами в веб-приложении (да и не только) – ‘Защита строк запросов: предупреждаем искажение данных, передающихся между страницами приложения’. Список вопросов, оставшихся без ответа на форумах .Net сайта http://www.sql.ru/ традиционно завершает номер.


Информационный Канал Subscribe.Ru

.Net Собеседник #6

Содержание
  1. От автора
  2. Обзор новостей
  3. Предварительный обзор Whidbey 
  4. Время кода - Защита строк запросов: предупреждаем искажение данных, передающихся между страницами приложения.
  5. Форумы .Net на www.sql.ru

От автора

Здравствуйте, коллеги!

Как-то всё навалилось сразу - командировка, новый проект на работе, и самое вкусное - Whidbey Technical Preview. Собственно говоря, именно вдохновлённый наличием Whidbey, я и приготовил перевод небольшого, но интересного обзора, посвященного нововведениям в этом замечательном продукте. Уверен, что все мы со временем будем им пользоваться для разработки своих проектов. Через некоторое время после выхода рассылки я выложу на сайте http://www.sql.ru/users/hdrummer скриншоты среды разработки, м.б. с комментариями - любопытные, you are welcome! А теперь не буду утомлять вас -

На этом всё, желаю интересного чтения.

{К содержанию}

Обзор новостей

  1. Вышел PostgreSQLDirect .NET Data Provider
    PostgreSQLDirect .NET - это поставщик данных для прямого доступа к БД PostgreSQL для приложения, написанного на платформе Microsoft .NET Framework. Разработан на основе технологии ActiveX Data Objects для .NET Framework (или ADO.NET). Поставщик данных PostgreSQLDirect .NET используется таким же образом, как и поставщик данных для SQL Server .NET или OLE DB .NET.
    PostgreSQLDirect .NET использует родной событийно-основанный протокол для взаимодействия с сервером PostgreSQL. Использование этого поставщика позволяет создавать небольшие и быстрые приложения, использующие PostgreSQL.

  2. Генератор кода MyGeneration
    MyGeneration - это инструмент разработчика, генерирующий код на основе шаблонов, комбинируя использование широко известного движка сценариев с мощным API мета-данных БД. На рынке существует множество других генераторов кода, однако MyGeneration лучше, потому что:
    • Он на 100% бесплатен.
    • Позволяет создавать псевдонимы сущностей (таблиц, отношений, полей…)
    • Поддержка множества СУБД - Microsoft Sql Server 2000, Oracle, IBM DB2, MySql, and Microsoft Access.
    • Поддерживает интерактивный ввод шаблонов
    • Имеет мощный редактор шаблонов
  3. Active Up выпустила ActiveCalendar V2.0
    Компания Active Up выпустила Active Calendar V2.0. Active Calendar - это серверный компонент для приложений ASP.NET, позволяющий пользователям быстро выбирать дату и/или время, используя профессионально выглядящий календарь с системой событий на стороне клиента. Для работы компонента не используется ни отправка страницы на сервер, ни внешний файл скриптов.

  4. Статья: Практическое использование особенностей .NET CLR, встроенного в SQL Server Yukon
    Когда я впервые услышал, что SQL Server "Yukon" будет иметь встроенный .NET Common Language Runtime (CLR), я хотел найти такую проблему, для решения которой было бы полезно задействовать эту новую возможность. В этом наставлении вы увидите, как вы можете использовать Yukon совместно с сборкой на .NET, сгенерированной Visual Studio .NET "Whidbey".

  5. Выпущен PDF4NET 2.4
    Компания O2 Solutions выпустила PDF4NET 2.4, .NET библиотеку для создания и редактирования на лету файлов pdf в любом приложении - WinForms/WebForms/мобильном приложении. Версия 2.4 поддерживает объединение и разбиение файлов pdf, обеспечение правил безопасности для существующих файлов pdf, импортирование внешних страниц в новые документы и наложение страниц. Библиотека PDF4NET лицензируется только для разработчика и может свободно распространяться. Для скачивания доступна пробная версия.

  6. В SoftArtisans FileUp v5 добавлена поддержка докачки
    Компания SoftArtisans выпустила новую версию набора FileUp, в которую была добавлена возможность докачки файлов. В пятой версии также преодолено встроенное ограничение по размеру файла для ASP.NET и IIS 6, что также позволяет осуществлять неограниченное количество загрузок. Корпоративная редакция FileUp предлагает бесподобную безопасность обмена файлами – эти файлы не хранятся на уязвимых веб-серверах, а перенаправляются прямо в безопасное файлохранилище.

  7. Вышел RapTier 1.4
    Вышел RapTier 1.4, генератор ASP.NET, C#, VB.NET и SQL кода. Новые возможности: создание интерфейса пользователя ASP.NET; расширенная модель БД (индексы, значения по умолчанию, системные объекты, описания и т.д.); поддержка MS SQL, Oracle, и MySql; улучшенная поддержка FoxPro, Sybase ASE, и DB2; поддержка @@IDENTITY для MS Access и MySql; создание обёрток для существующих хранимых процедур; генератор документации по БД. Существует редакция для свободного скачивания.

  8. Aspose.Chart 1.8 - поддержка Macromedia Flash
    Aspose.Chart – это .NET компонент, позволяющий создать 21 тип бизнес- и финансовых графиков и диаграмм. Новый выпуск имеет такие особенности, как поддержка Chart.SaveToSwf Api для создания Flash-диаграммы и свойство DataPoint.URL для реализации поддержки переход по некому URL при щелчке по некоторым участкам диаграммы.

  9. Вышел Aspose.Excel 1.8
    Компонент Aspose.Excel – .NET компонент создания отчётов в формате Excel, позволяющий читать и писать файлы Excel без использования Microsoft Excel. В новой редакции отметим улучшенную поддержку диаграмм, группировку столбцов/строк, поддержку API защиты листа, настройку страницы, поддержку использования нескольких шрифтов в одной ячейке и функции IF в формулах.

  10. Aspose.License 1.3 – теперь бесплатен
    Aspose.License - .NET компонент, имеющий функциональность лицензирования и помогающий вам защищать ваши приложения от пиратского использования. Теперь – совершенно бесплатен.

  11. Aspose.Obfuscator 1.6 – теперь бесплатен
    Aspose.Obfuscator - .NET приложение, позволяющее защищать ваш исходный код от декомпиляции. Теперь совершенно бесплатен.

  12. Вышел Aspose.Word 1.1
    Aspose.Word - .NET компонент, позволяющий писать и читать документы Word без использования Microsoft Word. Новый выпуск поддерживает таблицы и их форматирование, маркированные и нумерованные списки и их форматирование и многое другое.

{К содержанию}

Предварительный обзор Whidbey

Предварительный обзор Whidbey

ЯЗЫК: C#
Адрес оригинальной статьи: http://msdn.microsoft.com/library/en-us/dv_vstechart/html/whidbey_csharp_preview.asp
Компания: Microsoft

ПЕРЕВОД: Чужа В.Ф. ака hDrummer


Вступление

В следующей версии Microsoft Visual Studio®, которую также называют ‘Whidbey’, добавлено большое количество улучшений, касающихся C#-разработчиков – новые языковые конструкции, новые возможности компилятора, возможность более производительно писать код, более широкие возможности по отлавливанию ошибок. Что касается языковых инноваций, Whidbey C# теперь поддерживает шаблоны (generics), итераторы (iterators), фрагментированные типы (partial types) и анонимные методы. Благодаря улучшенному компилятору вWhidbey разработчики могут прямо в исходном коде блокировать вывод предупреждений компилятора или проверять код на соответствие стандартам ECMA/ISO. Whidbey также включает несколько новых возможностей по увеличению скорости разработки - рефакторинг, расширения кода, форматирование кода, улучшенный IntelliSense и многое другое. Отладчик также был изменён - добавлены усовершенствованные подсказки, визуализаторы, вычисление выражений во время дизайна приложения и т.д. В общем, эта статья посвящена некоторым новым возможностям, доступным в Whidbey.

Языковые инновации


Шаблоны (Generics)

Поддержка шаблонов – одно из самых больших языковых нововведений в C# Whidbey. Шаблоны в C# позволяют классам, структурам, интерфейсам и методам быть параметризованными теми типами данных, которые они хранят и которыми манипулируют. Полезность шаблонов заключается в том, что многие общие классы и структуры могут быть параметризованы данными, которые они хранят и с которыми работают. Объявление таких языковых конструкций носит название ‘объявление шаблонов классов’ и ‘объявление шаблонов структур’. Также, многие интерфейсы могут использовать преимущества, предоставляемые поддержкой шаблонов – их объявление называется ‘объявление шаблонов интерфейсов’. Методы также могут быть типами для реализации ‘шаблонов алгоритмов’, такие методы называются методами-шаблонами.

В примере, приведенном ниже, мы создадим объявление класса-шаблона Stack, для которого укажем параметр типа ItemType, объявленный в угловых скобках после имени класса. Вместо того, чтобы производить приведение к object, экземпляры класса-шаблона Stack будут принимать тот тип, для работы с которым они созданы, сохраняя данные этого типа без всяких дополнительных преобразований. Параметр типа ItemType исполняет роль заполнителя до тех пор, пока для использования не будет указан реальный тип. Заметьте, что ItemType используется как тип элементов массива items, как тип для параметра в методе Push и тип возвращаемого значения в методе Pop:


public class Stack<ItemType>
{
private ItemType[ ] items;
public void Push(ItemType data) {...}
public ItemType Pop() {...}
}

В случае использования класса-шаблона Stack, как в примере, приведенном ниже, мы должны указать тип, который будет использован. В нашем случае мы указываем классу Stack необходимость использования типа int, путём указания аргумента типа с использованием угловой нотации после имени класса:

Stack<int> stack = new Stack<int>();
stack.Push(3);
int x = stack.Pop();

Таким образом, мы создали новый сконструированный тип, Stack, для которого каждый ItemType внутри декларации класса-шаблона Stack замещается аргументом типа int. И правда, когда мы создаём экземпляр класса Stack, массив items теперь выглядит как массив int[], а не как object[], реализуя значительную эффективность в хранении элементов этого типа. Дополнительное преимущество состоит в том, что отпала необходимость упаковки типа int при размещении в стеке. Более того, при получении переменной из стека нам не нужно приводить её к определённому типу, поскольку эта реализация класса Stack хранит переменную именно как переменную int в своём внутреннем массиве.

Если же мы хотим хранить переменные другого типа в экземпляре класса Stack, то мы должны создать новый сконструированный тип на основе класса-шаблона Stack, указав новый тип аргумента. Предположим, что у нас есть некий тип Customer, экземпляры которого мы хотели бы хранить в классе Stack. Для того, чтобы реализовать такую функциональность, мы просто используем класс Customer как аргумент типа для Stack и легко продолжим использование нашего кода:


Stack<Customer> stack = new Stack<Customer>();
stack.Push(new Customer());
Customer c = stack.Pop();

Конечно же, так как мы создали экземпляр класса-шаблона Stack с типом Customer как типовым аргументом, то теперь мы ограничены возможностью хранения объектов класса Customer (или объектов класса-потомка класса Customer). Шаблоны реализуют строгую типизацию, это значит, что больше мы не сможем хранить переменные типа integer в экземпляре класса stack, так, как показано здесь:


Stack<Customer> stack = new Stack<Customer>();
stack.Push(new Customer());
stack.Push(3); // ошибка компилирования
Customer c = stack.Pop(); // нет необходимости в приведении типа

Фрагментированные типы

Фрагментированные типы позволяют одному типу, такому, как класс, быть размещённым в разных файлах. Наиболее полезной эта особенность выглядит для таких генераторов кода, как Visual Studio, которая пишёт код в файлы, отличные от тех, с которыми работает программист. Используя такую возможность, дизайнеру намного проще разбирать и восстанавливать свой код без затрагивания кода, написанного программистом. Например:


// файл Form1Designer.cs
public partial class Form1: System.Windows.Forms.Form
{ // сгенерированный код
void InitializeComponent() { … }
}

// файл Form1User.cs
public partial class Form1
{
// код, введенный программистом
void Mouse_Click(object sender, MouseEventArgs e) { … }
}

Анонимные методы

Анонимные методы могут рассматриваться как возможность передавать некий блок кода как параметр. В общем случае, анонимные методы могут быть использованы там, где можно использовать делегаты. Простейший пример может выглядеть так:


button1.Click += delegate { MessageBox.Show("Click"); };

Здесь нужно обратить внимание на несколько вещей. Во-первых, на возможность написания inline-метода, т.е. прямо в строке, вместо имени передаваемого параметра. Во-вторых, здесь вы не видите описания возвращаемого типа или параметров метода. В-третьих, ключевое слово delegate используется для компенсации особенностей такой конструкции. Возвращаемый тип здесь не указан, поскольку компилятор подразумевает его. То есть, компилятор знает, чего ему ожидать (обработчик событий) и затем проверяет, можно ли правильно конвертировать анонимный метод к ожидаемому.

Также вы наверняка заметили отсутствие параметров в предыдущей реализации анонимного метода. Их не там не было потому, что они там и не были нужны. Если же они всё-таки нужны, то их объявление должно выглядеть так:


button1.Click += delegate(object sender, EventArgs e) { MessageBox.Show(sender.ToString()); };

Заметьте, что заданы как типы, так и имена параметров.

Итераторы

Итераторы могут рассматриваться как логическое продолжение конструкции foreach в C#, поскольку итераторы упрощают реализацию последовательного перемещения по коллекции. Сейчас очень легко перемещаться по коллекции с использованием конструкции foreach. Однако, написание коллекции, поддерживающей foreach, вызывает необходимость реализации интерфейсов IEnumerable и IEnumerator, а также создание отдельного класса или структуры Enumerator . Итераторы облегчают создание такого кода и позволяют разработчикам проще создавать перечисляемые коллекции. Например:

class List<T>: IEnumerable<T>
{
  private T[] elements;
  public IEnumerator<T> GetEnumerator()
  {
   foreach (T element in elements)
   { yield element; } }
}

В вышеприведенном примере вы наверняка заметили ключевое слово yield. yield может быть использовано только в тех методах, которые возвращают IEnumerator, IEnumerable или их шаблоны-эквиваленты. Итераторы также могут быть именованными и передаваться как параметры, однако, в большинстве случаев, именованные итераторы возвращают IEnumerable вместо IEnumerator. Например:

class List<T> {
  private T[ ] elements;
  public IEnumerable<T> Range(int from, int to)
  {
   while (from < to) yield elements[from++];
  } }

Квалификатор глобального пространства имён

   
Создатели генераторов кода, таких как Visual Studio, столкнулись с проблемой смешивания кода, введенного программистом и сгенерированным автоматически. В частности, мы поощряем использование полной квалификации типов в коде, сгенерированном автоматически. Однако и с этим подходом есть одна проблема – полная квалификация типа делает невозможным поиск типов, начиная с корневого пространства имён. Квалификатор глобального пространства имён решает эту проблему, представляя нам новый оператор "::", который может быть использован как префикс пространства имён или типа. Этот оператор позволяет разработчикам явно указывать корневое пространство имён в коде, так как показано ниже.

namespace Acme
{
namespace System
{
class Example
{
static void Main()
{
// В Visual Studio 2003, поиск
// System.Console.WriteLine начнётся
// в пространстве имён Acme.System.
::System.Console.WriteLine("Hello");
}}}}

Статические классы

Статические классы должны послужить заменой созданию sealed классов, содержащим только статические методы, с private конструктором. Такой класс теперь может быть создан путём добавления модификатора static к объявлению класса. Например:


public sealed class Environment
{
// создаём приватный конструктор,
//чтобы избежать создания экземпляра класса
private Environment() { }
}

Теперь можно написать как:

public static sealed class Environment
{
}

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


Улучшения компилятора



Внутреннее управление предупреждениями

Ещё одной особенностью версии Whidbey является возможность контроля над отображением предупреждений для некоторой области кода. Эта директива имеет многим знакомую форму конструкции #pragma. Ниже размещён пример использования ключевого слова pragma для блокирования предупреждений компилятора в некотором участке кода.

#pragma warning disable 135
// блокирует предупреждение CS135 в этом блоке
#pragma warning restore 135

Опции командной строки

Whidbey включает несколько опций командной строки. Ниже приведено короткое описание каждой из них:
  • /warnaserror: В Visual Studio .NET 2003 эта опция позволяет считать все предупреждения компилятора как ошибки. В Whidbey эта опция несколько расширена, позволяя разработчикам заставлять компилятор считать некоторые конкретные предупреждения как ошибки, а другие - нет. Пример, приведенный ниже, показывает можно трактовать все предупреждения как ошибки, исключая предупреждение 618:
    csc /warnaserror /warnaserror-:618 ...

    И наоборот, можно заставить только одно предупреждение считаться ошибкой:
    csc /warnaserror:1595 ...
  • /errorreport:<string>: Эта опция контролирует отчёт программы Dr. Watson для компилятора. Более подробную информацию о Dr. Watson можно получить здесь - http://www.microsoft.com/technet/prodtechnol/winxppro/proddocs/drwatson_setup.asp
    Возможные параметры перечислены ниже:
    • /errorreport:prompt: показывается диалоговое окно с информацией об ошибке.
    • /errorreport:send: В случае возникновения внутренней ошибки, компилятор не должен выдавать пользователю модальное диалоговое окно. Однако, он по-прежнему может компилировать и отсылать сообщения об ошибках. Текст, который должен был быть выведен в диалоговом окне, выводится в командной строке.
    • /errorreport:none: Эта настройка указывает компилятору не отсылать никакой информации об ошибке в Microsoft. Это поведение характерно для Visual Studio 2002 и Visual Studio 2003 и является опцией по умолчанию.
  • /langversion:<string>: Цель существования этой настройки – в полном соблюдении стандарта ECMA/ISO. Если эта настройка установлена в ISO-1, компилятор сообщит обо всех особенностях Whidbey, не являющихся частью стандарта.
  • /keycontainer, /keyfile, /delaysign: Эти опции компилятора будут использоваться для замены одноимённых атрибутов для большей гибкости в задании аргументов командной строки.
Увеличение производительности


Рефакторинг

Среда разработчика C# Whidbey теперь включает поддержку рефакторинга. Рефакторинг позволяет разработчикам автоматизировать некоторые общие задачи, касающиеся реструктурирования кода. Более подробную информацию по рефакторингу можно найти по адресу http://www.refactoring.com/. Используя встроенную поддержку рефакторинга, разработчики могут, например, использовать переименовывающий рефакторинг для автоматизации процесса переименования переменной в исходном коде.

Рефакторинги, доступные в версии Whidbey Technical Preview:

  • Экстракция метода 
  • Переименование
  • Выделение интерфейса
  • Инкапсулирование поля
  • Изменение сигнатуры метода
  • Замена Arraylist

Во время вызова рефакторинга переименования (Rename), пользователь видит диалоговое окно Preview Changes. В нём программист видит все те строчки кода, где встречается переменная с таким именем. Контекстное меню этого окна также позволяет разработчику перепрыгнуть именно на любую строчку кода, которая отображается в этом окне.

Расширители кода (Expansions)

Расширители кода, являясь кусочками кода ‘для заполнения пустого места’, помогают уменьшить число нажатий на клавиши для повторяющихся задач и упрощают добавление общих конструкций, таких, как конструкция foreach, в ваше приложение. Разработчики могут получить доступ к расширителям через контекстное меню или назначением для них коротких клавиш. Расширители являются полностью открытыми XML-файлами, которые могут быть изменены или созданы пользователями.

Форматирование

Форматирование исходного кода – дело личных предпочтений (Наконец-то они это поняли, – Прим.переводчика), и теперь Visual Studio Whidbey включает несколько опций для полного контроля и настройки того, как будет форматироваться ваш код. Настройки форматирования включают в себя скобки, пробелы, отступы, переносы и выравнивание. Вы также можете выбрать – будет ли IDE форматировать весь код автоматически или только указанную часть кода.

Профили

В то время, как разработчики наслаждаются возможностью полной настройки среды разработки – включая шрифты, окна и форматирование, поделиться своими настройками с другими членами команды или перенести свои настройки на другую машину всегда было нелёгким процессом. Whidbey имеет возможность легко импортировать и экспортировать ваши настройки между машинами или делиться ими с другими.

Улучшенный IntelliSense

IntelliSense был переработан для восприятия шаблонов. Кроме того, он был улучшен и для обработки исключений. При добавлении блока try/catch, обработчик секции catch теперь фильтрует доступные варианты и предоставляет к использованию список, в котором находятся только типы исключений. То же касается и атрибутов.

Раскрашивание пользовательских типов и ключевых слов

Одним из самых удобных способов отличать типы от ключевых слов является их разная раскраска в среде разработчика. Whidbey поддерживает возможность раскрашивать пользовательские типы и ключевые слова с целью лучшей читаемости кода.

Новая система компоновки

Система компоновки в Whidbey была существенно улучшена. Она имеет название MSBuild и использует открытый и наращиваемый механизм, описывающий как происходит компоновка. Пользователи могут сами создавать собственные системы компоновки, используя индивидуальные сценарии, написанные на XML. Пример, размещённый ниже, демонстрирует простой файл MSBuild со сценарием компилирования, который будет вызывать компилятор C# для любого файла, имеющего расширение ‘.cs’.

- <Project>
<Item Type="Compile" Include="*.cs" />
 - <Target Name="Build">
  <Task Name="Csc" Sources="@(Compile)" />
 </Target>
</Project>

Поиск по умолчанию ищет в скрытом тексте

Большое количество просьб, из тех, которые мы получили, касались окна Find and Replace. Разработчики просили изменить его поведение по умолчанию так, чтобы поиск происходил и в свёрнутом в ‘#region’ тексте. ВVisual Studio 2003 это поведение отключено по умолчанию, в Whidbey поиск среди скрытого текста по умолчанию включен.

Автосохранение в IDE

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

Слежение за изменениями

Слежение за изменениями в коде визуально разделяет код сохранённый от не сохранённого.

Новые компоненты

Добавлено множество компонент – как для WinForms, так и для Web-приложений. Появились новые категории компонент для asp.net - Personalization, Security, Validation и Navigation. Полный перечень улучшений в Visual Studio для web-разработчиков доступен по адресу:  http://msdn.microsoft.com/asp.net/whidbey/

Смарт-теги для компонент

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

Быстрое создание Web-проектов

В случае создания веб-проекта с помощью Whidbey, вам более нет необходимости инсталлировать на ПК IIS. Просто выберите сайт для создания с помощью Visual Studio и она создаст вам его в расшареной папке, в ней вы сможете запускать и отлаживать свой проект.

Поддержка "Yukon"

Visual Studio Whidbey поддерживает создание приложений, использующих следующую версию SQL Server, известную как "Yukon."

Отладка

Большие изменения коснулись отладчика – появилась возможность просматривать во время отладки информацию о сложных типах прямо в редакторе кода при наводке мыши на переменную. Добавлены визуализаторы для сложных типов, таких как наборы данных, XML и т.д., которые раньше было сложно просматривать в отладчике.

Вычисление значений выражений во время создания кода

В Whidbey окно Immediate может быть использовано для вычисления выражений в режиме проектирования приложения без необходимости компилирования и запуска приложения.

Конфигурируемые настройки безопасности

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

Выводы

Visual Studio Whidbey была разработана на основе Visual Studio 2002 и Visual Studio 2003 с целью предоставить возможность разработчикам повысить свою производительность. С помощью новых конструкций языка, опций компилятора и всего остального, о чём мы говорили выше, разработчики смогут писать более мощные приложения за меньшее количество времени, фокусируясь на создании кода.

{К содержанию}

Время кода

Защита строк запросов: предупреждаем искажение данных, передающихся между страницами приложения.

ЯЗЫК: C#
ВЕРСИИ ASP.NET: 1.0 | 1.1
АВТОР: Tim Shakarian
http://www.dotnetjunkies.com/
ПЕРЕВОД: Чужа В.Ф ака hDrummer

Одним из общепринятых методов передачи значений между веб-страницами является использование строки запроса. Используя этот метод, мы позволяем пользователю увидеть и изменить передаваемые значения. Если же передача данных должна быть безопасной, то используют другие методы, такие как использование зашифрованных cookie или передачу значений через переменные сессии. Однако, эти способы не всегда приемлемы. В одних случаях нельзя использовать переменные сессий, в других у пользователя отключено использование cookie . Также встречаются ситуации, когда необходимо использовать URL (например, послать его по электронной почте) в то же время не допуская его искажений или URL, время жизни которого ограничено. В этой заметке мы рассмотрим варианты защиты вашего URL’a от намеренных искажений с использованием безопасных строк запроса.

Как насчёт URL-сессий?

Почему бы не попробовать применить решение, использующее URL-базированные сессии? Это решение предполагает возможность хранения зашифрованных данных сессии внутри строки запроса, но не позволяет вам создавать URL’ ы, которые могут быть использованы в других приложениях, а также не даёт возможности создавать URL’ы с заранее заданным временем жизни. К тому же, время жизни URL обычно гораздо более длительно, чем время жизни сессии, которое обычно ограничивается периодом в 20 или 30 минут. Как в случае любой технической проблемы, здесь может быть несколько вполне жизнеспособных подходов. Какое из решений лучше задействовать – решать вам, в зависимости от той проблемы, которую вы решаете.

Строка запроса

Безопасная строка запроса не должна отображать значения переменных, как простой текст, не должна она также давать пользователю возможность изменения значений переменной. Когда вы строите строку запроса, зачастую вы просто добавляете к ней пару имя переменной/значение переменной:

http://localhost/sample.aspx?myKey=myValue&myKey2=myValue2

Безопасная строка работает немного по-другому, вот как она может выглядеть

http://localhost/sample.aspx?x=a89rtgeitrgt4igjbht389tggitdgoiy45yh45

Значения теперь скрыты от глаз пользователя и любая попытка редактирования только повредит данные и их невозможно будет использовать. Как показано выше, вместо того, чтобы передавать пару имя/значение как параметры в строке запроса, мы передаём только одно значение параметра х, которое является зашифрованной строкой, содержащей те же данные.

Все правила, которые мы обычно применяем к обычным строкам запроса, также применимы к безопасным строкам запросов. Например, можно закодировать надлежащим образом каждый параметр и значение (см.: System.Web.HttpUtility.UrlEncode() ). Также необходимо помнить об ограничении ИЕ в 2КБ на строку параметра (Internet Explorer's 2 KB limit). Помните также, что шифрование увеличит размер вашей строки.

Давайте же код наконец!

Использование безопасных строк несложно – практически также просто, как и работа с другими классами типа NameValueCollection. Следующий код просто создаёт объект класса SecureQueryString и добавляет к нему парочку параметров:


// создадим объект
SecureQueryString qs = new SecureQueryString();
// добавим пару имя/значение
qs["Name"] = "hDrummer";
qs["SSN"] = "000-00-0000";

Теперь создадим URL с зашифрованной парой имя/значение. Для этого просто вызовем метод ToString():

string url = "DestPage.aspx?x=" + qs.ToString();

Вы видите, что я использовал параметр с именем “x”. Вы же можете назвать его как хотите, или вообще не использовать именованые параметры, параметр “x” был использован только для иллюстрации.
Ну а теперь, после того, как мы создали URL, необходимо получить значения переменных в принимающей странице. Поскольку значения зашифрованы, мы больше не сможем использовать объект Request для получения значений. К счастью, процесс получения значений в нашем случае практически идентичен классическому:

// просто передадим зашифрованную строку в конструктор
SecureQueryString qs = new SecureQueryString(Request["x"]);
// теперь поработаем с NameValueCollection
string Name = qs["Name"];
string SSN = qs["SSN"];

Всё, что я сделал – передал зашифрованную строку в экземпляр класса SecureQueryString, и получил доступ к переданным значениям, так как будто я использовал объект Request.

Ссылки с ограниченным сроком жизни

Предотвращение искажения строки запроса неотразимо само по себе, но есть и ещё одна прекрасная возможность – создать URL, действительный до какого-то момента времени. Эта возможность хороша в том случае, если вы хотите дать ограниченный доступ к неким ресурсам, не создавая отдельную учётную запись для этого пользователя. Например, можно отправить URL по электронной почте, указав срок жизни этой ссылки - например в пару дней.
Чтобы реализовать временную ссылку, нужно просто установить свойство ExpireTime объекта класса SecureQueryString. Например, построим строчку, время жизни которой – 1 час:


// создадим объект
SecureQueryString qs = new SecureQueryString();
// добавим пару имя/значение
qs["Name"] = "hDrummer";
qs["SSN"] = "000-00-0000";
// установим время жизни в 1 час
qs.ExpireTime = DateTime.Now.AddHours(1);

И если вы с опозданием попробуете использовать эту ссылку, то получите исключение ExpiredQueryStringException . Иначе вы получите значения также, как я показывал ранее.
Некоторые разработчики могут не захотеть получать и обрабатывать такое исключение – в таком случае можно создать что-то вроде свойства IsExpired, которое можно проверять при расшифровке значений. Можно также просто очищать коллекцию NameValueCollection в случае, если ссылка просрочена.

И напоследок

На самом деле можно изменить многое из того, что творится «за кулисами». Например, компонент, использованный для иллюстрации моей методологии, использует для шифрования алгоритм 3DES, в то время как вы, может быть, захотите реализовать другой алгоритм, такой, как AES. Мы также обсуждаем различные методы для обработки просроченных данных. Код ваш, так что делайте с ним, что угодно!

Тем из вас, кто заобтится об эффективности, придётся проводить свои собственные тестирования. Многое зависит от используемого алгоритма шифрования, в моём случае, широкое использование класса SecureQueryString практически не сказалось на эффективности кода.

Вы можете скачать пример веб-приложения и компонент SecureQueryString с исходным кодом. Если появятся вопросы – добро пожаловать на наш форум. Использование безопасных строк запросов – хорошее решение для передачи данных между страницами и приложениями. Однако, это всего лишь одно из возможных решений и вы всегда должны помнить о других существующих решениях – таких как зашифрованные cookies и управление переменными сессии.


{К содержанию}

Форумы .Net - вопросы оставшиеся без ответа

Свой грид
ADODB >> Excel
Почему неработает??
Помогите новичку в этом деле!!!!
Закрытие фрэйма
ASP.NET Design Patterns - где можно почитать?
SQL Server - Crystal Reports - ?
Какие компоненты лутше Infragistic или DevExpress
Кто тут использует J# ? какие впечатления?
treeView список из базы данных
.NET permissions

На этом шестой выпуск .Net Собеседника закончен.
До следующего номера.


Чужа Виталий Ф. aka hDrummer,
hdrummer@sql.ru - жду ваши предложения, вопросы и замечания.


Рассылки Subscribe.Ru
.Net Собеседник - Новости мира Net, C#, ASP.Net


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное