其他

无效的CSRF令牌

GeoNetwork有一个防止CSRF攻击的安全过滤器。查看有关此类攻击的详细信息https://www.owasp.org/index.php/Cross-Site_Request_伪造_(CSRF)。所有调用POST、DELETE和PUT端点时,如果没有适当的标记,将返回一个错误。

../_images/csrf2.png

默认情况下,所有AngularJS请求都将处理此令牌,但所有第三方api和自定义用户界面调用都必须手动将此令牌添加到请求中。令牌存储在名为XSRF-token的cookie中。这个cookie构造一个字符串,该字符串必须通过名为“_csrf”的参数或名为X-XSRF-TOKEN的头添加到所有请求中。

../_images/csrf1.png

使用curl的CSRF调用示例

首先,调用POST端点以获取会话和csrf

$rm -f /tmp/cookie; curl -c /tmp/cookie http://localhost:8080/geonetwork/srv/eng/info?type=me -X POST ; cat /tmp/cookie

   <html>
   <head>
   <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
   <title>Error 403 Expected CSRF token not found. Has your session expired?</title>
   </head>
   <body><h2>HTTP ERROR 403</h2>
   <p>Problem accessing /geonetwork/srv/eng/info. Reason:
   <pre>    Expected CSRF token not found. Has your session expired?</pre></p><hr><a href="http://eclipse.org/jetty">Powered by Jetty:// 9.3.9.v20160517</a><hr/>

</body>
</html>
# Netscape HTTP Cookie File
# https://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

localhost       FALSE   /geonetwork     FALSE   0       XSRF-TOKEN      3825c5f1-49b3-4c62-bc3a-1916d5872d02

然后,使用cookie和令牌,您可以做任何您想做的事情:

 $curl -v -X POST "http://localhost:8080/geonetwork/srv/eng/info?type=me" -H "X-XSRF-TOKEN: 3825c5f1-49b3-4c62-bc3a-1916d5872d02" --user admin:admin -b /tmp/cookie
*   Trying ::1...
  * TCP_NODELAY set
    * Connected to localhost (::1) port 8080 (#0)
      * Server auth using Basic with user 'admin'
        > POST /geonetwork/srv/eng/info?type=me HTTP/1.1
        > Host: localhost:8080
        > Authorization: Basic YWRtaW46YWRtaW4=
        > User-Agent: curl/7.52.1
        > Accept: */*
        > Cookie: XSRF-TOKEN=3825c5f1-49b3-4c62-bc3a-1916d5872d02
        > X-XSRF-TOKEN: 3825c5f1-49b3-4c62-bc3a-1916d5872d02
        >
        < HTTP/1.1 200 OK
        < Date: Wed, 17 May 2017 08:52:05 GMT
        * Added cookie JSESSIONID="1na1v7dpu7d7bcsnelvh0vnvn" for domain localhost, path /geonetwork, expire 0
          < Set-Cookie: JSESSIONID=1na1v7dpu7d7bcsnelvh0vnvn;Path=/geonetwork
          < Expires: Thu, 01 Jan 1970 00:00:00 GMT
          * Added cookie serverTime="1495011125647" for domain localhost, path /, expire 0
            < Set-Cookie: serverTime=1495011125647;Path=/
            * Added cookie sessionExpiry="1495011125647" for domain localhost, path /, expire 0
              < Set-Cookie: sessionExpiry=1495011125647;Path=/
              < Content-Type: application/xml; charset=UTF-8
              < Pragma: no-cache
              < Cache-Control: no-cache
              < Expires: -1
              < Transfer-Encoding: chunked
              < Server: Jetty(9.3.9.v20160517)
              <
              <?xml version="1.0" encoding="UTF-8"?>
              <info>
                <me authenticated="true">
                  <profile>Administrator</profile>
                  <username>admin</username>
                  <id>1</id>
                  <name>admin</name>
                  <surname>admin</surname>
                  <email />
                  <organisation />
                  <hash />
                </me>
              <env>
              <baseURL>/geonetwork</baseURL>
              <node>srv</node>
            </env>
          </info>

* Curl_http_done: called premature == 0
  * Connection #0 to host localhost left intact

使用H2数据库

重要

以下说明仅用于检查数据库以排除故障,因为使用此方法可能会损坏数据库。在做任何更改之前,请先备份!

如果您使用的是默认的嵌入式H2数据库,并且需要检查表,那么可以使用图形用户界面进行检查。两个已经过测试的是:

以下方法使用h2工具。

查找Geonetwork数据库

这叫做 gn.h2.db . 位置取决于您使用的web服务器以及数据目录的位置。见 配置数据库 更多信息。注意,在windows上,您需要使用表单的路径 driveletter/path/to/gn.h2.db .

使用H2工具

从下载独立于平台的zip文件http://www.h2database.com/html/download.html打开/取出。在命令提示下,更改到以下目录:

h2/bin

请注意,使用附带的bat或shell脚本访问数据库似乎会显示错误,因此建议使用命令提示符方法。

记下数据库的URL。其形式如下:

jdbc:h2:path/to/gn

注释不包括 .h2.db 在路的尽头。

键入以下命令以访问该工具:

java -cp h2*.jar org.h2.tools.shell

你将被要求提供网址,你在上面做了一个记录。默认凭据为:

  • 用户名:www data

  • 密码:www data

您可能需要执行以下操作之一:

  • 关闭GeoNetwork

  • 删除锁定文件 gn.lock.db

  • 授予对的写权限 gn.h2.db

成功连接后,您将看到如下提示,您可以在其中输入SQL命令。以分号结尾。

sql>

一个有用的命令引用可以在http://www.h2database.com/html/commands.html

要离开工具,请键入 quit 然后按回车键。