Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在URL中公开DB内部ID是一种不好的做法吗?_Java_Database_Url_Web_Obfuscation - Fatal编程技术网

Java 在URL中公开DB内部ID是一种不好的做法吗?

Java 在URL中公开DB内部ID是一种不好的做法吗?,java,database,url,web,obfuscation,Java,Database,Url,Web,Obfuscation,在URL中公开DB内部ID是一种不好的做法吗 例如,假设我有一个users表,每行有一些id(主键)。公开URLmyapp.com/accountInfo.html?userId=5,其中5是实际的主键,会被认为是“坏事”吗?为什么 还假设我们正确地防御了SQL注入 我最感兴趣的是与JavaWeb技术堆栈(因此是Java标记)相关的答案,但是一般的答案也会非常有用 谢谢。这取决于您解析URL的方式。如果您允许盲目的SQL注入,这是不好的。您只需验证用户输入的id即可 Stackexchange还

在URL中公开DB内部ID是一种不好的做法吗

例如,假设我有一个
users
表,每行有一些id(主键)。公开URL
myapp.com/accountInfo.html?userId=5
,其中
5
是实际的主键,会被认为是“坏事”吗?为什么

还假设我们正确地防御了SQL注入

我最感兴趣的是与JavaWeb技术堆栈(因此是Java标记)相关的答案,但是一般的答案也会非常有用


谢谢。

这取决于您解析URL的方式。如果您允许盲目的SQL注入,这是不好的。您只需验证用户输入的id即可


Stackexchange还将该行的id放入URL中,您可以在地址栏中看到这一点。诀窍是解析该部分并完成所有可能的SQL。最简单的方法是检查id是否是一个数字。

在URL中传递并不是一件坏事,因为它对最终用户没有多大意义——如果在应用程序的运行中依赖该值,这是唯一的坏事。例如,您不希望用户注意到userId=5并将其更改为userId=10以显示另一个人的帐户


将这些信息存储在服务器上的会话中会更安全。例如,当用户登录时,他们的userID值存储在服务器上的会话中,并且在查询数据库时使用该值。如果您这样做,通常不需要在URL中传递用户ID,但是这不会造成任何伤害,因为您的DB查询代码没有使用它。

在URL中使用数据库ID是好的,因为在对象(DB行)生命周期中,此ID永远不会更改。因此,URL是持久的—这是URL最重要的方面。另请参见。

是的,这是一件坏事。您正在公开实现细节。有多糟?那要看情况。它迫使您对用户输入进行不必要的检查。如果其他应用程序开始依赖它,则您不再可以自由更改数据库方案

PKs是为系统设计的。
对于用户来说,它可能代表不同的含义:
例如。 让我们考虑下面的链接。使用主键显示products
productA、productB、productC下的项目

(A)(pkey)
(B)(pkey)
(C)(pkey)
链接B上的用户可能会觉得ProductB下有112项,这是误导性的。


合并表时也会出现问题,因为PK将自动递增。

是。让我们假设我们对注入进行了适当的防御。在这种情况下,如果你不使用“用户友好”的URL,这是没有问题的,可能只是一些SEO内容。Instagram也会公开照片ID。我想,如果站点读得太多,数据无法修改,并且不是关键任务,那么公开ID是安全的。IMO主键在生产过程中无论如何都不能更改。即使不是在生产环境中,您也不能更改它们,因为其他表可能依赖于它们。一般来说,我看不到更改主键会带来什么好处。您必须公开一些实现细节,因为URL需要一些参数才能显示用户(如果您使用的是URL导航)。@Simeon:主键当然会改变。尤其是在重新设计数据模型时。我不在瀑布式环境中工作。到数据库的映射不应向任何客户端公开。我可能想使用不同的存储层。非常非常错误。一旦您这样做,您的数据库就成为更改的障碍。如果您必须更改数据库,您仍然可以使用旧ID,即使它们不再是主键。你所要做的就是如果你事先创建了人工的“web ID”,你会做什么。我不认为URL是用户体验的一部分。再也没有人键入URL了,如果我没有开发一些东西,我自己也不会注意它们。因此,这是一个误导性的事实,对我来说似乎并不十分重要。但是,我同意自动递增的论点。如果您查看stackexchange URL,它们还包含几个数字,如果与DB无关,则会产生误导。softwareengineering.SE上的相关问题: