【问题标题】:Can an Equal sign be passed in RESTful?等号可以在RESTful中传递吗?
【发布时间】:2023-03-24 00:47:01
【问题描述】:

在我尝试传递 WHERE 语句之前,我的 RESTful 界面工作正常

例子:

通过的周长:

SELECT = "this";
FROM = "that";
WHERE = " 'ID' = 332";

网址可能如下所示

www.example.com/rest.php?SELECT=this&FROM=that&WHERE='ID'=332

然后在我的 php 脚本中

if (isset($_GET['SELECT']))
{
    $SELECT = $_GET['SELECT'];
}
if (isset($_GET['FROM'])) 
{
    $FROM = $_GET['FROM'];
}
if (isset($_GET['WHERE'])) 
{
    $WHERE = $_GET['WHERE'];
}

所以我认为 WHERE 语句中的等号搞砸了。我在这个陈述中是否正确?

如果是这样,还有什么替代方案?

【问题讨论】:

  • php.net/rawurlencode - 所有内容您输入的网址都应该正确编码
  • 将 SQL 作为参数传递似乎是错误的解决方案,并且让自己面临 SQL 注入或意外的非常重的查询。不能不传具体参数,自己在服务器上建SQL吗?
  • 让一切都通过一个rest.php 和参数的 SQL 查询部分几乎是 not RESTful 的缩影。
  • 你需要先了解一下 SQL 注入,然后才能声称它不易受到攻击。我所要做的就是发送WHERE of 'ID' = 332; DELETE * FROM table;
  • 如果你想让 WHERE = 'ID' = 332 这样的东西起作用,你不可能基于所问的问题。 'ID' 周围的引号将被转义。

标签: php database rest restful-url


【解决方案1】:

RESTful 接口是关于永久链接的资源。公开对数据库的直接查询不会封装您的存储层,也不是 RESTful。它是一种通过 http 的透明 RPC 机制来查询您的数据库(直接由消费者)。

在你的例子中:

www.example.com/rest.php?SELECT=this&FROM=that&WHERE='ID'=332

'that' 似乎是资源,'this' 是它上面的数据,id 是对该对象的唯一引用。

所以,为了更放松,请考虑:

www.example.com/api/that/{id}

返回的数据包含“列”或属性

{
    attr1:val1,
    attr2:val2
}

您的服务器可以将 /{id} 映射到一个方法,该方法采用 id、制定必要的 sql 查询、获取表格数据、填充对象并返回它(序列化为 json、xml 等...)

如果您需要进一步过滤,请考虑使用 querystrng 参数来控制选项(但不是 sql where 子句)。

www.example.com/api/that/{id}?option=val1&option2=val2

【讨论】:

  • 如何使用 $_GET 提取周长。如果我能弄清楚如何在 php 端正确解析以构建我的查询,我确实更喜欢这种格式
  • 我已经在 node.js/express 和 C# (asp.net webapi) 中完成了我所有的 REST 服务器。两者都提供了基于路线映射方法的简单方法。还没有在 php 中完成它,我有一些库。快速谷歌显示一些使用 $ _ SERVER['PATH_INFO'] 将返回 /api/that/{id}
  • 请注意,OData 协议允许以(几乎)类似 SQL 的语法传递查询:odata.org/documentation/uri-conventions#QueryStringOptions
  • 将 url 模式映射到方法的路由是一种编程方便。安全的关键是用户没有传递您尝试验证然后直接执行的 sql。确保您正在构建基于输入的 sql(本例中的 id 和几个选项)。在构建 sql 时,请确保 sql 参数并且不要连接字符串。
猜你喜欢
  • 2018-07-14
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2010-10-07
  • 2012-12-05
  • 2020-05-25
相关资源
最近更新 更多