假设我有一个包含 3 个输入字段的表单:
- 总额
- 增值税税率
- 净额
用户可以填写总额和增值税税率字段。净额字段已设置readonly
。
现在我想通过让javascript计算净额并填写必填字段并将此值传递给数据库来节省时间并提高性能。
我唯一要检查的是净额字段是否为空,例如Symfony NotBlank 约束。
采用 javascript 计算值是不好还是不好的做法?
假设我有一个包含 3 个输入字段的表单:
用户可以填写总额和增值税税率字段。净额字段已设置readonly
。
现在我想通过让javascript计算净额并填写必填字段并将此值传递给数据库来节省时间并提高性能。
我唯一要检查的是净额字段是否为空,例如Symfony NotBlank 约束。
采用 javascript 计算值是不好还是不好的做法?
永远不要相信用户。在服务器端做所有你能做的事情,即使你已经在客户端完成了——尤其不是像这样简单的计算,它几乎不会在服务器端为你节省任何时间。
编辑:除非,正如 Sharky 所说,您实际上并不关心其他两个值,并且仅出于对用户的礼貌提供计算。在这种情况下,净值是真正的输入字段——即使它在技术上是只读的。验证它并按原样存储它,甚至不必费心传输其他两个。
这里有三个危险:
这是通过将用户直接输入的内容显示回屏幕或用户篡改数据的另一个屏幕上来实现的。例如,要求用户输入他们的姓名和类型<script>alert('You got hacked!');</script>
,而不是他们的姓名。每个查看其个人资料的用户都会看到此代码,如果您不检查,它可能会在每个人的机器上执行它。
如果您在系统中有一个页面显示用户输入的数据而不先检查它,就会发生这种情况,在您的情况下,可能是一个显示数据库中当前值的页面。
您可以通过清理用户输入的内容或在离开数据库时对其进行检查来避免这种情况。
但是,对于您的情况,如果您将数据库中的值存储为数字而不是字符串,那么您不会有问题。
不过,您有一个更大的问题,那就是您应该在服务器端执行计算。用户可以操纵净额的值并将他们想要的任何东西发送到数据库。
例如,如果用户从在线商店购买东西,并且他们将 5 件商品添加到他们的购物篮中,每件价格为 1.00 英镑,那么如果您用 JavaScript 计算总数(5.00 英镑)并提交并存储,则可能用户对其进行编辑并将总数更改为 0 英镑并免费获得这些项目。
为了安全起见,您当然应该计算服务器上的成本,并使用您个人从数据库中检索的值 - 不要在后端重复使用用户发送的任何数据,因为他们还可以将单个项目成本编辑为 £ 0 也一样。
作为奖励,您还应该知道,当您将数字相加和相乘时,您的前端和后端可能会以不同的方式计算值。考虑这段代码:
var total = 0.3 - 0.2;
如果您期望总计为 0.1,那您就错了 - 答案类似于 0.99999999998。
Javascript 不能非常准确地处理浮点数。