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
将javascript计算值传递到数据库是一种不好的做法吗?_Javascript_Database_Calculation - Fatal编程技术网

将javascript计算值传递到数据库是一种不好的做法吗?

将javascript计算值传递到数据库是一种不好的做法吗?,javascript,database,calculation,Javascript,Database,Calculation,假设我有一个表单,它有3个输入字段: 总额 增值税税率 净额 用户可以填写总额和增值税税率字段。净金额字段设置为只读 现在,我想通过让javascript计算净金额并填充必填字段并将该值传递给数据库来节省时间并提高性能 我唯一要检查的是净金额字段是否为空,例如带 采用javascript计算值是不好的做法还是不好的做法?这里有三种危险: 恶意代码注入 这是通过将用户直接输入的内容显示回屏幕或另一个用户篡改数据的屏幕来实现的。例如,要求用户输入姓名和类型alert('youhacked!'

假设我有一个表单,它有3个输入字段:

  • 总额
  • 增值税税率
  • 净额
用户可以填写总额和增值税税率字段。净金额字段设置为只读

现在,我想通过让javascript计算净金额并填充必填字段并将该值传递给数据库来节省时间并提高性能

我唯一要检查的是净金额字段是否为空,例如带


采用javascript计算值是不好的做法还是不好的做法?

这里有三种危险:

  • 恶意代码注入
这是通过将用户直接输入的内容显示回屏幕或另一个用户篡改数据的屏幕来实现的。例如,要求用户输入姓名和类型
alert('youhacked!')而不是他们的名字。查看个人资料的每个用户都会看到此代码,如果您不检查,它可能会在每个人的机器上执行

如果系统中有一个页面显示了用户输入的数据,而没有先进行检查,则会发生这种情况,在您的情况下,可能是一个页面显示了数据库中的当前值

您可以通过清理用户键入的内容,或者在退出数据库时对其进行检查来避免这种情况

但是,对于您的情况,如果您将值存储在数据库中作为数字而不是字符串,那么您就不会有问题

  • 在javascript中操纵值
不过,您还有一个更大的问题,那就是您应该在服务器端执行计算。用户可以操纵净额的值,并向数据库发送他们想要的任何内容

例如,如果用户从网上商店购买物品,他们向购物篮中添加5件物品,每件价格为1.00英镑,那么如果您使用javascript计算总额(5.00英镑)并提交和存储该总额,用户可以编辑该总额,将总额更改为0英镑,然后免费获得这些物品

为了安全起见,您当然应该计算服务器上的成本,并使用您个人从数据库中检索的值-不要重复使用从后端用户发送的任何数据,因为他们也可以将单个项目成本编辑为0英镑

  • Javascript数字精度
作为奖励,您还应该注意,当您将数字相加和相乘时,前端和后端的计算值可能会有所不同。考虑这个代码:

var-total=0.3-0.2

如果你认为总数是0.1,那你就错了——答案大概是0.999999998


Javascript不能非常准确地处理浮点数。

永远不要相信用户。在服务器端尽你所能,即使你已经在客户端完成了——特别是像这样一个简单的计算,它几乎不会节省你在服务器端的任何时间


编辑:除非,正如Sharky所说,您实际上并不关心其他两个值,并且提供计算只是出于对用户的礼貌。在这种情况下,净值是真正的输入字段——即使它在技术上是只读的。验证它并将其存储起来,甚至不必麻烦传输另外两个。

这一点@goulashsoup-当用户可以轻松地向您发送任何他们想要的值时,您真的想存储从用户那里收到的净金额吗?不再,谢谢您的回答!