Как я знаю, когда WindowsFormsHost изменяет размер в WPF?

Злоумышленник, владеющий веб-сайтом и посещающий его (стандартный сценарий CSRF) , как правило, не имеет возможности в последних браузерах узнать, какие другие веб-сайты открыты на разных вкладках браузера (хотя некоторые приемы время от времени появлялись, как, например, при попытке вставить аутентифицированный ресурс с предполагаемого веб-сайта и проверить, не приводит ли это к ошибке, указывающей, что вы не вошли в систему - классика). Но они также могут просто угадать и выполнить слепую атаку - возможно, они не будут знать, удалось ли это в конкретном случае, но иногда достаточно, если бывают случайные успехи, неважно, какие именно. CSRF - это CSRF, независимо от того, может ли злоумышленник выяснить, сработал ли он. Они все еще могут быть полезны в более сложных атаках как строительный блок.

Что касается вашего другого вопроса - конечно, , если ваш браузер не отправляет информацию об аутентификации, CSRF невозможен . Обратите внимание, что это не означает, что файлы cookie, базовая аутентификация HTTP также сохраняется для сеанса, и клиентские сертификаты также отправляются автоматически. Может быть незначительный, но иногда довольно важный. :) Также обратите внимание, что простой выход из пользовательского интерфейса не обязательно делает CSRF недействительным - серверу также необходимо правильно выйти из системы, что не всегда так. Для простого примера рассмотрим единый вход в систему SAML, где у вас есть долгосрочный сеанс с поставщиком удостоверений и недолговечный сеанс с приложением. Вы нажимаете кнопку «Выйти», сеанс приложения прекращается, но не может быть единого выхода. Когда CSRF затем пытается что-то наподобие полной http-записи, вы можете быть перенаправлены в IdP, а затем в приложение, которое может автоматически войти в систему, и выполненное действие - без какого-либо взаимодействия с пользователем, облегчая CSRF. Снова, может быть, крайний случай, но все это в некотором смысле относится к крайним случаям.

5
задан casperOne 3 December 2010 в 14:13
поделиться

2 ответа

Ожидание на таймере очень, очень плохая идея, вполне просто, это - эвристика, и Вы предполагаете, когда изменить размер операция сделана.

Лучшая идея состояла бы в том, чтобы получить класс из WindowsFormsHost и переопределение WndProc метод, обрабатывая WM_SIZE сообщение. Это - сообщение, которое отправляется в окно, когда операция размера завершена (в противоположность WM_SIZING, который отправляется во время процесса).

Можно также обработать WM_SIZING сообщение и не вызов базовое внедрение WndProc когда Вы получаете это сообщение, чтобы препятствовать тому, чтобы сообщение было обработано и имело саму перерисовку карты все те времена.

Документация для WndProc метод на Control класс показывает, как переопределить WndProc метод:

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.wndproc (По сравнению с 71) .aspx

Даже при том, что это для другого класса, это - тот же точный принципал.

Кроме того, Вам будут нужны значения для WM_SIZING и WM_SIZE константы, которые можно найти здесь:

http://www.pinvoke.net/default.aspx/Enums/WindowsMessages.html

Обратите внимание, что Вам не нужно все из ссылки выше, просто объявления для тех двух значений:

/// <summary>
/// The WM_SIZING message is sent to a window that
/// the user is resizing.  By processing this message,
/// an application can monitor the size and position
/// of the drag rectangle and, if needed, change its
/// size or position. 
/// </summary>
const int WM_SIZING = 0x0214;

/// <summary>
/// The WM_SIZE message is sent to a window after its
/// size has changed.
/// </summary>
const int WM_SIZE = 0x0005;
7
ответ дан 15 December 2019 в 01:12
поделиться

Согласно предложению здесь:

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/8453ab09- ce0e-4e14-b30b-3244b51c13c4

Они предлагают использовать таймер, и каждый раз, когда срабатывает событие SizeChanged, вы просто перезапускаете таймер. Таким образом, таймер не будет постоянно вызывать «Тик», чтобы проверить, изменился ли размер - таймер срабатывает только один раз при изменении размера. Может быть, не совсем идеально, но мне не приходится иметь дело с низкоуровневыми окнами. Этот подход работает и для любого пользовательского элемента управления wpf, а не только для окон wpf.

public MyUserControl()
{
    _resizeTimer.Tick += _resizeTimer_Tick;
}

DispatcherTimer _resizeTimer = new DispatcherTimer { Interval = new TimeSpan(0, 0, 0, 0, 1500), IsEnabled = false };

private void UserControl_SizeChanged(object sender, SizeChangedEventArgs e)
{
    _resizeTimer.IsEnabled = true;
    _resizeTimer.Stop();
    _resizeTimer.Start();
}

int tickCount = 0;
void _resizeTimer_Tick(object sender, EventArgs e)
{
    _resizeTimer.IsEnabled = false;
    //you can get rid of this, it just helps you see that this event isn't getting fired all the time
    Console.WriteLine("TICK" + tickCount++);

    //Do important one-time resizing work here
    //...
}
-3
ответ дан 15 December 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: