• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    TENCOKACISTROMYProgramovani v C#, F# a dalsich jazycich pro .NET, Mono a ostatni CLI implementace
    PEPSIN
    PEPSIN --- ---
    Zdravim ve spolek, potreboval bych nasmerovat. Pokud chci delat analyzu textu a chci to delat offline, co hledam?
    SAJAGI
    SAJAGI --- ---
    MORMEGIL: Hmmm hele to je zajímavý! V pondělí to pořádně vyzkouším a dám vědět :)
    MORMEGIL
    MORMEGIL --- ---
    SAJAGI: Ha! Tak ne, napadlo mě lepší řešení: Je potřeba si ten soubor držet otevřený. V zásadě by mohlo fungovat nějaké
    using (var f = File.Open(oldName, FileMode.Open, FileAccess.Read, FileShare.Delete))
    {
    	Kernel32.MoveFileEx(oldName, newName, 0);
    }
    


    Případně by mohlo být (možná čistší?) variantou SetFileInformationByHandle (s FILE_RENAME_INFORMATION).

    Útočníkovi se sice může povést ten soubor přejmenovat a pod původním jménem vyrobit adresář, ale nijak mu to nepomůže, ve finále se přejmenuje ten původní soubor.
    SAJAGI
    SAJAGI --- ---
    MORMEGIL: Díky. Doufal jsem, že bude nějaké jednoduché řešení a ono ouha :/
    MORMEGIL
    MORMEGIL --- ---
    SAJAGI: Vynucení přejmenování adresáře je jednoduché: místo "X" přejmenovávat "X\". Se soubory je to horší: Jediný trik, co mě napadl, je zneužít ReplaceFile:
    if (Directory.Exists(oldName))
    {
    	Console.WriteLine("Processing directory...");
    	if (!Kernel32.MoveFileEx(oldName + @"\", newName, 0))
    	{
    		Console.WriteLine("Failed!");
    	}
    }
    else
    {
    	Console.WriteLine("Processing file...");
    	File.Create(newName).Close();
    	if (!Kernel32.ReplaceFile(newName, oldName, null, 0, IntPtr.Zero, IntPtr.Zero))
    	{
    		Console.WriteLine("Failed!");
    		File.Delete(newName);
    	}
    }
    

    Nevýhodou je, že se tam nejdříve musí založit ten prázdný soubor pod novým jménem, jehož obsah se následně nahradí (a v případě neúspěchu ex post musí smazat), což pro nejčastější důvody využití přejmenovávání znamená, že to je nepoužitelné, předpokládám. Navíc se tím u toho přejmenovávaného souboru tedy ztratí přesně ty atributy, které ReplaceFile zachovává, což může taky trochu vadit (ale to by asi šlo obejít založením toho nového souboru třeba se stejnými ACL atd.).
    SAJAGI
    SAJAGI --- ---
    TROGLODYT: Je nutné, aby k té operaci vůbec nedošlo, bohužel. Ještě nás napadlo řešit to hardlinkem, ale bohužel se nemůžeme spolehnout na to, že filesystém bude vždy NTFS :/
    TROGLODYT
    TROGLODYT --- ---
    SAJAGI: A nestacilo by ti jen po operaci zkontrolovat, ze soubor zustal souborem (adresar adresarem) a pokud ne, tak ho prejmenovat zpatky?
    SAJAGI
    SAJAGI --- ---
    Ahoj, dá se nějak zjistit, zda-li soubor X na disku je soubor, nebo adresář, a poté ho přejmenovat na soubor/adresář Y za předpokladu, že se mezi těmito dvěma operacemi ze souboru nestal adresář či opačně (v důsledku nějaké paralelní operace)? MoveFileEx (kernel32) nerozlišuje mezi souborem a adresářem.

    Příklad, čeho se chci vyvarovat. Řekněme, že uživatel smí přejmenovávat/přesouvat soubory, ale ne adresáře. Pseudokód:
    
    RenameFileOnly(string from, string to) { 
      if (File.Exists(from)) {
         // jiný proces zde smaže soubor 'from' a vytvoří adresář 'from'
         Kernel32.MoveFileEx(from, to) // přejmenuje adresář... fuck
      }
    }
    

    btw. je mi jedno, pokud jiný proces nahradí soubor souborem, nebo adresář jiným adresářem.

    Napadlo mě nejprve založit cílový soubor/adresář a použít MOVEFILE_REPLACE_EXISTING, ale to failne jen pokud přejmenovávám soubor (na existující adresář), ne naopak.
    LIRO
    LIRO --- ---
    MORMEGIL: Mno snažím se kombinovat různé způsoby ověření. Skryté pole ve formuláři s šifrovanou hodnotou, která se spojí s šifrovanou hodnotou z cookies a časovým razítkem. ReCaptchu, která se ukazuje po určitém počtu odeslaných dotazů, tak aby to normálního uživatele nijak neomezilo. Ověření dat před uložením, a vymazání potencionálně nebezpečných hodnot. Maximální počet odeslaných formulářů z IP adresy za určitý čas.
    Je fakt že jsem používal viewstate jako další místo pro uložení další ověřovací hodnoty. Ale kupodivu to byla
    nejmíň spolehlivá část. Například při více formulářích vygenerovaných na jedné straně, se u některých hodnoty z VS nenačetli korektně a na konci se nespojili s časovým razítkem stránky. Nepřišel jsem na to proč. Jediné co bylo jinak, že ve straně bylo víc formulářů. Ale byla to další cestička k možnému ověření, za určitých podmínek.

    Mno když nad tím tak přemýšlím, třeba nechám na konci stránky prázdný form s runat="server" a šoupnu do něj nic neovlivňující vějičku, která nikam nepovede, jen zaplní VS trochou šifrovaného balastu.
    CERMI_FOX
    CERMI_FOX --- ---
    MORMEGIL: viewstate neresi csrf, to je rozsireny omyl. Prinejlepsim ho trochu komplikuje.
    MORMEGIL
    MORMEGIL --- ---
    LIRO: Máš nějak řešenou ochranu proti CSRF? Viewstate podobné věci (za určitých podmínek) řeší tak nějak mimochodem, takže jestli se ho zbavíš, tak to patrně musíš řešit nějak sám.
    LIRO
    LIRO --- ---
    Ahoj, předem se omlouvám, ale teď se zeptám asi jako úplná lama. Ne že by tomu jindy bylo jinak. Programuju víceméně pro zábavu a před časem jsem začal na vlastním CMS-ku. Teď jsem dospěl do fáze, že se mi komplet obsah generuje ze šablon, z databáze a přestal jsem potřebovat základní form runat="server". Tím pádem ze stránek zmizeli viewstate a další skryté prvky.
    Otázka zní, jestli nepřítomnost těhle prvků, nebude mít nějaký vliv na bezpečnost webu a když tak na co si dát pozor.
    Formuláře, vyhledávání atd řeším přes Request.Form.
    Předem moc díky za rady.
    ROTTWEILER
    ROTTWEILER --- ---
    PEPSIN: Koukni na Udemy nebo Pluralsight.
    PEPSIN
    PEPSIN --- ---
    UETOYO: Diky, mrknu.
    UETOYO
    UETOYO --- ---
    PEPSIN: No já to myslel tak, že .NET Core má ještě pár much. Např. občas chybějící knihovny jako pro Oracle (pravda to jsem teď dlouho nezkoumal, ale před půl rokem ještě nebyla). Také se teď přechází na verzi 2.0 a třeba tooling pro F# není ve VS dotažený. Jinak já úspěšně programuji na Ubuntu a nasazeno mám na Windows serveru, takže v tomhle ohledu jsem docela spokojen. Být tebou zkusím si F# + Fable (transpiler do JS) + Elmish (Elm architektura) + React.
    PEPSIN
    PEPSIN --- ---
    UETOYO: spis jsem to chtel pojmout jako sebevzdelavani.
    UETOYO
    UETOYO --- ---
    PEPSIN: Doporučim oficiální dokumentaci. Od té doby co je na githubu je dobrá. Je tam i tutorial. Jinak co chceš psát nad .net core?
    PEPSIN
    PEPSIN --- ---
    Par otazek na zkusenejsi programatory:

    Mate nekdo nejake dobre rady na literaturu/blog/tutorial na .Net Core?

    Vite nekdo o nejakem hezkem blogu zabyvajicich se patterny a jejich aplikaci v ruznych frameworkcich? (nevim uplne presne jak polozit tuhle otazku, tak z toho aspon trosku vyplyva co mam na mysli)
    SAJAGI
    SAJAGI --- ---
    SAJAGI: Jinak paket už umí podporu pro netstandard a netcore docela dobře. Každý druhý den navíc vychází nová verze paketu, autoři se dost snaží, chválím je.
    NECROMAN
    NECROMAN --- ---
    TEAPACK: Zkus samply tady, v 99% tam najdeš, co hledáš
    Windows-universal-samples/Samples at master · Microsoft/Windows-universal-samples · GitHub
    https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples
    Kliknutím sem můžete změnit nastavení reklam