我在AngularJS SPA中使用资源所有者密码凭据OAuth 2.0流程.有几篇文章(这里,这里 ......)和这个问题的答案解释了我们不应该在(web)客户端(LocalStorage)上存储刷新令牌,而是将它们加密存储在HttpOnly Cookie中并使用代理API我们实现refreh令牌的解密,将其转发给安全令牌服务.
大多数文章都暗示我们应该通过使用一种常见的保护机制来关注CSRF.我想知道单页应用程序中最好的解决方案是什么.
Angular $ http参考解释了我们应该如何对抗CSRF的默认机制:服务器必须设置一个名为的cookie XSRF-TOKEN.此cookie必须是Javascript可读的,以便我们可以X-XSRF-TOKEN在请求中设置HTTP标头.这种机制是否足以保护refreh令牌场景?
第一次启动应用程序.没有访问令牌或cookie可用,我们必须使用用户名和密码登录.api/login给我们一个访问令牌,我们保留在内存中并设置两个cookie.HttpOnly refreh令牌cookie和JS可读XSRF-TOKENcookie.
访问令牌到期.调用api/token验证XSRF-TOKEN并使用令牌cookie返回新的访问令牌; 设置新的刷新cookie
从中重启应用程序AppCache.内存中没有访问令牌,但可用cookie.用api/token...
坏人想偷我们的refreh cookie.准备好的页面api/token使用我们的cookie 发出请求,但没有X-XSRF-TOKENHTTP标头.
任何严重的安全问题?
是否有一个可以替换以下函数的Array方法(类似的东西a.splice(some, tricky, arguments))?
function resize(arr, newSize, defaultValue) {
if (newSize > arr.length)
while(newSize > arr.length)
arr.push(defaultValue);
else
arr.length = newSize;
}
Run Code Online (Sandbox Code Playgroud)
如果没有,是否有更好/更好/更短/实施?如果数组应该增长并且在shrink上删除值,则该函数应附加默认值.
我正在使用Hudson作为Delphi 2010项目的CI服务器.XMLTestRunner.pas单元将DUnit测试结果写入xml文件,该文件由hudson xUnit插件用于报告测试结果.xUnit插件显示失败但没有消息:
Stacktrace
MESSAGE:
+++++++++++++++++++
STACK TRACE:
Run Code Online (Sandbox Code Playgroud)
在"发布测试工具结果报告"的hudson项目配置中,我选择"NUnit-Version N/A(默认)"作为测试工具,因为列表中没有dunit选项,并且xml文件看起来类似于nunit格式:
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>
<test-results total="123" notrun="0" date="20.12.2010" time="09:19:24">
<test-suite name="HelloWorldTestSuite" total="46" notrun="0">
<results>
<test-case name="TestCase.HelloWorldTest" execute="True" success="False" time="0,003" result="Failure">
<failure name="ETestFailure" location=""/>
<message>expected: < hello world! > but was: < hallo welt ></message>
</test-case>
...
Run Code Online (Sandbox Code Playgroud)
在哈德森配置中还有一个"自定义工具"选项,我必须指定"自定义样式表",但我不知道如何编写这样的样式表(是否有任何文档?).
在我的C++项目中,使用boost测试,可以很好地报告所有消息的失败情况.
由于不小心使用Delphi接口,我的应用程序中有另一个错误.当我将接口传递给忽略该参数的过程时,实例永远不会被释放.请参阅以下简单示例:
ITest = interface
procedure Test;
end;
Tester = class(TInterfacedObject, ITest)
public
procedure Test;
end;
Base = class
public
procedure UseTestOrNot(test : ITest); virtual; abstract;
end;
A = class(Base)
public
procedure UseTestOrNot(test : ITest); override;
end;
B = class(Base)
public
procedure UseTestOrNot(test : ITest); override;
end;
{ A }
procedure A.UseTestOrNot(test: ITest);
begin
test.Test();
end;
{ B }
procedure B.UseTestOrNot(test: ITest);
begin
WriteLn('No test here');
end;
// -------- Test ---------------------------------------
var
list : TObjectList<Base>;
x : Base;
t : ITest; …Run Code Online (Sandbox Code Playgroud) 当我开始使用Delphi时,我读到了避免无参数Create构造函数无用调用的唯一方法是在其中抛出异常或断言.当我本周第一次使用reintroduce关键字时,我发现它似乎也解决了这个问题.
Test = class
private
n_ : Integer;
public
constructor Create(n : Integer); reintroduce;
end;
Run Code Online (Sandbox Code Playgroud)
调用Test.Create给出了所需的编译器错误.这种方法有什么问题吗?
使用模板函数,<algorithm>您可以执行此类操作
struct foo
{
int bar, baz;
};
struct bar_less
{
// compare foo with foo
bool operator()(const foo& lh, const foo& rh) const
{
return lh.bar < rh.bar;
}
template<typename T> // compare some T with foo
bool operator()(T lh, const foo& rh) const
{
return lh < rh.bar;
}
template<typename T> // compare foo with some T
bool operator()(const foo& lh, T rh) const
{
return lh.bar < rh;
}
};
int main()
{
foo foos[] …Run Code Online (Sandbox Code Playgroud) 我真的很喜欢自由begin end编写更通用算法和数据结构的新概念.目前,我有时会想到我必须区分调用begin(range)和begin(*range)类型持有对集合的引用作为指针.我想是否总是为我自己的集合类型提供指针的开始/结束重载是一个好主意.
struct Container {
int values[3];
};
const int* begin(const Container& c);
const int* end(const Container& c);
const int* begin(const Container* c);
const int* end(const Container* c);
template<typename Range>
int Sum(const Range& range)
{
return std::accumulate(begin(range), end(range), 0);
}
int main(void)
{
Container c = {1, 2, 3};
std::cout << Sum(c);
std::cout << Sum(&c);
}
Run Code Online (Sandbox Code Playgroud)
如果这是一个好主意,为什么不为此提供一个模板:
template<typename Range>
auto begin(const Range* r) -> decltype(begin(*r)){
using std::begin;
return begin(*r);
}
template<typename Range>
auto end(const …Run Code Online (Sandbox Code Playgroud) 通常我在struct和class之间选择不是因为内存问题而是因为类型的语义.我的一些值类型具有相当大的内存占用,有时太大而无法一直复制此数据.所以我想知道总是通过引用传递不可变值对象是不是一个好主意?由于对象是不可变的,因此不能通过引用接受它们的方法进行修改.通过参考传递时是否还有其他问题?
我正在阅读有关创建性设计模式的文章,并设法在 Factory 、 Abstract Factory 和 Factory 方法之间完全混淆了自己。
我在下面发布了一个代码片段。有人愿意让我知道这是哪一个以及(如果可能)可以对代码进行哪些更改以使其属于其他类别?
#include "iostream.h"
#define QUIT 2
class Shape {
public:
virtual void draw() = 0;
};
class Circle : public Shape {
public:
void draw() {
cout << "circle : draw" << endl;
}
};
class Square : public Shape {
public:
void draw() {
cout << "square : draw" << endl;
}
};
class Factory {
public:
virtual Shape* createInstance(int id) = 0;
};
class SimpleShapeFactory : public Factory {
public: …Run Code Online (Sandbox Code Playgroud) 我想为数组中的多个字段和元素字段创建文本索引.目前我将数组元素的路径定义为字符串,这是有效的.有没有办法像我可以对这样的简单字段一样使用表达式:
var textIndex = Builders<Project>.IndexKeys
.Text(p => p.Name)
.Text(p => p.Description)
// This and any other expression I tried does not work
//.Text(p => p.System.Elements.SelectMany(e => e.Name))
// But this works fine:
.Text("system.elements.name");
await collection.Indexes.CreateOneAsync(textIndex);
Run Code Online (Sandbox Code Playgroud)
我正在使用mongodb 3.2和MongoDB.Driver 2.2.2