小编met*_*att的帖子

为什么在CSR中放置CSRF预防令牌很常见?

我试图了解CSRF的整个问题以及预防它的适当方法.(资源我已阅读,理解并同意:OWASP CSRF预防报告表,关于CSRF的问题.)

据我了解,CSRF的漏洞是通过假设(从网络服务器的角度来看)传入HTTP请求中的有效会话cookie反映经过身份验证的用户的意愿而引入的.但是,原始域的所有cookie都被浏览器神奇地附加到请求上,因此实际上所有服务器都可以通过请求中存在的有效会话cookie来推断该请求来自具有经过身份验证的会话的浏览器; 它无法进一步假设该浏览器中运行的代码,或者它是否真正反映了用户的意愿.防止这种情况的方法是在请求中包含其他身份验证信息("CSRF令牌"),这些信息由浏览器的自动cookie处理以外的某些方式携带.然后,松散地说,会话cookie验证用户/浏览器,并且CSRF令牌验证在浏览器中运行的代码.

简而言之,如果您使用会话cookie来验证Web应用程序的用户,您还应该为每个响应添加一个CSRF令牌,并在每个(变异)请求中要求匹配的CSRF令牌.然后,CSRF令牌从服务器到浏览器进行往返回服务器,向服务器证明发出请求的页面是由该服务器批准(甚至由该服务器生成).

关于我的问题,这是关于在该往返中用于该CSRF令牌的特定传输方法.

看起来很常见(例如在AngularJS,Django,Rails中)将CSRF令牌从服务器发送到客户端作为cookie(即在Set-Cookie头中),然后让客户端中的Javascript将其从cookie中删除并附加它作为单独的XSRF-TOKEN标头发送回服务器.

(另一种方法是由例如Express推荐的方法,其中由服务器生成的CSRF令牌通过服务器端模板扩展包含在响应主体中,直接附加到将其提供回服务器的代码/标记,例如作为一个隐藏的表单输入.这个例子是一个更多的Web 1.0-doh的做事方式,但是可以很好地推广给更多JS的客户端.)

为什么使用Set-Cookie作为CSRF令牌的下游传输是如此常见/为什么这是一个好主意?我想所有这些框架的作者都仔细考虑了他们的选择,并没有弄错.但乍一看,使用cookie解决基本上对cookie的设计限制似乎很愚蠢.实际上,如果您使用cookie作为往返传输(Set-Cookie:服务器的下游标头告诉浏览器CSRF令牌,而Cookie:上游标题,浏览器将其返回给服务器)您将重新引入漏洞正试图解决.

我意识到上面的框架不会使用cookie来进行CSRF令牌的整个往返; 他们使用Set-Cookie下游,然后在上游使用其他东西(例如X-CSRF-Token标头),这确实可以关闭漏洞.但即使使用Set-Cookie作为下游传输也可能具有误导性和危险性; 浏览器现在将CSRF令牌附加到每个请求,包括真正的恶意XSRF请求; 充其量只会使请求变得比它需要的更大,而在最坏的情况下,一些善意但误导的服务器代码实际上可能会尝试使用它,这将是非常糟糕的.此外,由于CSRF令牌的实际预期接收者是客户端Javascript,这意味着此cookie不能仅使用http保护.因此,在Set-Cookie标头中向下游发送CSRF令牌对我来说似乎非常不理想.

security cookies csrf owasp web

248
推荐指数
3
解决办法
10万
查看次数

Maven 3.1的项目时间表在哪里?

我迫不及待地想要Maven 3的一个特性是自动父版本化,也就是说,不再需要在每个子pom.xml中对父版本进行硬编码.

这个功能显然是在Maven 3.1中出现的,但Maven 3.1何时到来?讽刺的是,如果我周围的网上搜索,我(实例发现许多参考这里,这里这里)如何在Maven的3.0顶级功能之一是versionless父元素,但它实际上是在Maven的3.1的到来.我发现Maven 3.1的唯一实质性提及是这些相同的文章,实际上大约是3.0.

