Tento web používá soubory cookie. Dalším používáním webu s tímto souhlasíte.
jméno
heslo
přihlásit
zaregistrujte se
zapomněli jste heslo?
Programovani v C#, F# a dalsich jazycich pro .NET, Mono a ostatni CLI implementace
TENCOKACISTROMY
Máte k tomu co říct? Vložte se do diskuze.
SAJAGI --- 20:04:04 5.1.2018
MORMEGIL: Hmmm hele to je zajímavý! V pondělí to pořádně vyzkouším a dám vědět :)
MORMEGIL --- 10:40:52 5.1.2018
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 --- 22:36:37 4.1.2018
MORMEGIL: Díky. Doufal jsem, že bude nějaké jednoduché řešení a ono ouha :/
MORMEGIL --- 17:57:22 4.1.2018
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 --- 11:26:10 4.1.2018
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 --- 21:43:54 3.1.2018
SAJAGI: A nestacilo by ti jen po operaci zkontrolovat, ze soubor zustal souborem (adresar adresarem) a pokud ne, tak ho prejmenovat zpatky?
SAJAGI --- 17:17:52 3.1.2018
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 --- 10:25:32 29.11.2017
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 --- 17:56:09 28.11.2017
MORMEGIL: viewstate neresi csrf, to je rozsireny omyl. Prinejlepsim ho trochu komplikuje.
MORMEGIL --- 17:45:05 28.11.2017
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.