我正在向用户展示一些考试。用户在通过此考试之前不得进入实际网站。但是,有些用户可以选择绕过考试,直到某个日期(比如当前日期的月份)。所以这些用户有一个月的窗口参加考试。在此之前,他们可以点击考试页面上的“继续”进入该网站。
我的逻辑: 当普通用户点击考试表单页面上的提交时,我正在完成所有逻辑并向数据库提交信息。当这些“特殊”用户点击继续时,我将只是在'didPassExam()'方法中加密'true',如果它们仍然在那个月的窗口中。
我的问题是: 检查用户点击了哪个按钮我正在执行以下操作(Struts 2代码)
私人字符串提交;
public void setSubmit(String submit) {
this.submit = submit;
}
在JSP中:
<s:submit name="submit" value="Submit" />
<s:submit name="submit" value="Proceed" />
所以基本上当用户点击按钮时,我的动作类将知道点击了哪个按钮。但是,有些黑客可以故意将“提交”按钮的值更改为“继续”,然后绕过考试,即使对于普通用户也是如此吗?
有人会采用不同且更安全的方式吗?
答案 0 :(得分:8)
是的,任何用户都可以传递特殊的“继续”并获得访问权。
由于您可以(并且确实)已经告诉用户类型之间的区别,您应该根据它来验证服务器上的按钮。始终可以绕过客户端检查。
答案 1 :(得分:7)
通常,您不应该信任来自客户端的输入。您应该在服务器端验证特定用户是否有权跳过考试。据推测,您知道用户是谁来自登录过程,并且您知道确定他们是否可以跳过考试的正确逻辑。因此,没有理由相信客户告诉你的内容。
答案 2 :(得分:3)
是的,这很容易被黑客入侵。每当您需要保护此类内容时,请在服务器端进行检查。也就是说,检查服务器端的用户类型(这就像说法中的“角色”)。
始终假设任何客户端代码都可以并且将被恶意用户替换。
答案 3 :(得分:1)
您需要捕获按下的按钮,然后针对用户进行验证。 假设您的User被实例化为类变量user,并返回公共方法isSpecialUser()的布尔值:
public void setSubmit(String submit) {
if (user.isSpecialUser() && submit == "Proceed") {
// Only Special Users can set this to Proceed
this.submit = submit;
} else {
// Sets itself to the remaining valid option (to prevent evilness)
this.submit = "Submit";
}
}