<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Гайдар Магдануров</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/gaidar/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/gaidar/feed.xml</link>
    <description>Платформа и инструменты разработки, новости компании Microsoft и мысли об ИТ</description>
    <lastBuildDate>Sat, 04 Apr 2015 06:44:13 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Опасности в автоматической привязке модели в ASP.NET MVC</title>
      <link>https://docs.microsoft.com/archive/blogs/gaidar/23</link>
      <pubDate>Thu, 12 Jan 2012 00:10:05 GMT</pubDate>
      <dc:creator><![CDATA[Gaidar Magdanurov]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/gaidar/2012/01/12/23/</guid>
      <description><![CDATA[В своем посте про безопасность сайтов в ASP.NET MVC я совершенно забыл про одну очень неприятную...]]></description>
      <content:encoded><![CDATA[<p>В своем посте про безопасность сайтов в ASP.NET MVC я совершенно забыл про одну очень неприятную атаку, применимую к действиям контроллеров, использующим автоматическую привязку модели и UpdateModel/TryUpdateModel.</p>
<p>Представьте себе ситуацию, что на сайте добавляются комментарии, которые обязательно должны проходить модерацию, поэтому у них есть свойство <em>IsApproved</em>, по умолчанию в базе данных заданное как <em>false</em>. Например, модель выглядит как:</p>
<pre class="prettyprint lang-cs">public class Comment {
    int CommentId {get; set;};
    // еще много разных полей …
    string Text {get; set;};
    string Author {get; set;};
    bool IsApproved {get; set;};
}
</pre>
<p>Представим себе, что при отправке формы пользователь заполняет поле textarea с идентификатором Text и input поле с идентификатором Author, а на стороне сервера действие, сохраняющее комментарий в базу данных выглядит как:</p>
<pre class="prettyprint lang-cs">[HttpPost]
public ActionResult SaveComment( Comment obj) {
    // тут всякий разный код
    UpdateModel( obj );
    // тут еще какой-то разный код
}
</pre>
<p>В этом случае нехороший пользователь может эмулировать POST обращение на сервер и передать пару значений <em>IsApproved = true</em>, чтобы автоматически показать сообщение без модерации. В этом сценарии, может быть, это не так страшно – комментарий можно удалить, однако похожий сценарий может быть применим к каким-то более важным бизнес-данным, поэтому такого допускать нельзя.</p>
<p>Есть три основных подхода, позволяющие избежать подобной проблемы.</p>
<p><strong>Минимум кода – привязывать только нужные поля.</strong></p>
<p>Для этого можно передавать параметры в метод UpdateModel():</p>
<pre class="prettyprint lang-cs">UpdateModel ( obj, <span class="str">"</span>Comment<span class="str">"</span>, new string { <span class="str">"</span>Text<span class="str">"</span>, <span class="str">"</span>Author<span class="str">"</span> };</pre>
<p>Еще один вариант, пометить аргумент действия атрибутом Bind:</p>
<pre class="prettyprint lang-cs">[HttpPost]
public ActionResult SaveComment( 
                 [Bind(Include = "Text, Author")] Comment obj) {
    // … тут всякий разный код
    UpdateModel( obj );
    // тут еще какой-то разный код
}
</pre>
<p>Атрибут Bind можно использовать и в варианте [Bind(Exclude = “”)], указывая список полей, привязку которых не следует осуществлять. Однако метод с указанием только нужных полей оказывается надежнее при дальнейших модификациях модели – свойства остаются защищены от изменений, несмотря на то, что добавляются новые свойства в модели.</p>
<p><strong>Чуть больше кода – использовать промежуточные модели.</strong></p>
<p>Такой подход подразумевает создание отдельных классов моделей для использования на стороне представлений, часто называемых ViewModel. Эти модели являются упрощенными вариантами полноценных моделей данных и предоставляют только свойства, которые необходимы обработки получаемых данных. Например, для комментариев такая модель может выглядеть так:</p>
<pre class="prettyprint lang-cs">public class CommentViewModel{
    string Text {get; set;};
    string Author {get; set;}
}
</pre>
<p>В этом случае при обновлении базы данных придется конструировать новые объекты Comment, присваивать значения полей объектов типа CommentViewModel объектам типа Comment и сохранять уже объекты Comment в базу данных.</p>
<p><strong>Совсем много кода – привязывать поля вручную</strong></p>
<p>Самый гибкий, но и самый кропотливый в реализации способ – отказаться от использования методов UpdateModel и TryUpdateModel и проводить валидацию всех полей и конструирование нужных объектов самостоятельно. Этот метод оправдан когда для передаваемых данных необходимо выполнять сложные проверки и конструировать не один объект, а набор объектов со сложной логикой связи между ними. Кроме того, этот метод любят те, кто боится доверять привязку данных MVC Framework.</p>]]></content:encoded>
    </item>
    <item>
      <title>Безопасность веб-сайтов ASP.NET MVC</title>
      <link>https://docs.microsoft.com/archive/blogs/gaidar/asp-net-mvc</link>
      <pubDate>Wed, 11 Jan 2012 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Gaidar Magdanurov]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/gaidar/2012/01/11/asp-net-mvc/</guid>
      <description><![CDATA[«Ломать – не строить», гласит народная мудрость. Чтобы создать полезное для пользователей...]]></description>
      <content:encoded><![CDATA[<p>«Ломать – не строить», гласит народная мудрость. Чтобы создать полезное для пользователей веб-приложение, приходится прикладывать много усилий, придумывать нужную функциональность и реализовывать ее. Чтобы сломать веб-приложение, существует набор стандартных методик, рассчитанных на то, что разработчик веб-приложения не подумал или поленился защитить свое веб-приложение от определенного типа атак.</p>
<p>Сторонники «хакерских игр» могут возмутиться, что взлом веб-сайта тоже сложная и кропотливая работа. Так-то оно, может быть, и так, однако по своей сути взлом в подавляющем большинстве случаев основан на стандартных подходах и оставленных разработчиком лазейках. В конечном итоге изобрести колесо сложнее, чем придумать, как проколоть его гвоздем, хотя последнее тоже может быть увлекательной задачей.</p>
<p>Таким образом, у нападающего на сайт взломщика есть набор практик и инструментов, позволяющих пробовать стандартные подходы для взлома веб-сайта, поэтому веб-разработчик, создающий веб-приложение, должен также иметь собственный список задач по обеспечению безопасности веб-приложения. Основные советы я привожу в этой небольшой статье. Позднее я напишу более подробно о нескольких самых распространенных атаках.</p>
<h3>Базовые советы по обеспечению безопасности веб-приложений</h3>
<p><strong>1. Валидация пользовательского ввода</strong></p>
<p>При получении любых данных от пользователя, обязательно должна осуществляться проверка на размер и формат данных, применение ограничений по допустимым значениям, предусмотренных бизнес логикой и проверка данных на безопасность. В случае, если с данными что-то не так, то существует два стандартных подхода – либо вернуть их пользователю с ошибкой, либо попытаться их «очистить». Второй путь часто выбирают для облегчения жизни пользователя, например при вводе даты или времени в неверном формате, однако этот путь опасен не только с точки зрения возможных ошибок в коде, «очищающем» данные, так и с точки зрения нарушения логики приложения.</p>
<p>Основная рекомендация – отклонять некорректные данные и предлагать пользователю ввести данные в правильном формате.</p>
<p>Сложности возникают в классической задаче: ввод HTML тегов для оформления публикуемых на сайте текстов. Если пытаться вырезать недопустимые теги, существует большая вероятность, что злоумышленник придумает способ, как обойти «вырезалку» теги. Если же отклонять введенный текст, то пользователь может быть очень расстроен тем, что не понимает, из-за чего его текст был отклонен и где в нем недопустимый тег. Здесь на помощь приходит следующий совет.</p>
<p>Для часто используемых проверок имеет смысл создать вспомогательный класс, содержащий методы для проверки вводимых данных, тогда код может выглядеть как-то так:</p>
<pre class="prettyprint lang-cs">public ActionResult ProcessData ( DataObject data )
{
    // Валидация
    if (! SomeValidationLogic.ValidateSomeData (data.DataField) )
        ModelState.AddModelError ("DataField", "DataField is invalid");
    // ... там дальше много кода
}
</pre>
<p>В свое время для MVC Framework 1.0 создавались различные библиотеки валидации вроде <a href="https://mvcvalidatortoolkit.codeplex.com/">Validator Toolkit for ASP.NET MVC</a> или <a href="https://xval.codeplex.com/">xVal </a>– можно посмотреть на их устройство для общего развития. Из неплохих современных фреймворков для валидации данных существует <a href="https://fluentvalidation.codeplex.com/">FluentValidation</a>.</p>
<p>В случае если используются механизмы валидации данных на клиенте, они должны быть продублированы на сервере. Злоумышленнику ничего не стоит модифицировать клиентские страницы либо эмулировать передачу данных со страниц на сервер. Относитесь к коду клиентской валидации как к возможности сэкономить время пользователя при подготовке данных в нужном формате, а не как к дополнительной степени защиты прилжения.</p>
<p><strong>2. Форматирование вывода пользовательских данных</strong></p>
<p>При публикации данных, так или иначе пришедших из внешних источников, на страницах вашего веб-приложения, обязательно нужно исключать возможность атак, подразумевающих внедрение вредоносного кода на страницы. Да и просто «кривая» разметка может испортить внешний вид страниц и отпугнуть пользователей вашего сайта, поэтому корректное форматирование текстов всегда является хорошим выходом.</p>
<p>Для того чтобы избежать проблем с выводом разметки, там где вы ее не ожидаете, используйте метод Html.Encode(). Если же нужно допустить вывод некоторых тегов, то вы можете воспользоваться методами AntiXss.HtmlEncode() и AntiXss.HtmlAttributeEncode(), реализованном в библиотеке AniXSS, входящей в проект <a href="https://wpl.codeplex.com/">Microsoft Web Protection Library</a>. В библиотеке AniXSS также доступен метод AntiXss.GetSafeHtmlFragment(), позволяющий выводить «безопасные» теги, вырезая «опасные» и корректно форматируя разметку.</p>
<p>Библиотеку AntiXss можно зарегистрировать в для использования по умолчанию для кодирования HTML разметки, об этом написано пошаговое руководство в <a href="https://haacked.com/archive/2010/04/06/using-antixss-as-the-default-encoder-for-asp-net.aspx">блоге у Фила Хаака</a>.</p>
<p><strong>3. Корректное использование метода POST и защищенного протокола HTTPS</strong></p>
<p>Данные, которые приложение ожидает получить методом POST, должны приходить методом POST, для этого достаточно использовать атрибут HttpPost на действиях контроллеров, ожидающих данные методом POST – таким образом можно защититься от атак, заставляющих добропорядочных пользователей переходить по ссылкам, передающим данные методом GET.</p>
<p>Хорошая практика использовать метод POST при выполнении важных действий, таких как удаление или изменение данных, поскольку злоумышленник легко может подставить пользователю ссылку вроде /somecontroller/delete/1 с другого сайта, заставив авторизованного ранее на вашем сайте пользователя, выполнить не всегда полезное действие.</p>
<p>Для данных, имеющих большую ценность, например, таких как персональные данные и данные о кредитных картах, стоит использовать безопасный протокол передачи данных HTTPS. При этом, <a href="https://radiag.ru/post/14660328307/http-and-https-forms">сами формы, запрашивающие данные, должны быть отправлены по HTTPS</a> пользователю, чтобы не давать злоумышленнику возможностей украсть или модифицировать данные перед отправкой на ваш сервер. Здесь на помощь приходит атрибут RequireHttps на соответствующих действиях контроллеров, требующий передачи данных по протоколу HTTPS.</p>
<p>В случаях, когда пользователя необходимо перенаправить на ту же форму по протоколу HTTPS, можно реализовать собственный фильтр, который будет автоматически осуществлять перенаправление для помеченных им действий.</p>
<pre class="prettyprint lang-cs">public class UseHttps : ActionFilterAttribute 
{ 
  public override void OnActionExecuting(
                             ActionExecutingContext filterContext) { 

      if ( !filterContext.HttpContext.Request.IsSecureConnection) { 
          filterContext.Result =  
            new RedirectResult(
              filterContext.HttpContext.Request.Url.ToString().Replace
                                                  ("http:", "https:"));

               filterContext.Result.ExecuteResult(filterContext); 
      } 
      base.OnActionExecuting(filterContext); 
   } 
}
</pre>
<p><strong>4. Корректная обработка ошибок и исключений</strong></p>
<p>Ошибки и исключения в веб-приложениях случаются. В случае обращения по несуществующим адресам, либо при вызове действий контроллеров с идентификаторами несуществующих записей или некорректными идентификаторами данных сообщения об ошибках должны быть информативны для пользователя, однако не предоставлять информации о внутреннем устройстве веб-приложения. Аналогично и в случае возникновения исключений в обрабатывающем запросе коде или коде нижележащих слоев приложения. Достигается это с помощью <a href="https://msdn.microsoft.com/ru-ru/library/h0hfz6fc.aspx">включения Custom Errors в web.config</a>.</p>
<p>Отдельно стоит обратить внимание на поведение веб-приложения при попытке неудачной загрузки файла: проверить корректность сообщений об ошибках при недостатке свободного места во временной директории на сервере, а также при загрузке чрезмерно большого файла (таймаут, ограничение на размер запроса на уровне IIS). Злоумышленник не должен меть возможность получать информацию о структуре файловой системы сервера.</p>
<p><strong>5. Контроль прав доступа пользователей</strong></p>
<p>При осуществлении пользователем действий, требующих определенных привилегий, необходимо проверять наличие у пользователя этих привилегий (роли, прав доступа к данным) при каждом обращении. Недостаточно проверять права доступа только при отображении основного действия со списком команд и в дальнейшем проверять лишь наличие авторизации пользователя. Совет достаточно простой, однако о нем легко забыть, пользуясь атрибутом [Authorize]. Следует проверить, что на действиях, требующих принадлежности к определенным ролям, указаны эти роли, например [Authorize(Roles = “Admin, Moderator”)].</p>
<p>В случаях, когда необходима более сложная логика авторизации, например на основании свойств объекта данных, может быть удобно создать собственный фильтр для авторизации. Например, если в базе данных для каждого типа данных прописан список пользователей имеющих доступ на редактирование данных, то в действии Edit может быть использован собственный фильтр AuthorizeItem, которые проверяет наличие у пользователя прав на редактирование данного конкретного объекта.</p>
<pre class="prettyprint lang-cs">public class AuthorizeItemAttribute: FilterAttribute, IAuthorizationFilter 
{ 
 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
        //...
        // здесь идет код логики авторизации
        // доступа к данным на основании свойств
        // данных
        // ...
}
</pre>
<p>Частая ошибка, которую делают разработчики в таких случаях – скрывают ссылки на редактирование объектов, не защищая сам метод, позволяющий редактировать объект.</p>
<p>Другой вариант решения – проверять авторизацию пользователя на уровне слоя доступа к данным, либо, для большей надежности, объединить оба этих подхода.</p>
<p><strong>Почему эти советы особенно важны в контексте использования ASP.NET MVC?</strong></p>
<p>В технологии ASP.NET WebForms часть из описанных выше проблем безопасности была решена за разработчика автоматически, например, WebForms брали на себя кодирование выводимого на экран текста (если не использовался Response.Write(), конечно), валидацию ViewState, валидацию параметров запросов и защиту от инъекций через валидацию механизма клиентских событий. Разумеется, для полной защиты от разных типов атак, разработчику требовалось соблюдать базовые принципы безопасности, однако во многом платформа WebForms брала заботы о безопасности на себя.</p>
<p>Разумеется, дополнительная защита, как и многие другие приятные полезности в WebForms, снижала гибкость решения и повышала нагрузку на систему, собственно, почему некоторые разработчики и выбирают ASP.NET MVC в погоне за большей гибкостью и большими возможностями расширения веб-приложений. В связи с этим, отказываясь от дополнительных возможностей в угоду гибкости, нужно быть готовым приложить больше усилий к тому, чтобы обезопасить веб-приложение.</p>
<p><strong>Зачем ломают веб-сайты?</strong></p>
<p>Часто веб-разработчики пренебрегают угрозой, считая свой сайт защищенным методом «неуловимого Джо, который совсем никому не нужен». Однако, современные хакеры в большинстве своем не веселые добряки из девяностых годов, ломающие сайты только ради взлома или дефейса (публикации ругательных надписей и забавных картинок на главных страницах сайтов). Современным хакером движет жажда наживы и его цели вовсе не так прозрачны, как «просто уронить сайт». Взломщики охотятся за базами персональной пользовательской информации, списками рассылок, возможностями осуществлять спам-рассылки от лица вашего сайта, данными учетных записей сервисов в социальных сетях, если они как-то представлены на вашем сайте. Помимо этого, цель взломщиков может быть еще более хитрой – получение информации о друзьях пользователей и их предпочтениях в музыке, кино, книгах, с целью дальнейших рассылок с возможностью «втираться» в доверие пользователей, представляясь их друзьями, что-то знающими об их вкусах.</p>
<p>Цели злоумышленников могут быть разные, поэтому главный принцип защиты – не дать им получить ничего, что сайт не позволяет получить анонимным пользователям. Любая информация, кажущаяся не ценной для вас, может быть ценной для ваших пользователей и может быть эксплуатирована злоумышленниками.</p>
<p><strong>Как жить дальше?</strong></p>
<p>Помнить об основных принципах безопасности веб-приложений и жить хорошо. В ближайшие дни я опубликую еще несколько небольших статей про самые неприятные атаки на веб-приложения и борьбу с ними.</p>
<p><em>Пожелания и комментарии по статье с радостью принимаются. Безопасность – тема сложная и всеобъемлющая, поэтому буду рад, если вы поделитесь советами в комментариях к этой статье.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Конференция TechEd Russia 2011 – торопитесь купить билет.</title>
      <link>https://docs.microsoft.com/archive/blogs/gaidar/teched-russia-2011-1</link>
      <pubDate>Tue, 20 Sep 2011 07:20:09 GMT</pubDate>
      <dc:creator><![CDATA[Gaidar Magdanurov]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/gaidar/2011/09/20/teched-russia-2011-1/</guid>
      <description><![CDATA[В Москве 9-10 ноября 2011 года пройдет Tech∙Ed Russia – конференция стала приемником конференции...]]></description>
      <content:encoded><![CDATA[<p>В Москве 9-10 ноября 2011 года пройдет <a href="https://www.msteched.ru/">Tech∙Ed Russia</a> – конференция стала приемником конференции <a href="https://blogs.msdn.com/b/msplatforma/archive/2011/07/07/quot-quot.aspx">Платформа</a>. Можно сказать, что Платформа стала больше и насыщеннее содержательно. В этом году ожидается до 3000 участников и более 160 докладов.</p>  <p>Вспоминая прошлые годы, когда я активно участвовал в организации конференции “Платформа”, ближе ко времени конференции постоянно приходили люди, которым не хватило билетов, и слезно просили помочь купить билетик-другой. К сожалению, исключений мы не делали и делать не будем, на конференцию попадут только те, кто купит билеты пока они есть. Просто хочу напомнить, что лучше купить билет сейчас, чем потом кусать локти от обиды, получая отказы от организаторов.</p>  <p>Зарегистрироваться на конференцию Tech<b>∙</b>Ed Russia 2011 можно на официальном сайте по <a href="https://event.msteched.ru/registration/default.aspx">следующей ссылке</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>CMS для WebMatrix.</title>
      <link>https://docs.microsoft.com/archive/blogs/gaidar/cms-webmatrix</link>
      <pubDate>Thu, 01 Sep 2011 03:26:08 GMT</pubDate>
      <dc:creator><![CDATA[Gaidar Magdanurov]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/gaidar/2011/09/01/cms-webmatrix/</guid>
      <description><![CDATA[Наконец-то появилась полноценная CMS написанная специально для проекта WebMatrix. Продукт r@zorC.net...]]></description>
      <content:encoded><![CDATA[<p>Наконец-то появилась полноценная CMS написанная специально для проекта <a href="https://www.microsoft.com/web/">WebMatrix</a>. Продукт <a href="https://razorc.net">r@zorC.net</a> позволяет основные возможности для быстрого создания несложных сайтов.</p>
<p>По CMS есть <a href="https://razorc.net/video-tutorials">набор видео</a> (на английском), есть возможность заказать <a href="https://razorc.net/premium-templates">платные красивые шаблоны</a> (способ монетизации проекта).</p>
<p>Быстро установить проект и начать создавать сайты можно через <a href="https://www.microsoft.com/web/">WebMatrix </a>или даже без WebMatrix через <a href="https://www.microsoft.com/web/gallery/razorcnet.aspx">Web Gallery</a>.</p>
<p>[<a href="https://radiag.ru/post/9662271233/cms-for-webmatrix">Оригинал сообщения</a>]</p>]]></content:encoded>
    </item>
    <item>
      <title>Windows Phone "Mango" официально вышел в версии  RTM</title>
      <link>https://docs.microsoft.com/archive/blogs/gaidar/windows-phone-mango-rtm</link>
      <pubDate>Tue, 26 Jul 2011 14:12:35 GMT</pubDate>
      <dc:creator><![CDATA[Gaidar Magdanurov]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/gaidar/2011/07/26/windows-phone-mango-rtm/</guid>
      <description><![CDATA[Что еще тут можно сказать? Подробности в блоге команды Windows Phone.]]></description>
      <content:encoded><![CDATA[<p>Что еще тут можно сказать? Подробности <a href="https://windowsteamblog.com/windows_phone/b/windowsphone/archive/2011/07/26/windows-phone-mango-released-to-manufacturing.aspx">в блоге команды Windows Phone</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Ссылка на действие MVC-контроллера в виде изображения или кнопки</title>
      <link>https://docs.microsoft.com/archive/blogs/gaidar/mvc-1</link>
      <pubDate>Wed, 08 Jun 2011 01:05:04 GMT</pubDate>
      <dc:creator><![CDATA[Gaidar Magdanurov]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/gaidar/2011/06/08/mvc-1/</guid>
      <description><![CDATA[Вспомогательный метод ActionLink создает обычную ссылку. Например,...]]></description>
      <content:encoded><![CDATA[<p>Вспомогательный метод ActionLink создает обычную ссылку. Например, @Html.ActionLink(&quot;Create&quot;, &quot;Create&quot;, new { ParentId = id }), создает HTML фрагмент вида &lt;a href=&quot;/Home/Create?ParentId=1&quot;&gt;Create&lt;/a&gt;.</p>  <p>Если есть желание использовать вместо ссылок <strong>изображения</strong>, то подойдет вот такой фрагмент:</p>  <p>&lt;a href=&quot;@Url.Action(&quot;Create&quot;, &quot;Products&quot;, new { ParentId = 1 })&quot; title=&quot;Create&quot;&gt;   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;img src=&quot;../../Content/Images/Create.png&quot; /&gt;    <br />&lt;/a&gt;</p>  <p>В результате HTML будет таким:</p>  <p>&lt;a href=&quot;/Products/Create?ParentId=1&quot; title=&quot;Create&quot;&gt;   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;img src=&quot;../../Content/Images/Create.png&quot; /&gt;    <br />&lt;/a&gt;</p>  <p>Если есть желание использовать вместо ссылок <strong>кнопки</strong>, то подойдет вот такой фрагмент:</p>  <p>&lt;input type=&quot;button&quot; title=&quot;Create&quot; value=&quot;Create&quot; onclick=&quot;location.href='@Url.Action(&quot;Create&quot;, &quot;Products&quot;, new { ParentId = 1 })'&quot; /&gt;</p>  <p>В результате HTML будет таким:</p>  <p>&lt;input type=&quot;button&quot; title=&quot;Create&quot; value=&quot;Create&quot; onclick=&quot;location.href='/Products/Create?ParentId=1'&quot; /&gt;</p>  <p><em></em></p>  <p><em>P.S. По тегу FAQ буду размещать краткие статьи, которые являются ответами на часто задаваемые вопросы.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Новая система управления сайтами .NET Forge CMS 6.0</title>
      <link>https://docs.microsoft.com/archive/blogs/gaidar/83</link>
      <pubDate>Fri, 03 Jun 2011 04:19:18 GMT</pubDate>
      <dc:creator><![CDATA[Gaidar Magdanurov]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/gaidar/2011/06/03/83/</guid>
      <description><![CDATA[.NET&nbsp;Forge&nbsp;CMS&nbsp;&ndash; новая система управления сайтами для веб-разработчиков,...]]></description>
      <content:encoded><![CDATA[<p><span><a href="https://www.bitrix.net/ru/"><span>.<span lang="EN-US">NET</span><span lang="EN-US">&nbsp;</span><span lang="EN-US">Forge</span><span lang="EN-US">&nbsp;</span><span lang="EN-US">CMS</span></span></a>&nbsp;&ndash; новая система управления сайтами для веб-разработчиков, которые знают и любят технологии .</span><span lang="EN-US">NET</span><span>. Новый продукт включает бесплатную редакцию для сайтов сообществ и коммерческую редакцию с интернет-магазином, интегрированным с &laquo;1С&raquo;. .</span><span lang="EN-US">NET</span><span lang="EN-US">&nbsp;</span><span lang="EN-US">Forge</span><span lang="EN-US">&nbsp;</span><span lang="EN-US">CMS</span><span>&nbsp;- профессиональная платформа для .</span><span lang="EN-US">NET</span><span>-разработчиков с проработанными&nbsp;</span><span lang="EN-US">ORM</span><span>-инструментами,&nbsp;</span><span lang="EN-US">MVC</span><span>-архитектурой, производительная и проверенная на больших проектах.</span></p>
<p><span>Доступны бесплатная&nbsp;</span><span lang="EN-US">Community</span><span>-редакция и пробная версия коммерческой редакции, которые можно скачать с сайта&nbsp;<a href="https://www.bitrix.net/ru/download/">https://www.bitrix.net/ru/download/</a></span></p>
<p><span>Качайте и делитесь вашими отзывами, пожалуйста.</span></p>]]></content:encoded>
    </item>
    <item>
      <title>В онлайн-подразделение Microsoft требуется опытный менеджер по продажам интернет-рекламы</title>
      <link>https://docs.microsoft.com/archive/blogs/gaidar/microsoft-109</link>
      <pubDate>Tue, 24 May 2011 05:54:46 GMT</pubDate>
      <dc:creator><![CDATA[Gaidar Magdanurov]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/gaidar/2011/05/24/microsoft-109/</guid>
      <description><![CDATA[Зарплата от 120 тысяч руб (хотя с интересным кандидатом все обсуждаемо), прогрессивный бонус и...]]></description>
      <content:encoded><![CDATA[<p>Зарплата от 120 тысяч руб (хотя с интересным кандидатом все обсуждаемо), прогрессивный бонус и обширный соцпакет.</p>  <p>Требования: опыт работы на рынке интернет рекламы от 3 лет, позитивно-агрессивный настрой, умение работать в команде, стрессоустойчивость, чувство юмора и здоровый карьеризм.</p>  <p>Вознаграждение за успешную рекомандацию: коробки Windows 7 ultimate, Office 2011 для Mac и Call of Duty: Black OPS для Xbox</p>  <p>Присылайте резюме на <a href="mailto:gaidarma@microsoft.com">gaidarma@microsoft.com</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Обновленные результаты конкурса WebsiteSpark</title>
      <link>https://docs.microsoft.com/archive/blogs/gaidar/103</link>
      <pubDate>Tue, 17 May 2011 23:13:00 GMT</pubDate>
      <dc:creator><![CDATA[Gaidar Magdanurov]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/gaidar/2011/05/17/103/</guid>
      <description><![CDATA[Подведены итоги конкурса WebsiteSpark, проходившего 10 марта &ndash; 20 апреля. К сожалению, в...]]></description>
      <content:encoded><![CDATA[<p>Подведены <a href="https://webprofessionals.ru/news/56">итоги конкурса WebsiteSpark</a>, проходившего 10 марта &ndash; 20 апреля. К сожалению, в момент подведения итогов выяснились проблемы с системой генерации отчетов, поэтому мы вручную получили все данные по всем добавленным российскими участниками программы веб-сайтам и анонсируем обновленный список победителей. При этом ранее анонсированные победители получают призы!</p>
<ul>
<li>1 место &ndash; XBOX 360 + Kinect &ndash; <b>ЗАО Ингениос</b> и <strong>56web</strong></li>
<li>2 место &ndash; XBOBX 360 &ndash; <b>Авдеев Александр</b> и <strong>Wilmark Design</strong></li>
<li>3 место &ndash; поездка на конференцию <a href="https://www.msDevCon.ru">www.msDevCon.ru</a> &ndash; <b>ВебИнформСервис</b>&nbsp; и <strong>ООО "Кортек"</strong></li>
</ul>
<p>Поощрительный приз &ndash; книга Виктора Гичуна &laquo;Как создать интернет-компанию и заработать миллион&raquo; получат:</p>
<ul>
<li><strong>Mindfor, Ltd.</strong></li>
<li><strong>CrewBeat</strong></li>
<li><strong>GreatDevelop</strong></li>
<li><strong>Krona</strong></li>
<li><strong>SoftAIN</strong></li>
<li><strong>yuri</strong></li>
<li><strong>Декларативные технологии</strong></li>
<li><strong>Игнатьев Романэ</strong></li>
<li><strong>ИП Основина ТЮ</strong></li>
<li><strong>Лагута Юрий</strong></li>
<li><strong>Лев Бондаренко</strong></li>
<li><strong>Научно образовательный центр "Темп"</strong></li>
<li><strong>Никита</strong></li>
<li><strong>Общество с ограниченной ответственностью "БУКМАК"</strong></li>
<li><strong>ООО "БИЗНЕС-ВЕБ"</strong></li>
<li><strong>ООО "Воротько Корпорейшн"</strong></li>
<li><strong>ООО "Компьютер Агент"</strong></li>
<li><strong>ООО "КреатАйТи"</strong></li>
<li><strong>ООО "ПРОЕКТ 24"</strong></li>
<li><strong>ООО "РэйДизайн"</strong></li>
<li><strong>ООО "Тайдекс"</strong></li>
<li><strong>ООО "Хорошие решения"</strong></li>
<li><strong>ООО АДО-Инжиниринг</strong></li>
<li><strong>ООО НТЦ "ПартнерЪ"</strong></li>
<li><strong>Павел</strong></li>
<li><strong>Романов Вячеслав Александрович</strong></li>
<li><strong>Студия "Интеллис"</strong></li>
<li><strong>Терентьев Алексанр</strong></li>
<li><strong>Юлий</strong></li>
</ul>
<p>Победителям разосланы письма с просьбой сообщить адреса доставки призов.</p>]]></content:encoded>
    </item>
    <item>
      <title>Компания 1С-Битрикс ищет евангелиста для нового .NET продукта</title>
      <link>https://docs.microsoft.com/archive/blogs/gaidar/1-1080</link>
      <pubDate>Tue, 17 May 2011 06:36:51 GMT</pubDate>
      <dc:creator><![CDATA[Gaidar Magdanurov]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/gaidar/2011/05/17/1-1080/</guid>
      <description><![CDATA[Компания 1С-Битрикс готовит к выпуску продукт “Bitrix .NET Forge CMS”, которая будет доступна в...]]></description>
      <content:encoded><![CDATA[<p>Компания 1С-Битрикс готовит к выпуску продукт “Bitrix .NET Forge CMS”, которая будет доступна в бесплатной Community и в платной Business редакциях. Для продвижения этого продукта, компания ищет евангелиста.</p>  <p>Обязанности:</p>  <ul>   <li>продвижение продукта .NET Forge в онлайн-сообществах</li>    <li>поддержка сообщества на русском и английском сайтах</li>    <li>активность в блогах, форумах, соцсетях, твиттере + задействовать другие способы коммуникаций в онлайне</li>    <li>подготовка контента для публикации в онлайн-СМИ</li>    <li>организация PR-акций для продвижения продукта</li>    <li>публичные выступления на конференциях</li> </ul>  <p>Требования к кандидату:</p>  <ul>   <li>профессиональное знание .NET на уровне разработчика</li>    <li>кругозор и образование в сфере ИТ</li>    <li>знание веб-технологий</li>    <li>опыт работы с интернет-порталами</li>    <li>опыт работы с контентом в онлайне (блоги, статьи, новости и пр.)</li>    <li>активность и инициативность</li>    <li>опыт публичных выступлений на конференциях</li>    <li>отличный английский язык (технический, письменный)</li>    <li>высшее образование</li> </ul>  <p>З/п по результатам собеседования (з/п хорошая :)).</p>  <p>Кандидатам обращаться на email: <a href="mailto:job@bitrix.ru">job@bitrix.ru</a></p>]]></content:encoded>
    </item>
  </channel>
</rss>