• ú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
    SAJAGI
    SAJAGI --- ---
    UETOYO: Mně přijde, že použitelných je dost málo (pokud nechceš jen spustit msbuild) a z toho, co jsem vyzkoušel (cake, nant, msbuild), mi fake připadá nejlepší. Co používáš ty?
    UETOYO
    UETOYO --- ---
    SAJAGI: Používáte někdo FAKE?
    Já ne, pořád mi něco nefunguje, jednou na widlích pak na linuxu..., nějak se mi zdá že je těch nástrojů moc.
    SAJAGI
    SAJAGI --- ---
    SAJAGI: Tak si odpovím
    - dá se použít #r "paket: groupref build//", který vezme packages z paket.locku
    - Stejná verze fake nuget balíku má jiný obsah na nuget.org a jiný na chocolatey. Fujtajbl.
    SAJAGI
    SAJAGI --- ---
    Používáte někdo FAKE?

    Pro jeden nový projekt jsem zkusil používat rovnou FAKE 5, a přijde mi, že autoři sice vylepšili API, ale některá rozhodnutí mi přijdou velmi nešťastná:
    - nutnout specifikovat reference na Fake moduly pomocí #r paket: ... - a pak se buď velmi blbě updatují package (smazáním lockfilu buď vše, nebo nic - jde to jinak?), nebo se ještě bokem musí držet paket.dependencies a referencovat ručně :/
    - fake5.exe (resp. fake.dll) nemá vlastní nuget balík, nebo něco nechápu? (poslední beta verze obsahuje fake.exe, ale to je "starý" fake; fake.dll pro netcore tam není vůbec?)

    Celkově mi z toho vychází, že zatímco dřív člověk musel mít v repu miniaturní paket bootstrapper, aby dotáhl vše ostatní (včetně buildsystému), teď je člověk nucený mít nainstalovaný FAKE přes chocolatey globálně. Nebo se to někomu podařilo jinak?

    MORMEGIL: Ehm ještě jsem se k tomu pořád nedostal.. :)
    PEPSIN
    PEPSIN --- ---
    UETOYO: Uz to padlo, byla to trosku spatna komunikace. NPL je nad ramec zrdroju co muzeme pouzit.

    Ale zpetne: Teorie byla takova ze budou nejake texty o technice a my z nich zhruba vytahneme ceho se tykaji.
    UETOYO
    UETOYO --- ---
    PEPSIN: Tak asi hledáš nějakou NLP knihovnu? Co přesně chceš dělat?
    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.
    Kliknutím sem můžete změnit nastavení reklam