CSRF с Django, React + Redux с использованием Axios

Из этой статьи в блоге Visual C ++ о ссылках rvalue :

... C ++ не хочет, чтобы вы случайно изменяли временные разделы, но напрямую вызывали не- Функция const member на изменяемом rvalue является явной, поэтому разрешено ...

blockquote>

В принципе, вы не должны пытаться изменять временные разделы по той причине, что они являются временными объектами и будут умирать момент сейчас. Причина, по которой вам разрешено вызывать неконстантные методы, - это то, что вы можете делать какие-то «глупые» вещи, пока знаете, что делаете, и о них явно (например, используя reinterpret_cast). Но если вы привязываете временную ссылку на неконстантную ссылку, вы можете продолжать ее прокручивать «навсегда» только для того, чтобы ваши манипуляции с объектом исчезли, потому что где-то по пути вы полностью забыли, что это было временным.

Если бы я был вами, я бы переосмыслил дизайн своих функций. Почему g () принимает ссылку, изменяет ли параметр? Если нет, сделайте ссылку на const, если да, то почему вы пытаетесь временно переходить к ней, разве вам не важно, что вы временно изменяете? Почему getx () возвращается в любом случае временно? Если вы поделитесь с нами своим реальным сценарием и тем, что вы пытаетесь выполнить, вы можете получить некоторые полезные советы о том, как это сделать.

Против языка и обмана компилятора редко решает проблемы - обычно он создает проблемы.

Редактировать: адресация вопросов в комментарии: 1) X& x = getx().ref(); // OK when will x die? - я не знаю, и мне все равно, потому что это именно то, что я имею в виду под «идеей против языка». Язык говорит, что «временные члены умирают в конце утверждения, если только они не связаны с константой ссылки, и в этом случае они умирают, когда ссылка выходит за рамки». Применяя это правило, кажется, что x уже мертв в начале следующего оператора, так как он не привязан к const reference (компилятор не знает, что возвращает ref ()). Однако это только предположение.

2) Я четко сформулировал цель: вам не разрешено изменять временные рамки, потому что это просто не имеет смысла (игнорируя ссылки на C ++ 0x rvalue). Вопрос: «Тогда почему мне позволено называть неконстантных членов?» является хорошим, но у меня нет лучшего ответа, чем тот, который я уже сказал выше.

3) Хорошо, если я прав относительно x в X& x = getx().ref();, умирающем в конце утверждения, проблемы очевидны.

В любом случае, исходя из вашего вопроса и комментариев, я не думаю, что даже эти дополнительные ответы вас устраивают. Вот окончательная попытка / сводка: комитет C ++ решил, что не имеет смысла изменять временные рамки, поэтому они запрещают привязку к неконстантным ссылкам. Может быть, некоторые реализации компилятора или исторические проблемы также были задействованы, я не знаю. Затем возник какой-то конкретный случай, и было решено, что, несмотря ни на что, они по-прежнему позволят прямое изменение путем вызова метода non-const. Но это исключение - вам обычно не разрешается изменять временные рамки. Да, C ++ часто бывает странным.

38
задан Reed Dunkle 31 August 2016 в 18:44
поделиться

1 ответ

После пребывания в течение слишком многих часов, исследуя, и реализовывая вышеупомянутый ответ, я нашел свою ошибку для этой проблемы! Я добавил этот ответ, чтобы быть дополнительным принятого ответа. Я настроил все, как упомянуто, но глюк для меня был на самом деле в самом браузере!

При тестировании локально, удостоверьтесь, что Вы получаете доступ, реагируют до 127.0.0.1 вместо localhost! localhost дескрипторы запрашивают заголовки по-другому, и не показывает маркеры CSRF в ответе заголовка, где как 127.0.0.1 будет! Таким образом вместо localhost:3000 попытка 127.0.0.1:3000!

Hope это помогает.

0
ответ дан 27 November 2019 в 01:41
поделиться
Другие вопросы по тегам:

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