Почитав некоторые материалы в сети ( например: http://www.hanselman.com/blog/HackedAndIDidntLikeItURLScanIsStepZero.aspx
http://haacked.com/archive/2008/08/22/dealing-with-denial-of-service-attacks.aspx), я пришел к выводу, что к моему написанному приложению ASP.NET нужно срочно приделать URLscan.
Итак, качаем отсюда http://www.iis.net/download/urlscan . Устанавливаем на сервере. В каталоге c:\windows\system32\inetsrv\ появляется новая папка urlscan.
В ней два файла urlscan.dll и urlscan.ini. Эти файлы отвечают за глобальную фильтрацию всех сайтов, расположенных на сервере. Но можно настроить и отдельно для каждого сайта. Для этого нужно скопировать эти два файла в корневой каталог. Например, у меня корневой каталог моей программы (сайта) c:\Inetpub\foo. Так как у меня права NTFS на корневой каталог только "чтение", на файл urlscan.dll пришлось дать права "чтение и выполнение" пользователю IIS_WPG. Теперь идем в "Диспетчер служб IIS" . Правой клавишей мыши достаем свойства сайта и в закладке "фильтр ISAPI" добавляем urlscan из корневой директории.
По умолчанию urlscan.ini уже содержит настройки фильтрации. Но я хотел все-таки несколько увеличить безопасность. Для начала нужно настроить лог. В urlscan.ini существует параметр для указания пути к лог файлу "LoggingDirectory". Я указал c:\InetPub\foo\logs. После этого не забудьте дать NTFS права на "запись" IIS_WPG и IIS права на "запись" на этот каталог.
Потом прошелся по настройкам в urlscan.ini. Во первых, я включил (то есть установил в единицу) параметр UseAllowExtensions=1. Это значит будет отрабатывать секция [AllowExtensions] , если параметр 0 - то отрабатывет [DenyExtensions]. У меня она выглядит так
[AllowExtensions]
.
.css
Это список разрешенных раcширений. У меня получился вот такой маленький.
"." точка нужна для файлов без раcширений. Без этой точки у меня приложение не запускалось.
Затем я переключился на параметры в секции [RequestLimits]
MaxAllowedContentLength=30000000
MaxUrl=260
MaxQueryString=2048
Это явно излишне для моего сайта. Немного теории . Как вы знаете, протокол HTTP использует два метода запроса к серверу GET и POST. Они отличается тем,что при методе GET запрос как бы является частью URI. Например http://www.google.ru/search?source=ig&hl=ru&rlz=1R2GFRE_ruRU333&q=urlscan&aq=f&aqi=g10&aql=&oq=&gs_rfai=
и тело запроса пусто . А при методе POST данные передаются в теле запроса. Так вот параметр "MaxAllowedContentLength" как раз относится к POST, а "MaxQueryString" - GET. MaxUrl - это максимальное количество символов в строке URL без QUERY_STRING. Опытным путем я вычислил следующие значения
MaxAllowedContentLength=30
MaxUrl=30
MaxQueryString=60
среда, 22 сентября 2010 г.
пятница, 18 июня 2010 г.
Проблемы локализации меню DotNetNuke 5.x.x
Сразу скажу эту проблему я так и не решил . Просто не сложилась мозаика из DotNetNuke 5 , меню, и шаблона(skin). Теперь все по порядку.
Так как у меня уже есть один сайт на DotNetNuke 4.5, я смело принялся создавать страницы с названиями на русском языке. Но стоп, они не открываются . Они даже потом не редактируются. Их можно только удалить. Я не придал этому большого значения, отложил это на потом и принялся искать по интернету бесплатные скины и модули. Мне нужен был модуль фото галерея . Я нашел даже два . Вот ссылки:
Photo Gallery - http://oliverhine.com/DotNetNuke/Modules/PhotoGallery.aspx
WnsLightbox Gallery -http://wnslightbox.codeplex.com/
Подобрал себе скин вот отсюда:
http://www.dnnskins.com/
Перехожу к руссификации меню.
Итак, 1 вариант, который я испытал - DSlocalizator http://dnn.tiendaboliviana.com/
На сайте выложена версия 03.00.04 бета. Сколько я не пытался ничего не получилось . А на DotnetNuke 4 DSLocalizator работает на ура.
2 вариант - EALO http://ealo.codeplex.com/releases/view/33940
Качаем EALO CoreAPI и EALO Tab localization. Почитайте Readme на сайте, потому что в дистрибутивах его нет. В принципе все понятно . После установки , просто добавьте модуль EAOL tab на какую нибудь страницу и укажите русский вариант всех своих страниц. Я смог руссифицировать стандарное меню , но вот меню моего скина нет. Нет в моем скине dnn:nav ..., а есть dnn:menu.. и, как я понял из форума, EALO мне не поможет http://www.dotnetnuke.com/Community/Forums/tabid/795/forumid/77/threadid/350801/scope/posts/Default.aspx
3 вариант - DNN menu http://www.dnngarden.com/ . Для руссификации должен быть установлен EALO. Попытка была для меня тоже неудачной. Руссифицировать получилось, но модуль работал нестабильно, в какой-то момент, почему-то слетал style тага td, в котором был пункт меню, и он становился черным. Возможно все мои проблемы были из-за выбранного мною скина.
В итоге, я установил DotNetnuke 4.9.5 и DSLocalizator. Но, к сожалению, модули фото галерей были только под пятерку. Пришлось искать . Фришных нет вообще.
Вот удалось отсюда скачать
http://www.labellarte.it/DotNetNuke/DnnThickGallery12/tabid/438/Default.aspx
Так как у меня уже есть один сайт на DotNetNuke 4.5, я смело принялся создавать страницы с названиями на русском языке. Но стоп, они не открываются . Они даже потом не редактируются. Их можно только удалить. Я не придал этому большого значения, отложил это на потом и принялся искать по интернету бесплатные скины и модули. Мне нужен был модуль фото галерея . Я нашел даже два . Вот ссылки:
Photo Gallery - http://oliverhine.com/DotNetNuke/Modules/PhotoGallery.aspx
WnsLightbox Gallery -http://wnslightbox.codeplex.com/
Подобрал себе скин вот отсюда:
http://www.dnnskins.com/
Перехожу к руссификации меню.
Итак, 1 вариант, который я испытал - DSlocalizator http://dnn.tiendaboliviana.com/
На сайте выложена версия 03.00.04 бета. Сколько я не пытался ничего не получилось . А на DotnetNuke 4 DSLocalizator работает на ура.
2 вариант - EALO http://ealo.codeplex.com/releases/view/33940
Качаем EALO CoreAPI и EALO Tab localization. Почитайте Readme на сайте, потому что в дистрибутивах его нет. В принципе все понятно . После установки , просто добавьте модуль EAOL tab на какую нибудь страницу и укажите русский вариант всех своих страниц. Я смог руссифицировать стандарное меню , но вот меню моего скина нет. Нет в моем скине dnn:nav ..., а есть dnn:menu.. и, как я понял из форума, EALO мне не поможет http://www.dotnetnuke.com/Community/Forums/tabid/795/forumid/77/threadid/350801/scope/posts/Default.aspx
3 вариант - DNN menu http://www.dnngarden.com/ . Для руссификации должен быть установлен EALO. Попытка была для меня тоже неудачной. Руссифицировать получилось, но модуль работал нестабильно, в какой-то момент, почему-то слетал style тага td,
В итоге, я установил DotNetnuke 4.9.5 и DSLocalizator. Но, к сожалению, модули фото галерей были только под пятерку. Пришлось искать . Фришных нет вообще.
Вот удалось отсюда скачать
http://www.labellarte.it/DotNetNuke/DnnThickGallery12/tabid/438/Default.aspx
Установка DotNetNuke 5.4.1
У меня уже есть опыт разворачивания сайта DotNetnuke только ранней четверки. Теперь решил взяться за пятерку. Вот некоторые нюансы установки.У вас уже должен быть установлен SQL Express, IIS и Net Framework как минимум 2.
1. Заходим по ссылке качаем дистрибутив
http://www.dotnetnuke.com/tabid/125/default.aspx
2. Полученный архив распаковываем в c:\DotNetNuke
3. Находим файл readme.txt в c:\DotNetNuke\documentation и
выполняем требования описанные в этом файле.
На каталог c:\DotNetNuke даем полные права ASP_NET юзеру, если конечно у вас XP.
Создаем базу данных DotNetNuke в SQLExpress и пользователя, например dnnuser, с правами "db_owner".
Редактируем connectionstring в web.config.
Заходим в IIS создаем виртуальный каталог DotNetNuke, указывающий на c:\DotNetNuke. Файл default.aspx должен быть документом по умолчанию.
4. Запускаем IE . Вводим в строке localhost/dotnetnuke.
Тут же у меня вылетела ошибка. Оказывается, если IIS был установлен после Net Framework, необходимо выполнить c:\Windows\Microsoft.Net\Framework\v2.0.50727\aspnet_regiis.exe
5. Дальше проходим программа установки запрашивает информацию. Коротко несколько нюансов.
При выборе установки по умолчанию устанавливается только один модуль "Text/HTML".
Выполнение скриптов может завершиться с ошибкой. Хотя это и не указано в Readme.txt, но необходимо дать права на запись на каталог c:\windows\temp учетной записи ASP_NET.
После установки сразу же качаем устнавливаем language pack
http://www.dotnetnuke.com/Development/LanguagePacks/tabid/933/Default.aspx
Кстати, он в пятерке устанавливается как обычный модуль.
1. Заходим по ссылке качаем дистрибутив
http://www.dotnetnuke.com/tabid/125/default.aspx
2. Полученный архив распаковываем в c:\DotNetNuke
3. Находим файл readme.txt в c:\DotNetNuke\documentation и
выполняем требования описанные в этом файле.
На каталог c:\DotNetNuke даем полные права ASP_NET юзеру, если конечно у вас XP.
Создаем базу данных DotNetNuke в SQLExpress и пользователя, например dnnuser, с правами "db_owner".
Редактируем connectionstring в web.config
Заходим в IIS создаем виртуальный каталог DotNetNuke, указывающий на c:\DotNetNuke. Файл default.aspx должен быть документом по умолчанию.
4. Запускаем IE . Вводим в строке localhost/dotnetnuke.
Тут же у меня вылетела ошибка. Оказывается, если IIS был установлен после Net Framework, необходимо выполнить c:\Windows\Microsoft.Net\Framework\v2.0.50727\aspnet_regiis.exe
5. Дальше проходим программа установки запрашивает информацию. Коротко несколько нюансов.
При выборе установки по умолчанию устанавливается только один модуль "Text/HTML".
Выполнение скриптов может завершиться с ошибкой. Хотя это и не указано в Readme.txt, но необходимо дать права на запись на каталог c:\windows\temp учетной записи ASP_NET.
После установки сразу же качаем устнавливаем language pack
http://www.dotnetnuke.com/Development/LanguagePacks/tabid/933/Default.aspx
Кстати, он в пятерке устанавливается как обычный модуль.
понедельник, 24 мая 2010 г.
WebException Сервер нарушил протокол. Section=ResponseHeader Detail=Недопустимое имя заголовка
В моем проекте MVC мне понадобилось подключиться к принтерам через WEB интерфейс. Я хотел программно считать пробег.
Получилось вот что:
У принтера HP4350 без проблем считалась страница, а вот у HP 4300 никак.
Ошибка была следующая :
"Сервер нарушил протокол. Section=ResponseHeader Detail=Недопустимое имя заголовка"
Решение удалось найти. Необходимо в файле web.config внести следующие изменения:
<configuration>
<system.net>
<settings>
<httpwebrequest useunsafeheaderparsing="true">
<settings>
<system.net>
<configuration>
С принтером 4515 тоже не очень гладко получилось , так как WEB интерфейс был доступен по протоколу https. Возникало следующее исключение:
"Базовое соединение закрыто Не удалось установить доверительные отношения для защищенного канала SSL TLS". Вот по этой ссылке сделал.
http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/c98ea134-c582-4c2a-8c42-d7e31f7fe389
Итак определяем функцию, котрая возвращает всегда "True"
Получилось вот что:
Dim wc As New System.Net.WebClient
Dim Stream As System.IO.Stream
Try
Stream = wc.OpenRead("http://" & Specific.IP_add _
"/hp/device/this.LCDispatcher?dispatch=html&cat=0&pos=1")
Using sr As New System.IO.StreamReader(Stream)
str = sr.ReadToEnd()
Stream.Close()
End Using
Return CType(CountStr, Integer)
Catch ex As Exception
Dim errorstring = ex.Message
End TryУ принтера HP4350 без проблем считалась страница, а вот у HP 4300 никак.
Ошибка была следующая :
"Сервер нарушил протокол. Section=ResponseHeader Detail=Недопустимое имя заголовка"
Решение удалось найти. Необходимо в файле web.config внести следующие изменения:
<configuration>
<system.net>
<settings>
<httpwebrequest useunsafeheaderparsing="true">
<settings>
<system.net>
<configuration>
С принтером 4515 тоже не очень гладко получилось , так как WEB интерфейс был доступен по протоколу https. Возникало следующее исключение:
"Базовое соединение закрыто Не удалось установить доверительные отношения для защищенного канала SSL TLS". Вот по этой ссылке сделал.
http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/c98ea134-c582-4c2a-8c42-d7e31f7fe389
Итак определяем функцию, котрая возвращает всегда "True"
Private Function ValidateCertificate(ByVal sender As Object, _
ByVal certificate As X509Certificate, ByVal chain As X509Chain, _
ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
Return True
End Function
А вот ее вызов
Dim wc As New System.Net.WebClient
Dim Stream As System.IO.Stream
Try
System.Net.ServicePointManager.ServerCertificateValidationCallback = _
New System.Net.Security.RemoteCertificateValidationCallback AddressOf _
ValidateCertificate)
Dim myUri As New Uri("https://" & Specific.IP_address _ & "/hp/device/this.LCDispatcher?nav=hp.Config")
Dim mySP As System.Net.ServicePoint = _
System.Net.ServicePointManager.FindServicePoint(myUri)
Stream = wc.OpenRead(myUri)
Using sr As New System.IO.StreamReader(Stream)
str = sr.ReadToEnd()
Stream.Close()
End Using
Return CType(CountStr, Integer)
Catch ex As Exception
Dim errorstring = ex.Message
End Try
вторник, 27 апреля 2010 г.
MVC.Многостраничный просмотр таблицы.
Задача сводится к следующему. При выводе данных в окно браузера ограничиться некоторым количеством записей из таблицы, чтобы помещалось на экране. А тажке соорудить навигацию для доступа к невидимой части.
"MVC PageIndex" - запрос к Google.
Решение очень быстро нашлось. http://en.webdiyer.com/ . Абсолютно бесплатный модуль. Есть очень понятные примеры. http://en.webdiyer.com/MvcPager/Demo/StandardТак как я использую сначала фильтр, а потом уже вывожу данные, то вот мой измененный код:
Мне пришлось создать новый класс, который является неким объединением двух таблиц Consumable и Printer. Ну а в представлении я абсолютно точно копирую из оригинала. Только перевожу в синтаксис языка VB
И еще полезно будет в Web.config в каталоге VIEW внести строчку
<namespaces>
<add namespace="Webdiyer.WebControls.Mvc"/>
</namespaces>
Чтоб метод Pager был доступен в каждой странице проекта.
"MVC PageIndex" - запрос к Google.
Решение очень быстро нашлось. http://en.webdiyer.com/ . Абсолютно бесплатный модуль. Есть очень понятные примеры. http://en.webdiyer.com/MvcPager/Demo/StandardТак как я использую сначала фильтр, а потом уже вывожу данные, то вот мой измененный код:
Function Consumable(ByVal id1 As Integer?) As ActionResult
Dim Datacontext As New PrintModelDataContext
Dim ListConsumables As IQueryable(Of ClassConsumable)
ListConsumables = From c In Datacontext.consumable, p In Datacontext.Printer _
Where c.Id_printer = p.Id _
Select New ClassConsumable _
With {.Id = c.Id, _
.Naim = c.Naim, _
.Part_number = c.Part_number, _
.Revolving = c.Revolving, _
.Count = c.Count, _
.NaimPrinter = p.Naim}
Return View(ListConsumables.ToPagedList(IIf(id1 Is Nothing, 1, id1), 20))
End FunctionМне пришлось создать новый класс, который является неким объединением двух таблиц Consumable и Printer. Ну а в представлении я абсолютно точно копирую из оригинала. Только перевожу в синтаксис языка VB
<%=Html.Pager(Of print.ClassConsumable)(Model, New PagerOptions With {.PageIndexParameterName = "id1"})%>И еще полезно будет в Web.config в каталоге VIEW внести строчку
<namespaces>
<add namespace="Webdiyer.WebControls.Mvc"/>
</namespaces>
Чтоб метод Pager был доступен в каждой странице проекта.
пятница, 19 марта 2010 г.
MVC. Html.DropDownList
Эта тема перекликается с описанной в прошлом посте. Но теперь хочется, чтобы при редактировании и добавлении новой записи, вместо идентификаторов-ссылок на первичные ключи был выбор ввиде выпадающего списка. То есть вместо Html.TextBox используем Html.DropDownList. Вот код в контроллере:
А теперь используем список всех принтеров для выбора поля ID_Printer в таблице Specific в представлении:
Function CreateSpecific() As ActionResult
Dim Datacontext As New PrintModelDataContext
Dim PrinterList As IList
PrinterList = (From p In Datacontext.Printer Select ID = p.Id, Naim = _ p.Naim).ToList
ViewData("PrinterList") = New SelectList(PrinterList, "ID", "Naim")
Return View()
End Function А теперь используем список всех принтеров для выбора поля ID_Printer в таблице Specific в представлении:
<%=Html.DropDownList("Id_printer", CType(ViewData("PrinterList"), SelectList)%>
Если у нас есть логическое поле в таблице, то для него тоже можно использовать HTML.DropDownList.
Например в контроллере создаем список:
Dim YesNo As New List(Of SelectListItem)
YesNo.Add(New SelectListItem With {.Value = Boolean.Parse("True"), _
.Text = "ДА", .Selected = Boolean.Parse("True")})
YesNo.Add(New SelectListItem With {.Value = Boolean.Parse("False"),_
.Text = "НЕТ", .Selected = Boolean.Parse("True")})
ViewData("YesNo") = New SelectList(YesNo, "Value", "Text")
А в представлении код тот же:
<%=Html.DropDownList("Boolean", CType(ViewData("YesNo"), SelectList)) %>
MVC. Выводим в представлениях вместо ID - наименования.
Продолжаем работать над MVC приложением. Конечно при отображении значений полей в записи таблицы, хотелось бы видеть не идентификаторы-ссылки на другую таблицу ,связанную отношениями, а их смысловые значения. Допустим есть первичная таблица Printer (Это таблица моделей принтеров). Вот как выглядит контроллер для отображения этой таблицы .
Потом в одноименном представлении (строго-типизированном) мы в цикле выводим колонки записи таблицы.
А вот выводим дочернюю таблицу Specific:
В представлении мы уж используем Viewdata("Specific") вместо Model.
В этом случае Intellisense уже вам не подскажет.
Вместо поля числового поля ID_printer Выводиться NaimPrinter из таблицы Printer, вместо ID_Filial - NaimFilial
Function Printer() As ActionResult
Dim Datacontext As New PrintModelDataContext
Dim List = From p In Datacontext.Printer Select p
Return View(List.ToList)
End FunctionПотом в одноименном представлении (строго-типизированном) мы в цикле выводим колонки записи таблицы.
<%For Each item In Model%>
<%= Html.Encode(item.Naim) %>
<%= Html.Encode(item.Part_number) %>
<%= Html.Encode(item.Manufactory) %>
<%Next%>А вот выводим дочернюю таблицу Specific:
Function Specific() As ActionResult
Dim Datacontext As New PrintModelDataContext
ViewData("Specific") = _
From s In Datacontext.Specific, _
p In Datacontext.Printer, _
f In Datacontext.Filial _
Where s.Id_Printer = p.Id And s.Id_Filial = f.Id _
Select s.Id, s.Inv, s.SN, NaimPrinter = p.Naim,_
NaimFilial = f.Naim
Return View()
End FunctionВ представлении мы уж используем Viewdata("Specific") вместо Model.
В этом случае Intellisense уже вам не подскажет.
<%For Each item In ViewData("Specific")%>
<%=Html.Encode(item.NaimPrinter)%>
<%= Html.Encode(item.SN)%>
<%= Html.Encode(item.Inv)%>
<%=Html.Encode(item.NaimFilial)%>
<% Next%>Вместо поля числового поля ID_printer Выводиться NaimPrinter из таблицы Printer, вместо ID_Filial - NaimFilial
Подписаться на:
Сообщения (Atom)