Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Хранение CSRF токена в куке

Всем доброго дня.

Есть одностраничная админка с кучей кнопок. Обработчики кнопкок посылают ajax запросы на сервер. Отправляют, получают данные. Все как обычно.

Нужно организовать защиту от CSRF.
Реализовал так.

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

Потом любой ajax запрос, вместе со своими данными отправляет и этот хеш ( токен ).

А на стороне сервера я сверяю хеш который пришел с ajax запросом с хешем который в куке у юзера. Если совпадают то ок.

Вобщем вопрос. Можно ли так делать? Безопасно ли хранить токен в куке юзера? В манах пишут что нужно хранить в $_SESSION.

P.S. Кука с флагом "httponly" у javascript-а к ней доступа нет.

Ответ:
Да, можно. Собственно, это классический способ.
Вопрос: CSRF токен для метода POST

Здравствуйте! Очень часто вижу рекомендации для установки CSRF токена в формы которые отправляются методом POST. Но смысл не понимаю. Для GET запросов смысл ясен, можно дать ссылку как в примере из Википедии
Мэллори: Привет, Алиса! Посмотри, какой милый котик: <img src="http://bank.example.com/withdraw?account=Alice&amount=1000000&for=Mallory">
Конечно такие операции должны происходить методом POST но сейчас не об этом. Предположим что мы делаем это GETом. В этом случае смысл необходимости токена понятен.
Но как можно заставить пользователя например отправить форму методом POST без его ведома если нет CSRF защиты?
И как этому может помешать токен?
Ответ:
Сообщение от Dolphin
А зачем ему sessid?
Без него сервер не обработает запрос. Но как я понял, браузер сам его отправит, да?
Вопрос: Playframework + CSRF

Приветствую!

Есть веб приложение на Playframework, где есть форма авторизации с использованием CSRF токена. Возникла необходимость сделать авторизацию со сторонней веб-страницы (другой веб-сайт). Соответственно, так как генерация CSRF токена встроенна в Play, при передаче данных (логин/пароль) со стороннего сайта выдается ошибка: "CSRF token not found in body or query string".

Подскажите, как правильно садаптировать авторизацию со стороннего сайта на приложение, не убирая проверки CSRF токена.

Спасибо!
Ответ:
Mad_Head
Petro123,

Как по мне токен от куки отличается в во всем. Корректнее говорить передача токена в хедерах и в куках не сильно отличаются

ну дак, всё зависит от точки зрения. Китайцы все на одно лицо. А когда нужно поближе, то конечно они разные.
Стакан полуналитый или полупустой? Щас будем спорить, у меня "не сильно", а у вас "во всём"))).
Вопрос: Register_long_arrays (странное поведение)

Хостер как всегда клянется, что у меня в коде косяк.
1. Ни где не использую старые переменные.
2. в .htaccess прописано php_value register_long_arrays Off

