假设我有一个包含3个输入字段的表单:
用户可以填写总金额和增值税税率字段。 净金额字段设置为readonly
。
现在我希望通过让javascript计算净金额来节省时间并提高性能,并填写必填字段并将此值传递给数据库。
我唯一要检查的是净金额字段是否为空,例如与Symfony NotBlank constraint。
采用javascript计算值是坏或坏的做法?
答案 0 :(得分:5)
永远不要相信用户。在服务器端尽你所能,即使你已经在客户端完成了这一切 - 尤其不是一个简单的简单计算,几乎不会在服务器端节省任何时间。
编辑:除非像Sharky所说的那样,否则你实际上并不关心其他两个值,并且只是为了礼貌而向用户提供计算。在这种情况下,净值是实际输入字段 - 即使它在技术上是只读的。验证它并将其存储,并且甚至不打扰传输其他两个。
答案 1 :(得分:3)
这里有三种危险:
这通过将用户直接输入的内容显示回屏幕或用户已篡改数据的另一个屏幕来实现。例如,系统会询问用户的姓名和类型<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不能非常准确地处理浮点数。