即使是对maven.apache.org上的3.1的google查询也没有任何有用的信息.

哪些是即将发布的Apache项目的项目计划和时间表的首选地点; 为什么全世界都知道Maven 3.1中的功能,但我找不到路线图或时间表; 是否存在Maven 3.1的时间表?

roadmap maven-3 maven

21
推荐指数
1
解决办法
5601
查看次数

当git使用一些共享历史记录重新定义两个分支时,是否有一种简单的方法可以使共同历史保持常见?

假设我们有以下修订图:

A-X-Z--B
     \
      \-C
Run Code Online (Sandbox Code Playgroud)

在B和C之前使用A.进一步假设我从上游重新绑定A,创建一个新的提交A*,然后将B和C重新绑定到A*上.生成的修订图如下:

A*-X'-Z'-B
 \
  \-X"-Z"-C
Run Code Online (Sandbox Code Playgroud)

请注意,不再共享共享历史记录.有没有一种简单的方法可以解决这个问题,除了说,重新定义B然后明确地将C重新定位到Z'.换句话说,是否有更好的方法可以同时自动修改多个分支以保留共享历史记录?只是人为地在分割点放置一个标记,或者手动检查图形以找出修改C以保留共享历史记录的提交的sha1似乎有点尴尬,更不用说开放可能性了错误,特别是因为我必须在每次改变时都这样做,直到我检查上游分支的变化.

git git-rebase

19
推荐指数
1
解决办法
6396
查看次数

如何使用eclipse + m2eclipse防止重复的servlet jar

我正在使用Eclipse + Maven + m2eclipse在Apache Tomcat中构建和测试Web应用程序.

我在Eclipse中配置了Tomcat服务器,并为我的Web应用程序配置了部署程序集,包括"Maven Dependencies"(Java Build Path Entries专业化).

当我部署并启动服务器时,Tomcat/Catalina总是警告我:

INFO:validateJarFile(/projects/src/main/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/webapp/WEB-INF/lib/servlet-api-2.5.jar) - 罐子没装.请参阅Servlet规范2.3,第9.7.2节.违规类:javax/servlet/Servlet.class

这是因为m2eclipse将servlet-api-2.5视为我项目的依赖项,并将其视为"Maven依赖项"的一部分,并将其作为部署程序集的一部分进行复制,但Tomcat servlet容器有自己的副本,并且不喜欢在课程路径上看到2个副本.

我在我的pom.xml中标记了从我的项目到servlet-api-2.5的依赖关系

<scope>
provided
</scope>
Run Code Online (Sandbox Code Playgroud)

这确实阻止了独立的Maven将servlet-api-2.5打包到我的构建中,但m2eclipse并没有这样看.

(这不是一个大问题,因为警告是无害的,我只在IDE内部测试期间看到它,真正的客户不会看到它,但我仍然想知道如何解决它,因为我喜欢清洁和我喜欢知道事情是如何运作的.)

有没有一种正确的方法告诉m2eclipse不要部署这个文件,或告诉Eclipse不要让m2eclipse对哪些依赖项是运行时依赖项有最终决定权?

我找到https://issues.sonatype.org/browse/MNGECLIPSE-1193其中提到

"Maven Dependencies"容器反映了测试编译时间范围,因此它应该具有范围"提供"的依赖项

m2eclipse maven

14
推荐指数
3
解决办法
2万
查看次数

Flask/Werkzeug调试器,进程模型和初始化代码

我正在使用Flask编写Python Web应用程序.我的应用程序在启动时建立与另一台服务器的连接,并在后台定期与该服务器通信.

如果我不使用Flask的内置调试器(使用debug = False调用app.run),没问题.

如果我使用内置调试器(使用debug = True调用app.run),Flask将使用相同的代码启动第二个Python进程.这是子进程最终监听HTTP连接,并且通常表现得像我的应用程序一样,并且我认为父进程只是在调试器启动时监视它.

