【发布时间】:2016-01-13 13:42:31
【问题描述】:
我为我网站上的每个访问者生成一个会话值。如果他们提交表单,它会通过 jQuery AJAX 请求将数据发送到我的 PHP 验证器脚本。
此脚本对用户提交的数据执行多项检查。如果所有内容都经过验证,它会返回一个由函数hash_hmac('sha256', 'success', $_SESSION['secret_key']) 生成的 sha256 哈希。我对此进行了哈希处理,因此用户无法使用 Charles 等软件操纵响应。
jQuery 请求接收到散列字符串,我必须再次使用密钥对“成功”进行散列,以检查它们是否匹配。但是,密钥存储在 PHP 会话中,我无法弄清楚如何通过 JavaScript 访问它。
对 PHP 脚本的 AJAX 请求并不理想——攻击者随后可以编辑响应以使其与自己的散列字符串匹配。
【问题讨论】:
-
您无法使用 javascript 访问 PHP 会话变量。因为 javascript 是客户端,而 php 是服务器端。您可以使用此 stackoverflow.com/questions/4365738/… 的已接受答案,但我看不出 AJAX 调用和文件加载之间的区别,其中包含变量。因为它仍然很容易访问。
-
为什么用户提交有效数据的成功或失败需要散列?用户不应该知道他们是否做错了什么吗?特别是如果您希望用户检查匹配项。有什么用例。简而言之,AJAX 是唯一的解决方案。他们可以编辑响应,但如果这一切都在客户端完成,他们仍然可以编辑他们需要的任何内容。
-
是的,他们会知道自己是否做错了什么。成功字符串只是一个示例:例如,如果他们输入了错误的用户名,它将散列
invalid-username。 jQuery 将根据 POST 请求的结果显示一条消息。是的,他们可以编辑它,但他们不知道他们的密钥,这样他们就无法通过自己散列来影响结果。 -
我没有看到用例。为什么不直接告诉他们他们输入了一个没有哈希的无效用户名呢?为什么会是敏感信息?如果它很敏感,为什么要显示有关它的消息?我是不是误会了?无论哪种方式,AJAX 都是唯一的解决方案。根据经验,您无法在客户端获得真正的安全性。
标签: javascript php jquery ajax session