我目前正在将CSRF保护实施到我的框架(PHP)中.
不过我想知道:
攻击者是否有可能将我的页面加载到(隐藏的)iframe(获取令牌)并使用JavaScript更改某些数据?
之后提交表格?
我用,
其中,我使用内置安全令牌来防范CSRF攻击.
<s:form namespace="/admin_side"
action="Category"
enctype="multipart/form-data"
method="POST"
validate="true"
id="dataForm"
name="dataForm">
<s:hidden name="%{#attr._csrf.parameterName}"
value="%{#attr._csrf.token}"/>
</s:form>
Run Code Online (Sandbox Code Playgroud)
它是其中CSRF令牌是不可用的,除非春季安全多部分请求MultipartFilter连同MultipartResolver被适当地配置成使得所述多请求由弹簧处理.
MultipartFilterin web.xml配置如下.
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml
/WEB-INF/spring-security.xml
</param-value>
</context-param>
<filter>
<filter-name>MultipartFilter</filter-name>
<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
</filter>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>MultipartFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>AdminLoginNocacheFilter</filter-name>
<filter-class>filter.AdminLoginNocacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AdminLoginNocacheFilter</filter-name>
<url-pattern>/admin_login/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>NoCacheFilter</filter-name>
<filter-class>filter.NoCacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>NoCacheFilter</filter-name>
<url-pattern>/admin_side/*</url-pattern> …Run Code Online (Sandbox Code Playgroud) 我在春天的这个CSRF(跨站点请求伪造)保护中很少混淆.不,我有我的jsp和我的控制器和一个Web服务.我想要做的是在Web服务级别验证令牌,如果令牌匹配,则运行Web服务(在我的情况下执行数据库插入)
JSP文件
<form:input type="text" class="form-control" path="mName" />
<input type="hidden" name="${_csrf.parameterName}"
value="${_csrf.token}" />
<div class="form-action">
<input type="submit" value="Save" class="btn btn-primary" />
</div>
</form:form>
Run Code Online (Sandbox Code Playgroud)
我也插入了隐藏标签.现在我该怎么做来验证这个令牌.我在那里迷路了.
在控制器类中,我获取从表单到对象的值,并调用Web ervise来保存数据
@RequestMapping(method = RequestMethod.POST)
public String processForm(@ModelAttribute(value = "userForm") @Valid UserForm userForm, BindingResult result, ModelMap model) {
//call the web service
}
Run Code Online (Sandbox Code Playgroud) 我在Spring MVC项目中使用Spring Security集成了CSRF令牌.使用CSRF令牌一切正常,令牌将从客户端发送到服务器端.
我已经改变了我的logout进程,使其成为POST发送CSRF令牌的方法,并且其工作正常.
发生会话超时时我遇到问题,需要将其重定向到弹出默认注销URL,但它会为我Access Denied提供该URL.
如何覆盖此行为.
我在安全配置文件中包含以下行
<http>
//Other config parameters
<csrf/>
</http>
Run Code Online (Sandbox Code Playgroud)
如果有人需要更多信息,请告诉我.
我对网络安全性很陌生,当我阅读更多关于不同攻击媒介的内容时,我的头脑很难说它们首先被允许.这就像网络设计的破坏安全模型一样容易受到攻击.
我也对模糊和不精确的信息感到惊讶.例如,起初单原始策略听起来不错,然后我读到它只适用于XHR,哦,顺便说一句,实际上并没有阻止XHR跨源POST,这是典型的CSRF攻击.很高兴我继续读.
还有一个Origin头,服务器可以使用它来确保请求来自正确的位置 - 但是oops,它在浏览器中设置不一致,如果没有设置,你不能确定它是否是是因为同源请求,还是某些浏览器没有得到它的请求类型(可能是IMG标签?).继续阅读.
因此,正确的方法似乎是在会话cookie中设置CSRF令牌,并将该令牌添加到表单/链接,然后在提交时将它们与服务器端进行比较.从理论上讲(并且为了这个问题而排除所有XSS攻击),来自另一个选项卡的CSRF尝试可能会对包含cookie的表单发出POST请求,但没有将表单输入元素设置为匹配令牌(因为它无法从cookie中读取令牌,因此服务器将拒绝该请求.工作但kludgy,并确保你永远不会忘记检查!
记住这一想法一秒钟,这是我的问题 - 为什么浏览器在一个请求中发送会话cookie,该请求来自不是cookie的起源的页面?
我的意思是,浏览器会拒绝将Cookie发送到不同的域名,但是很高兴从不同的来源发送它们?如果他们没有,会破碎吗?它是否是对CSRF的强大防御,只需要服务器做他们正在做的事情 - 检查有效的会话cookie?
编辑:也许这是改善情况的尝试?https://tools.ietf.org/html/draft-west-origin-cookies-01
我有用Symfony 2.8.11和FosUserBundle 2.0.0-beta1编写的应用程序.用户可以通过VPN或基本身份验证连接到站点.大多数情况下,他们在Windows 7上使用Internet Explorer 11.其中一些在站点内以随机形式遇到无效的CSRF令牌问题.问题是用户无法提交表单,即使刷新页面几次也是如此.
我怀疑问题是由日志中的会话持续刷新引起的:
{
"created":1483610056,
"lastUsed":1483610056
} ["csrf","session_times"] []
Run Code Online (Sandbox Code Playgroud)
此外,我怀疑它是由记住我令牌的身份验证引起的(每个问题都已被该令牌验证):
[2017-01-05 10:54:16] security.DEBUG: Remember-me cookie detected. [] []
[2017-01-05 10:54:16] security.INFO: Remember-me cookie accepted. [] []
[2017-01-05 10:54:16] security.DEBUG: Populated the token storage with a remember-me token. [] []
Run Code Online (Sandbox Code Playgroud)
我的安全配置:
...
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_token_generator: security.csrf.token_manager
# if you are using Symfony < 2.8, use the following config instead:
# csrf_provider: form.csrf_provider
logout: true
anonymous: true
remember_me:
name: "%session_cookie_remember_name%"
domain: "%session_cookie_domain%"
key: "%secret%" …Run Code Online (Sandbox Code Playgroud) 我正在开发一个Web API.身份验证是通过cookie.所有端点都JSON在请求正文中接收参数.
我是否需要实施CSRF token保护它们?这怎么可以被利用?是否可以通过普通<form>元素发送JSON ?
攻击者有可能拥有这样的东西吗?
<form type="application/json" method="POST">
<input name="json" value="{ my json code here }">
<input type="submit">Send</input>
<form>
Run Code Online (Sandbox Code Playgroud) 我有一个nginx服务器提供纯HTML和JS文件.
然后,js代码从API服务器调用各种REST API到GET/POST数据.
如果nginx收到对/ api/location的请求,它会将请求转发给另一个处理所有API的服务器.这个api服务器是用Ruby on Rails构建的.
由于我的所有纯HTML页面都是由nginx直接提供的,因此在呈现时我无法进行服务器端会话.
我该怎么做才能防止CSRF攻击?
我正在使用最新版本的 Django 和 Django Rest Framework。我的 Web 应用程序提供了一个当前仅由前端使用的 API。
我正在使用相同的 API 路由创建 chrome 扩展。
当我使用本地服务器runserver 命令时,我没有问题。当服务器在 HTTPS 后面运行时,我始终有 403 错误。
{"detail":"CSRF Failed: Referer checking failed - no Referer."}
Run Code Online (Sandbox Code Playgroud)
我使用的视图如下:
@method_decorator(csrf_exempt, name='dispatch')
class ObtainAuthToken(APIView):
permission_classes = (AllowAny,) #maybe not needed in your case
def post(self, request):
username = request.POST['username'].lower()
password = request.POST['password']
user = authenticate(username=username, password=password)
payload = dict()
if user is not None:
token, created = Token.objects.get_or_create(user=user)
payload['token'] = token.key
payload ["success"] = True
else:
payload['error'] = "Credentials …Run Code Online (Sandbox Code Playgroud) django ajax google-chrome-extension django-csrf csrf-protection
在阅读了CSRF保护在Rails中的工作原理后,我尝试通过执行以下操作来触发CSRF保护:
注意:我们正在使用基于cookie的会话。
我期望这会失败,因为第二个选项卡生成了一个新的,不同的CSRF令牌。提交登录表单时,提交给服务器的令牌不应该是旧的,陈旧的令牌吗?
但是,这确实有效:
在这种情况下,我得到一个InvalidAuthenticityToken异常。为什么?
csrf-protection ×10
csrf ×6
security ×3
php ×2
spring ×2
spring-mvc ×2
ajax ×1
api-design ×1
architecture ×1
django ×1
django-csrf ×1
java ×1
session ×1
struts2 ×1
symfony ×1
web ×1
xss ×1