Страницы открываются через раз т.е. то ошибка(причем как фатальная распознается(@register_shutdown_function('ErrorShutdownHandler'); // Обработчик фатальных ошибок)), то все ок.
В лог так же ни чего не пишется. Строка 0 , файл не известный.
На локалке версия 5.3 все все ок. На сервере была 5.6, сейчас сменил на 5.3...

Что делать не пойму !
Ответ: Forastero, Конечно абсолютно все записывается четко. А вот именно в этом очень странное поведение.
Все что как либо обрабатывает ошибки выполняется, кроме строки
PHP
1
error_log('Тут формируется текст' , 0);
Вопрос: CentOS jetty9 странное поведение 404

Добрый день .
Есть строенное поведение :

CentOS Linux release 7.2.1511 (Core)

На ней как сервис установлена jetty 9 + java 8 (oracle)

На веб сервер задеплоен root.war - разрботан на spring 4 ( Классический spring mvc)

В нем есть web.xml c прописанной 404 jsp страницей .


Странное поведение начинается через некоторое время t простоя системы :

при попытке в браузере обратиться к существующему URL - например контроллер обрабатыващий страницу /index

я вижу ошибку c адресом HTTP ERROR 404

HTTP ERROR 404

/WEB-INF/jsp/code/404.jsp

powered by jetty 9.3.8.v20160314



т.е каким то образом jetty или само приложение перестает видеть свой же собственный маппинг контроллеров и view ?!

и что вообще не понятно - начинает мне показывать внутреннее представление ресурсов ... (но не находит 404.jsp)

При этом странность в том что страница - Login - - созданная самим spring security по умолчанию - замаплина и отображается
(создана по умолчанию как в документации )

но после авторизации - опять получаем 404 от jetty ? а не от приложения ?


в логах все чисто никаких ошибок ...

может как то можно выставить уровень логировая другой ? куда смотреть ? какие мнения?
Ответ: irbis_al,

Он писал, что на CentOs у него jetty-9, а на debian jetty-8. Это две большие разницы.
Вопрос: Странное поведение операторов as и is

После переноса проекта с Delphi 7 на Delphi 2007

Перестали работать эти самые операторы.

Оператор is ни один тип не смог сравнить, при полной уверенности что типы совпадают , поставил костыль ввиде

 if (TObject.ClassName = 'TObject') then //работает
 if (TObject.ClassName is TObject) then //не работает


с as такая же ситуация
 TObject(Sender).ClassName//работает
(TObject.ClassName as TObject).ClassName //не работает выдает ошибку что тип не соответствует 


При всем при том что когда создаётся пустой проект с нуля, данные операторы работают корректно.

С чем можно связать столь странное поведение операторов?!
Ответ: softwarer,

Спасибо, действительно оказалось что не прописал нужные пакеты, хотя была уверенность полная что все тип топ
Вопрос: Странное поведение VS 2017

Добрый день. Заметил странное поведение студии. У меня есть две функции :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
LPWSTR GetCurrentPath()
{
    wchar_t* CurrentPath[MAX_PATH + 1];
    GetModuleFileNameW(0, CurrentPath, sizeof(CurrentPath));
    return CurrentPath;
}
 
LPWSTR GetCurrentDir()
{
    wchar_t* CurrentDir[MAX_PATH + 1];
    GetCurrentDirectoryW(sizeof(CurrentDir), CurrentDir);
    return CurrentDir;
}
Вызываются они из файла - Utils.cpp. Соответственно подключен заголовочный файл. При вызове этих функций, допустим :
C++
1
2
MessageBoxW(0, GetCurrentDir(), 0, MB_OK);
MessageBoxW(0, GetCurrentPath(), 0, MB_OK);
Всё - хорошо. Но, если после этих двух строк - поставить ExitProcess(0) - вместо корректных данных выводятся иероглифы. Хотелось-бы узнать, в чем заключается проблема. Спасибо.
Ответ: Спасибо большое! Помогло.
Вопрос: Странное поведение программы

Странное поведение программы.
Почему выводит эту, извините, ерунду в отображении после кнопки submit-а?
Ребята, неужели я где-то забыл закрыть скобку?!!!
всё-ж вроде правильно.

А! забыл выложить сам код.
Вот он:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<form method="POST" action="">
 
    <input type="radio" name="operation" value='+'>+<br>
    <input type="radio" name="operation" value='-'>-<br>
    <input type="radio" name="operation" value='*'>*<br>
    <input type="radio" name="operation" value='/'>/<br>
<input type="text" name="a" required><br>
<input type="text" name="b" required><br>
<input type="submit" name="button" value="Отправить">
</form>
<?
 
$a = $_POST['a'];
$b = $_POST['b'];
$radio = $_POST['operation'];
if ($_POST['button'])
{
if ($radio=='+'){$c = $a + $b; echo "сумма=" . $c.'<br>';}
if ($radio=='-'){$c = $a - $b; echo "разность=" . $c.'<br>';}
if ($radio=='*'){$c = $a * $b; echo "произведение=" . $c.'<br>';}
if ($radio=='/'){$c = $a/ $b; echo "частное=" . $c.'<br>';}
}
?>
Ответ: Jewbacabra, Спасибо!
Вопрос: Непонятная ошибка csrf валидации

при отправки форм в backend возникает ошибка "Bad Request (#400) Не удалось проверить переданные данные" формируются разные csrf токены так вот такой токен формируются в форме
anRRVnhKa2o9RmkGGwUTBUdMGBFOIB06Dz0rFE0ILgAvARUPH34JIw==
вот такой приходит не объясните как понять почему.
Ответ: Какой фреймворк? Не понятно, какой токен у вас находится в форме и какой в итоге приходит вместе с телом запроса. CSRF сами проверяете или фреймворк за вас это делает?
Вопрос: IsDefault button - странное поведение

Сделал простую форму:
    <Grid>
		<Button Click="Button_Click" IsDefault="True">OK</Button>        
    </Grid>


Больше ничего. Простой обработчик:
	public partial class MainWindow : Window
	{
		public MainWindow()
		{
			InitializeComponent();
		}

		private void Button_Click(object sender, RoutedEventArgs e)
		{
			this.DialogResult = true; // line 29
		}
	}


При нажатии на кнопку OK или Enter получаю исключение. Стал выяснять: оказывается, в обработчик Button_Click мы заходим дважды. В первый раз - всё в порядке. Во второй раз - выскакивает исключение. Не могу понять, почему так? Как правильно выставить DialogResult?


System.InvalidOperationException was unhandled
HResult=-2146233079
Message=DialogResult can be set only after Window is created and shown as dialog.
Source=PresentationFramework
StackTrace:
at System.Windows.Window.set_DialogResult(Nullable`1 value)
at WpfApplication2.MainWindow.Button_Click(Object sender, RoutedEventArgs e) in D:\ProjOther\WPF\WpfApplication2\MainWindow.xaml.cs:line 29
at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
at System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
at System.Windows.Controls.Primitives.ButtonBase.OnClick()
at System.Windows.Controls.Button.OnClick()
at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
at System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e)
at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
at System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e)
at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
at System.Windows.Input.InputManager.ProcessStagingArea()
at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
at System.Windows.Application.RunDispatcher(Object ignore)
at System.Windows.Application.RunInternal(Window window)
at System.Windows.Application.Run(Window window)
at System.Windows.Application.Run()
at WpfApplication2.App.Main() in D:\ProjOther\WPF\WpfApplication2\obj\x86\Debug\App.g.cs:line 0
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
Ответ: Блин, из обработчиков кнопок вручную надо форму закрывать:

		private void Button_Click_OK(object sender, RoutedEventArgs e)
		{
			DialogResult = true;
			Close();
		}

		private void Button_Click_Cancel(object sender, RoutedEventArgs e)
		{
			Close();
		}