sobota, 22 września 2012

Podlgądanie zawartości pliku *.wsp

W aplikacji sharepoint, skompilowane rozwiązania (solucje) kompilowane są do plików z rozszerzeniem *.wsp. Pliki, te są paczkami, zawierającymi pliki, jakie nast. zostaną wgrane na serwer podczas instalacji pliku .wsp. Jeżeli chcemy podejrzeć zawartość pliku wsp, aby np. mieć pewność, czy pliki z obrazkami (*.png) poprawnie załączyły się podczas kompilacji, możemy to zrobić, zmieniając rozszerzenie pliku z '*.wsp", na "*.cab", a nast. przejrzeć plik "*.cab" za pomocą eksploratora plików systemu windows. Przykład:

MojaSolucja.wsp -> MojaSolucja.cab

Obrona przed XTML Injection, XSS (Cross-Site Scripting) poprzez Strip

Jednym z najpoważniejszych zagrożeń związanych z bezpieczeństwem aplikacji internetowych jest HTML Injection, czyli jedna z odmian Code Injection. Problem bezpieczeństwa związany HTML Injection polega głównie na Cross-Site Script, czyli wstrzyknięciu na stronę www kodu HTML zawierającego wykonujące się skrypty (np. w języku 'Javascript'), które mogą służyć m.in. do zmiany ustawień konta, wyciągania wrażliwych danych od użytkownika i innych niepożądanych czynności.
Kod HTML zawierający szkodliwe skrypty można wstrzyknąć np. do textBoxów pobierających od użytkownika dane.

W jaki sposób się przed tym bronić? Jednym ze skutecznych sposobów ochrony przed tego typu nieczystymi zagraniami jest walidacja tekstu wpisywanego przez użytkownika za pomocą wyrażeń regularnych.Metodą, która wykonuje za nas odpowiednią walidację, jest przedstawiona poniżej metoda Strip:

using System.Text.RegularExpressions;

public static string Strip(string text)
{
    return Regex.Replace(text, @"<(.|\n)*?>", string.Empty);
}
 Stosowanie przez nas tej metody, na każdym "stringu" wpisywanym przez użytkownika, przed zapisaniem go do bazy danych, nie będzie miało zauważalnego wpływu na wydajność, za to zdecydowanie podniesie bezpieczeństwo naszej aplikacji.





środa, 12 września 2012

Wyzerowanie (czyszczenie) witryny sharepoint

Czyli... coś czego... niemal nigdy nie powinno się robić, jednak moja wyobraźnia jest na tyle pojęta, że... jednak jestem w stanie sobie wyobrazić syt. w której trzeba programistycznie wyczyścić całą witrynę sharepoint. Można to zrobić za pomocą przedstawionej poniżej metody, którą można podpiąć pod kod deaktywujący feature.

Uwaga: ta metoda jest niczym "broń atomowa" dla witryny sharepoint, więc jej ewentualne użycie powinno być wcześniej 10-krotnie przemyślane.

     private void ClearAll(SPFeatureReceiverProperties properties)
        {

            SPWeb baseWeb = (SPWeb)properties.Feature.Parent;
            Guid siteId = baseWeb.Site.ID;
            Guid webId = baseWeb.ID;
            SPSecurity.RunWithElevatedPrivileges(
                delegate()
                {
                    using (SPSite adminSite = new SPSite(siteId))
                    {
                        try
                        {
                            SPWeb web = adminSite.AllWebs[webId];
                            if (web.Exists)
                            {
                                int listIndex = 0;
                                while (web.Lists.Count > listIndex)
                                {
                                    try
                                    {
                                        web.Lists[listIndex].Delete();
                                    }
                                    catch (Exception ex) { listIndex++; };
                                }

                                while (web.ContentTypes.Count > 0)
                                {
                                    int errorCount = 0;

                                    while (web.ContentTypes[0].FieldLinks.Count > errorCount)
                                    {
                                        try
                                        {
                                            web.ContentTypes[0].FieldLinks
                                                .Delete(web.ContentTypes[0].FieldLinks[errorCount].Id);
                                        }
                                        catch (Exception ex)
                                        {
                                            errorCount++;
                                        }
                                    }
                                    web.ContentTypes[0].Delete();
                                }
                                while (web.Fields.Count > 0)
                                {
                                    int fieldIndex = 0;
                                    while (fieldIndex < web.Fields.Count)
                                    {
                                        try
                                        {
                                            web.Fields.Delete(web.Fields[fieldIndex].InternalName);
                                        }
                                        catch (Exception ex) {
                                            fieldIndex++;
                                        };
                                    }
                                }
                                web.Update();
                                web.ResetRoleInheritance();
                                if (Helpers.checkGroup(SolutionResourcesAccessor.RMUAHRGroupName, web.SiteGroups))
                                    web.SiteGroups.Remove(SolutionResourcesAccessor.RMUAHRGroupName);
                                if (Helpers.checkGroup(SolutionResourcesAccessor.RMUAUsersGroupName, web.SiteGroups))
                                    web.SiteGroups.Remove(SolutionResourcesAccessor.RMUAUsersGroupName);
                                if (Helpers.checkGroup(SolutionResourcesAccessor.RMUAAdminGroupName, web.SiteGroups))
                                    web.SiteGroups.Remove(SolutionResourcesAccessor.RMUAAdminGroupName);
                                while (web.Navigation.QuickLaunch.Count > 0)
                                {
                                    web.Navigation.QuickLaunch.Delete(web.Navigation.QuickLaunch[0]);
                                    web.Update();
                                }
                                while (web.Navigation.TopNavigationBar.Count > 0)
                                {
                                    web.Navigation.TopNavigationBar.Delete(web.Navigation.TopNavigationBar[0]);
                                    web.Update();
                                }
                            }

                            SPLimitedWebPartManager mainLWPM =
                                web.GetLimitedWebPartManager(SPUrlUtility.CombineUrl(web.Url, "default.aspx")
                                   , System.Web.UI.WebControls.WebParts.PersonalizationScope.Shared);
                            while (mainLWPM.WebParts.Count != 0)
                                mainLWPM.DeleteWebPart(mainLWPM.WebParts[0]);
                            web.ResetRoleInheritance();
                        }
                        catch (Exception ex)
                        {

                        }
                    }
                }
            );

        }

Wyświetlenie wszystkich webpartów aktualnie umieszczonych na stronie

Podczas tworzenia rozwiązań na platformę 'Sharepoint' czasami zdarza się, że chcemy obejrzeć wszystkie web party, jakie aktualnie są podpięte na oglądanej przez nas stronie. Do tego celu służy nam specjalny parametr dopisywany w querystringu. Parametr nosi nazwę 'contents' i przyjmuję wartość równą 1:

?contents=1

To rozwiązanie jest szczególnie użyteczne w sytuacjach, w których stworzony przez nas 'web part' wywala stronę, na której się znajduję. Wtedy w sposób szybki i bezproblemowy, dopisujemy odpowiedni fragment do querystringa i możemy taki 'web part' w sposób szybki, miły i przyjemny usunąć z naszej strony.