然而,这会对我的启动代码造成严重破坏,该代码在两个进程中运行; 我最终得到了2个与外部服务器的连接,2个进程记录到同一个日志文件,一般来说,它们相互绊倒.

我认为在调用app.run()之前我不应该做真正的工作,但是我应该把这个初始化代码放在哪里(我只希望每个Flask进程组运行一次​​,无论调试器模式如何,但是哪个需要在启动时运行并独立于客户端请求)?

我发现这个问题关于"Flask自动重载和长期运行的线程"有些相关,但有些不同,答案对我没有帮助.(我也有一个单独的长时间运行的线程标记为守护程序线程,但它在重新加载器启动时被杀死,但我想解决的问题是在重新加载需要发生之前.我不关心重新加载;我关注额外的进程,以及避免在父进程中执行不必要的代码的正确方法.)

python wsgi werkzeug flask

8
推荐指数
1
解决办法
2198
查看次数

如何使用.vsprops文件覆盖MS Visual Studio中的VC++目录

我想覆盖Visual Studio(devenv.exe)用于编译器和库路径的目录.我知道如何通过工具 - >选项 - > VC++目录以交互方式执行此操作,但我想自动执行此操作.

http://msdn.microsoft.com/en-us/library/t9az1d21(VS.80).aspx对此有一个诱人的说明:"如果你想设置可以共享的目录搜索路径(对于你的项目)通过其他用户或可以跨多台计算机应用,Visual C++提供了通过项目属性表使用此对话框的替代方法.有关更多信息,请参阅属性表(C++).

如果您按照Property Sheets文档的链接,有关于该机制的大量信息,但没有关于您需要设置的实际属性的信息.

我在%LocalAppData%\ Microsoft\VisualStudio\8.0\VCComponents.dat(对于VS 2005,对于VS 2008)中找到了由VC++目录对话框填充的信息; 它似乎在VC\VC_OBJECTS_PLATFORM_INFO\win32 \目录和...\x64 \目录下设置了各种属性.

有没有人以前做过这个,知道映射是从VCComponents.dat中使用的属性名到.vsprops文件中使用的名称是什么?

我希望这能在VS2005,VS2008和VS2010中工作.

在VS2010中,Microsoft完全取消了"视图选项"下的"VC++目录"对话框,按照项目进行了操作,现在您将获得一个交互式UI,用于在"项目属性"中编辑这些目录而不是"视图选项"; 这也意味着在属性管理器中有一个UI; 那么如果你想按照机器而不是像以前那样对每个机器进行更改,你只需按照你想要的方式设置一个属性表,并使你的所有项目继承.这听起来像是对旧方式的重大改进.并且直接做我想做的事情.但仅限于VS2010.

但是,VS2005和VS2008没有UI在项目或属性表中设置这些属性; 我很高兴手工完成,但我不知道它应该是什么样的!

这是一个空的VS 2005 .vsprops文件:

<?xml version="1.0"?>
<VisualStudioPropertySheet
    ProjectType="Visual C++"
    Version="8.00"
    Name="pathSettings"
    >
</VisualStudioPropertySheet>
Run Code Online (Sandbox Code Playgroud)

我安装了VS 2010并使用其整洁的新GUI在搜索目录中进行更改; 它看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ImportGroup Label="PropertySheets" />
  <PropertyGroup>
    <ExecutablePath>C:\Test;$(PATH)</ExecutablePath>
  </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

但是,这在VS2005中不会逐字逐句 - VS2005拒绝加载它(抱怨没有找到DTD /架构声明).

我把它插入容器中,响应于VS2005根据父元素'VisualStudioPropertySheet'的内容模型告诉我"Element'PropertyGroup'是意料之外的.期待:Tool,UserMacro." 工具和UserMacro是MSDN页面中示例中显示的唯一内容[drat - StackOverflow不会让我作为新用户在这里添加超链接 - 首先是'属性表工具usermacro'的Google搜索结果] - 也许那些VS2005属性表中唯一合法的东西?

visual-studio-2005 visual-studio-2008 visual-c++

6
推荐指数
1
解决办法
9936
查看次数

