1

关于 HTTP POST 方法的安全问题:

我创建了一个名为“MyAPP”的用户:

 {
    "userdef": [
        "view",
        "create"
    ],
    "api_key": "dzn8k7hj2sdgddlvymfmefh1k2ddjl05",
    "user_id": "MyAPP",
    "name": "MyAPP",
    "creator": "admin",
    "edit": [],
    "dbdef": [
        "view",
        "create"
    ],
    "querydef": [
        "view",
        "create"
    ],
    "databases": {
        "Gaming": {
            "dbuser": "mydbuser_here",
            "dbpass": "mypass_here"
        }
    },
    "password": 

"$6$rounds=665736$x/Xp0k6Nj.5qzuM5$G.3w6Py1s.xZ83RHDU55qonNMpJe4Le8nD8PqjYKoOtgbab7T22knJPqwHspoT6BQxp.5gieLFuD0SdD9dyvi/",
        "email": "",
        "view": []
}

然后我想发出一个 POST 以执行 SQL Pass-thru,如下所示:

http:///query/InsertBestScore/Score/99/ScreenName/GollyGolly.xml?apikey=dzn8k7hj2sdgddlvymfmefh1k2ddjl05

我在其中构建了一个查询并将其命名为“InsertBestScore”:插入 Gaming.Leaderboard(ScreenName,Score)值(:ScreenName,:Score);

如果我使用 POST 方法通过 POSTMAN 运行它:...然后我可以访问, 403 :

<?xml version="1.0" encoding="utf-8"?>
<SlashDB>
    <http_code>403</http_code>
    <description>Access was denied to this resource. Please log in with your username/password or resend your request with a valid API key.</description>
    <url_template>/query/InsertBestScore/Score/{Score}/ScreenName/{ScreenName}.xml</url_template>
</SlashDB>

此外,我将从应用程序调用此 POST(或 PUT)请求,在我的例子中,是从 AWS Lambda 函数中运行的 Python 程序。

现在,我在文档中遇到了这个:

两个参数 API 密钥 SlashDB 还允许在此身份验证方法中使用两个参数凭据 - 应用程序 ID 和 api 密钥。这在与 3Scale 等 API 管理系统集成时可能会派上用场。默认情况下,标头和查询字符串参数为:

•   appid - identifies certain application
•   apikey - secret for the application
Request with API key in header - Access granted

...但是在上面的示例中,我看不到 appid 发挥作用的地方。你能告诉我如何调用 SlashDB 端点并传递 APIkey 并确保用户 ID 被称为 MyAPP。

因此,总而言之,文档提到: • 另一个应用程序使用 API 密钥进行身份验证,该密钥随每个请求一起发送。该应用程序被识别为 SlashDB 用户 App2,它使用数据库登录 db_admin。该应用程序可以有效地选择、更新、插入和删除数据。

所以我想实际上,做那个项目符号中的内容:将自己标识为用户(而不是 App2,我是用户 MyAPP),然后使用分配的 dbuser 和 dbpass 访问该“游戏”数据库。

主意?

4

2 回答 2

1

确保您已授予用户 MyAPP 执行查询的权限。为此:

  • 以管理员身份登录,
  • 转到配置-> 查询,
  • 打开您的查询定义,
  • 更新字段Execute。它接受逗号分隔的用户 ID。

在此处输入图像描述

于 2018-04-17T14:30:43.853 回答
0

好的,这里确实有两个问题:

  1. 为什么访问被拒绝?
  2. 什么是appid以及如何使用它。

广告。1:请求必须清除两个授权障碍。

第一个是 SlashDB 强加的,因为执行查询的用户必须列在查询定义屏幕的 Execute 字段中。这是在查询的配置 -> 查询 -> “编辑”按钮下完成的。

第二个障碍是由数据库强加的。执行 POST 请求的 SlashDB 用户必须映射到对 Gaming.Leaderboard 表具有 INSERT 权限的物理数据库用户。不用说,这个数据库用户必须与表所在的数据库模式相关联。

广告。2. 要启用appid,用户api密钥必须由冒号“:”分隔的两部分组成。第一部分将被解释为 appid,第二部分将被解释为 apikey。

为此,请为相关用户使用配置 -> 用户 -> '编辑' 按钮。然后只需在 API 密钥的开头添加一个冒号,然后在冒号左侧输入您想要的 appid。该应用程序必须提供两个密钥才能执行请求。请注意,这些键的名称(即 appid)可在 /etc/slashdb/slashdb.ini 中配置。

此功能背后的原因是促进 API 管理平台,这有助于密钥管理,尤其是当 API 将暴露给第三方开发人员时。

于 2018-04-16T22:20:52.437 回答