我正在建立一个Drupal网站,其中包含许多将使用jQuery / ajax发布的用户特定信息。它自身的信息不是很敏感,仅重要的是验证表单数据是否已被诸如Firebug之类的工具篡改,并确保确实已从指定用户请求该信息。换句话说,我正在尝试找出用ajax发布时保护数据完整性和真实性的最佳方法。
理想情况下,我想使用一些众所周知的消息身份验证系统,例如HMAC算法。但是,由于它包含对称密钥,因此我不知道如何在不将secret密钥暴露在javascript文件中的情况下对POST数据进行加密(显然任何人都可以看到)。
如果我对它应该如何工作有错误的想法,请纠正我。
例如,我需要发送的信息
field1=x&field2=y&uid=10
…然后计算数据的哈希值和密钥。是否可以在不暴露我的JavaScript代码中的哈希函数的情况下做?
CHECKSUM: hash(postdata, "secret_key")
…最后将校验和附加到原始postdata。
field1=x&field2=y&uid=1&c=CHECKSUM
我的另一种选择是使用登录用户的会话ID。但是,这不会检查消息的完整性…
使用PHP生成表单时,可以使用以下命令生成隐藏的输入
CHECKSUM: hash(session id for the current user, "secretkey")
然后我将使用ajax发布的内容是
field1=x&field2=y&uid=10&c=CHECKSUM
有了它,对适当的用户进行身份验证将是相当安全的(再次是伪代码)
ssid = SELECT ssid FROM sessions WHERE uid = $_POST[uid] if(ssid && hash(ssid, "secretkey") == $_POST[c]) { //User OK } else { //Invalid user }
您无法做您想做的事。基本上,您正在尝试验证不受信任和不受控制的客户端上的一个组件(您的表单)是否未被该客户端上的另一个组件篡改。您不控制客户。您可以提出各种方法,以使某人 难以 在其客户端上执行此操作,但是最后您必须向客户端公开进行这些完整性检查的方式。您在表单脚本中所做的任何操作都可以被该客户端上的人员读取和理解(该脚本必须在客户端上运行,因此与客户端进行交互的任何人都可以对您正在执行的任何操作进行反向工程,以恢复使用的技术和任何密钥/ etc,则必须启用您的方案)。
Web应用程序安全性的基本规则是,您无法控制客户端上发生的事情,因此您不能信任这样的客户端验证/安全方案。
最后,这种方案提供的保护不太值得花费时间和金钱来实施。坚决打破它的人将能够做到。