为什么maven只识别已安装的POM文件的依赖项?

我有一个Maven项目,其中一个子项目(A)想要依赖另一个使用"pom"包装的子项目(B).

如果我以直截了当的方式执行此操作,其中A指定对B的依赖<type>pom</type>,如果我执行"mvn install",则事情会完美运行,但如果我在安装之前运行任何阶段,例如mvn compilemvn package,则在尝试构建A时失败:它在存储库中寻找B的pom,并没有找到它.

我真的不希望这个pom存储在存储库中,因为它是我们的活动源代码的一部分并经常更改.

对于我们构建的所有jar包装项目,似乎可以很好地将它们从存储库中移除,构建mvn package,并且Maven知道如何在源代码中找到所有依赖项并构建它管理的树而无需求助于存储库; 但是对于pom打包的项目,它总是想要去存储库.

我在尝试理解这一点时学到了几件事:

  • Maven最佳实践鼓励您使用pom打包项目对依赖项进行分组,但在POM项目中添加了"mvn install"步骤
  • Maven生命周期文档说"一个纯粹的元数据项目(包装价值是pom)只会将目标绑定到安装和部署阶段"; 也许这就是为什么POM项目作为依赖目标是不可见的,除非我调用安装阶段?我尝试将编译器插件绑定到编译阶段,这似乎没有帮助.

有没有办法可以将POM子项目指定为同一父项目中另一个子项目的依赖项,而无需将POM项目安装到存储库?

maven

6
推荐指数
1
解决办法
1559
查看次数

如何在gdb中打印Java数组?

我用gcj-4.4和-o选项编译了一个非常简单的java程序.我在gdb-7.2中加载它并尝试进行一些调试.我注意到我可以在int类型中打印变量,但我无法打印int数组.我收到此错误消息:

(gdb) p orderFinish[0]
cannot find java.lang.Object
(gdb) p (int)orderFinish
$8 = -136261440
(gdb) p orderFinish[3]
cannot find java.lang.Object
(gdb) p in
$9 = 1
(gdb) whatis orderFinish 
type = int[]
Run Code Online (Sandbox Code Playgroud)

所以我的问题是如何在gdb中打印Java数组?我的操作系统是openSUSE-11.1 x64-86bit.谢谢!

java gdb gcj

5
推荐指数
1
解决办法
325
查看次数

Angular:如何在app.config之后获取$ routeProvider

我试图在我的一个控制器中访问$ routeProvider以添加路由.我怎么做?

function Cont($scope,$routeProvider) {

};
Run Code Online (Sandbox Code Playgroud)

这对我不起作用; 我正进入(状态:Error: Unknown provider: $routeProviderProvider <- $routeProvider

angularjs

5
推荐指数
1
解决办法
4778
查看次数

Angular 模板调用函数可以返回承诺吗

Angular 的 $q 文档说“$q 承诺被 angular 中的模板引擎识别,这意味着在模板中,您可以将附加到范围的承诺视为结果值。”

Angular 的视图模板还允许您评估表达式,这意味着您可以调用从作用域公开的函数。

我发现视图模板能够引用真实值、承诺(最终解析为真实值)或返回真实值的函数,但不能引用返回承诺的函数,它们总是呈现{}到视图模板中。

用这个例子创建了一个小提琴

谁能做得更好或引导我朝着正确的方向前进?

(也许在视图模板中使用函数是个坏主意;这种技术还有其他问题,因为 Angular 观察函数无法在不调用函数的情况下判断它是否发生了变化,所以被观察的函数在每个摘要周期都会被评估。我已经看到这两个 问题,并且在这两个问题中,推荐的答案是使用 promise.then 来更改作用域上的正常属性,并让视图模板监视正常属性而不是 promise。我明白了,但是对于我的使用,我想提供一些参数来计算一个值,并且直接在视图模板中提供这些参数很方便。基本上我试图在FlaskRails 中编写类似 url_for 的东西。)

javascript promise angularjs

5
推荐指数
1
解决办法
1万
查看次数