2016年9月26日星期一

2016年9月23日星期五

csrf(跨站请求伪造)流程

1。用户正常登录了正规网站A。产生了cookie。
2。用户没退出的情况时,访问了网站B。B的页面里面,有网站A的连接,比如http://www.a.com/xxx,比如<img src="http://www.a.com/xxx/yyy"/>
3。用户往往B的他页面时,会去访问A,访问A时也会带上A的cookie,由于cookie是正常的,A会认为是一个合法的请求,进而进行处理。自然B网站也可以搞自动post等背后动作,只要cookie有效。

对于这样的情况,网站A的可以检查http_Referer来判断,但是referer也是可以伪造的,不保险。
所以有效的还是在form里面,埋入token。

spring security里面的csrf对策,就是埋入token,来检测请求的有效性。但是,一旦启用了csrf,就必须用到session。有没有不用session的csrf的检测方法呢?
【仔细看了文档,spring也可以将csrf写入cookie里,来做到stateless,CookieCsrfTokenRepository】


考虑到的方法有,写cookie,cookie里面埋入token,并且form里面也埋入hash过的token。服务器端来比较两个token是否一样。这里用到的原理是,第三方网站(比如上面的B)没法获取A的cookie【也是理论上的】,所以B的页面的form里面,也就没法埋入A的cookie了。

 http://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html
的文档里面,描述了为啥没用CookieCsrf作为默认而用Session作为默认的原因。如果要用session,那么普通的rest也就是有状态了,所有的请求都需要提交csrf字段。
 
https://www.blogger.com/blogger.g?blogID=8899947124180453470#editor/target=post;postID=327728104436759904

如果cookie泄漏了怎么办?XSS(跨站脚本攻击)手法是可以偷cookie的。
 怎么偷,首先,网站得是一个可以运行人发言的网站,比如论坛。A在发言代码里面嵌入javascript,如果网站没有做处理,照本显示,那么B浏览网站时就会执行A嵌入的代码。由于是网站页面自身的script,script就可以拿到B的cookie了,自然也可写script将偷来的cookie发给A。
spring security里面对xss,没有特别的招,就是3个encoding。
1。ouput文字的时候,html encoding
2。 ouput javascript的时候,javascript encoding
3。事件绑定时,handler encoding。

2016年9月21日星期三

spring oauth2,不用config,用xml

http://www.cnblogs.com/tinkerz/p/3759796.html

https://github.com/spring-projects/spring-security-oauth/blob/114fbd44beef0382009f207c08f0b1d9c24e95a9/samples/oauth2/sparklr/src/main/webapp/WEB-INF/spring-servlet.xml

https://github.com/cloudfoundry/uaa/blob/master/samples/api/src/main/webapp/WEB-INF/spring-servlet.xml


http://blog.csdn.net/monkeyking1987/article/details/16828059

http://wwwcomy.iteye.com/blog/2230265

https://gist.github.com/ddewaele/6411612

2016年9月16日星期五

查看进程的运行环境

strings –a /proc/<pid_of_the_process>/environ


https://blogs.oracle.com/myoraclediary/entry/how_to_check_environment_variables

2016年9月14日星期三

ftp的文件名乱码

vsftpd的文件上载后乱码,自然,可以设置ftp客户端的设定,设置为utf8,但是这得告诉别人这么去设置,需要找个法子,设置自然而然转码的的功能,查到vsftpd没这个功能,虽然以前有人做了patch,非官方的。
找到了proftpd,
设置UseEncoding UTF-8 CP932 strict,就可以了。


2016年9月5日星期一

org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug

这个一直输出,就算定义了
    <logger name="org.apache.ibatis.logging.jdbc.BaseJdbcLogger">
        <level value="info" />
    </logger>
也没用,查了一下,

别人也遇到这个问题,
http://stackoverflow.com/questions/27772563/why-mybatis-force-prints-log4j-debug-info-to-the-console

解决法子是将mapper的logger定义为info就可以。
看BaseJdbcLogger的源码,可以知道里面的log不是自己的,而是构造函数里面传递进去的
protected Log statementLog;

  public BaseJdbcLogger(Log log, int queryStack) {
    this.statementLog = log;
    if (queryStack == 0) {
      this.queryStack = 1;
    } else {
      this.queryStack = queryStack;
    }
  }
这就是原因了。

这里也碰到一个问题,就是loggername是否支持wildchar的事情
因为我的mapper不是在一个包下,而是在各个repository自己的目录下,比如,没有这样的定义
    <logger name="xiu.domain.repository.*.*Mapper">
        <level value="info" />
    </logger> 
找了找,发现logback有filter功能,于是这样来搞
http://logback.qos.ch/manual/filters.html

         <filter class="ch.qos.logback.core.filter.EvaluatorFilter">  
          <evaluator>          
            <matcher>  
              <Name>mapper</Name>     
              <regex>xiu\.domain\.repository\..+\.\w*Mapper</regex>  
            </matcher>                 
            <expression>mapper.matches(logger)</expression>  
          </evaluator>  
          <OnMismatch>NEUTRAL</OnMismatch>  
          <OnMatch>DENY</OnMatch>  
        </filter>  

2016年9月3日星期六