【发布时间】:2015-03-11 20:26:32
【问题描述】:
如何在 spring mvc web 应用程序中隐藏 url 字符串中使用的字段值?
例如,如果我想将 recordID=1 的记录发送到视图中,我给用户一个带有以下 url 的超链接:
https://myapp.com/urlpattern?recordID=1
如您所见,这不仅暴露了recordID=1,还诱使恶意用户开始输入其他数字来挖掘其他记录,例如recordID=5 或recordID=9。
spring框架或spring security是否有内置的url字符串加密方式?还是我需要使用hibernate更改底层数据库中的id值?
上述url模式的控制器代码是:
@RequestMapping(value = "/urlpattern", method = RequestMethod.GET)
public String processUrlPattern(@RequestParam("recordID") String recordId,
HttpServletRequest request, BindingResult result, Map<String, Object> model) {
Long recId = Long.valueOf(recordId).longValue();
RecordObject sel_record = this.appService.findRecordById(recId);
model.put("sel_record", sel_record);
return "foldername/jspname";
}
请注意,应用程序中的所有实体都继承自同一个BaseEntity,其 id 生成代码如下:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@DiscriminatorFormula("(CASE WHEN dtype IS NULL THEN 'BaseEntity' ELSE dtype END)")
@org.hibernate.annotations.DiscriminatorOptions(force=true)
public abstract class BaseEntity {
@Transient
private String dtype = this.getClass().getSimpleName();
@Id
@GeneratedValue(strategy=GenerationType.TABLE, generator="TBL_GEN")
@TableGenerator(
name="TBL_GEN",
table="GENERATOR_TABLE",
pkColumnName = "mykey",
valueColumnName = "hi",
pkColumnValue="id",
allocationSize=20
)
protected Integer id;
//other stuff
}
注意:所有用户都使用 Spring 安全性进行身份验证/授权。但是,数据非常敏感,重要的是没有人能够操作 url 字符串。
【问题讨论】:
-
用户是否使用 Spring Security 进行身份验证/授权?
-
@Mark 是的,用户都使用 Spring Security 进行了身份验证/授权。
-
用户是否只能访问特定的 ID?
-
是的,但得出的结论是,无论使用何种技术,这都不是真正的安全措施。您可能最好在 spring security 中查看 ACL 以获得适当的解决方案
-
如果您注意到的话,我没有将您的问题标记为重复。只是做了一个提示,试图对混淆 url 参数的真实概念给出一些指导。剩下的就是实现细节。有些做法的寿命超过 4 年。
标签: spring spring-mvc spring-security