答案 0 :(得分:2)
虽然HTTPS用于保护传输中的数据,但没有切实可行的方法来防止用户篡改其计算机上的数据。几乎每个现代浏览器都有内置或附加的开发人员工具,允许用户暂停脚本执行,更改客户端脚本变量,修改HTML等。
一种可用于从客户端到服务器来回往返的数据并且不会发生变化的方法(例如UserID)将在发送之前对数据进行加密,然后在它返回服务器时解密。另一种机制是获取所有不期望改变的往返值并计算对它们的散列值,这些值可以存储在页面上的隐藏字段中。然后当他们返回时,重新计算哈希并确保一切都匹配。然后" BobLimitedUser"无法将用户名更改为"管理员"通过操纵HTML而不破坏哈希。
所有这一切,基本的事实只是你应该考虑来自不受你控制的系统的数据是不可信的。应始终在服务器端执行最终输入验证(除了执行任何客户端验证)。因为这个"双重验证"要求,对于复杂的验证例程,我实际上使用webservice / AJAX调用来执行客户端验证。然后我的客户端脚本和我的服务器代码可以简单地调用相同的例程,一次在提交期间和一次提交后。
如果您采用的方法是验证两端的所有输入(可以这么说),那么篡改确实不是问题。如果BobLimitedUser想要操纵HTML,那么他可以将下拉值从一个值更改为他有权访问的另一个值,这是他浪费的时间。如果他设法将某些内容更改为导致数据完整性或安全性问题的值,那么就是服务器端验证可以防止这种情况。
简短
数据验证是一个很重要的讨论话题,我建议您查看OWASP参考指南(这里要复制太多信息):https://www.owasp.org/index.php/Data_Validation
最后一点要考虑......如果你有一个客户端脚本应用程序,那么我假设您正在使用AJAX和Web服务来传输数据。无论你编写什么样的客户端脚本,是什么阻止恶意用户简单地使用像Fiddler这样的东西来绕过客户端脚本,而不是浏览器本身,直接将请求发送到你的web服务?确保安全性的唯一方法是验证服务器上的所有内容。
答案 1 :(得分:1)
这假设您正在尝试阻止恶意用户修改值 - 如果您只是想防止中间人攻击,请使用HTTPS,如理查德建议的那样。
假设您希望用户能够发布值,简短答案为否。
如果您不希望用户能够修改这些值,那么只需将它们存储在会话状态中,并且不要将它们返回给用户(如果您需要,可以从会话中读取它们)在客户端和服务器之间传递。)
您还可以在服务器端验证返回的数据,即删除标签等。
基本上,您无法信任客户提供的数据。 HTTPS不会阻止恶意用户拦截请求并将其firstName更改为" alert(1)" (例如)。
如果用户需要提供值,请检查它们是否安全并符合服务器端内容的规则。始终在服务器端检查授权等,不要信任用户提供的数据。
您无法阻止恶意用户在将数据发送到您的服务器之前修改数据,但您可以在服务器使用之前验证数据。
答案 2 :(得分:1)
当Burp Suite用作代理服务器时,它允许用户操纵通过它的流量,即在Web浏览器即客户端和Web服务器之间。这通常被称为中间人(MITM)类型的攻击架构。
我的建议是,您要在客户端加密要保留的数据,并在将其发布到服务器之前将其单独存储在隐藏的表单字段中,然后在服务器端对其进行解密并将其与发布到服务器的值(可能被中间人篡改的数据)。
通过这种方式,您可以了解是否对要保持安全的数据进行了任何更改。
P.S:正如此处几乎所有答案中所述,强烈建议在这种情况下使用HTTPS。
答案 3 :(得分:0)
使用HTTPS而不是HTTP。 HTTPS将阻止中间人攻击并阻止攻击者查看纯文本。