编码/混淆HTTP参数

Osc*_*Ryz 14 javascript java obfuscation web-applications http-request-parameters

目前,我们正在上一个非常简单的webapp,我们想"模糊" (这将是正确的术语?),或者以某种方式编码的请求参数,所以我们可以减少从机会发送任意数据空闲用户.

例如,网址看起来像 /webapp?user=Oscar&count=3

我们希望有类似的东西:/webapp?data=EDZhjgzzkjhGZKJHGZIUYZT并在服务器中使用真实的请求信息解码该值.

在开始实现这样的事情之前(并且可能做错了)我想知道是否有什么事情要做?

我们在服务器上有Java,在客户端上有JavaScript.

Mik*_*las 29

不,不要这样做.如果你可以在客户端代码中构建一些东西来混淆传输回服务器的数据,那么一个故意的黑客也是如此.无论您的官方客户端做什么,您都无法信任发送到您服务器的数据.坚持逃避客户端数据并根据服务器端的白名单进行验证.使用SSL,如果可以,请将请求参数放在POST而不是GET中.

扩展编辑

您的困惑源于阻止用户篡改请求数据的目标,需要实施标准安全措施.Web应用程序的标准安全措施涉及使用身份验证,权限和会话管理,审计跟踪,数据验证和安全通信通道的组合.

使用SSL并不会阻止客户端篡改数据,但它确实阻止了中间人看到或篡改它.它还指示行为良好的浏览器不要在URL历史记录中缓存敏感数据.

看起来你有一些没有身份验证的简单Web应用程序,并传递在GET中控制它的请求参数,因此一些非技术上精明的人可能会发现user=WorkerBee可以简单地user=Boss在他们的浏览器栏中更改为,因此他们可以访问他们不应该看到的数据,或做他们不应该做的事情.你对这些参数进行模糊处理的愿望(或顾客的愿望)是天真的,因为它只能挫败技术上最不精明的人.这是一个半生不熟的措施,你没有找到现有解决方案的原因是它不是一个好方法.你最好花时间实施一个体面的认证系统和审计跟踪,以获得良好的衡量标准(如果这确实是你做的那样,那就标记一下加里的回答是正确的).

所以,把它包起来:

  1. 混淆的安全性根本不是安全性.
  2. 您无法信任用户数据,即使它被遮挡了. 验证您的数据.
  3. 使用安全通信通道(SSL)有助于阻止其他相关威胁.
  4. 你应该放弃你的方法,做正确的事.在您的情况下,正确的做法可能意味着添加一个带有权限系统的身份验证机制,以防止用户访问他们没有足够的特权来查看 - 包括他们可能通过篡改GET参数尝试访问的内容.Gary R的回答,以及Dave和Will的评论都击中了这一点.

  • 所以,你的建议是*“不要这样做,因为它不完美”*?我真的不知道如何验证客户端数据。例如,如果 URL 是 `/getinfo?user=oscar`,我应该如何针对白名单验证值:“Oscar”。使用 SSL + POST 会不会像不使用它们一样容易调整? (2认同)

Dav*_*ith 13

如果您的目标是"减少空闲用户发送任意数据的机会",那么我会尝试另一种更简单的方法.创建一个私有加密密钥并将其存储在应用程序服务器端.每当您的应用程序生成URL时,使用您的私有加密密钥创建URL的哈希值,并将该哈希值放入查询字符串中.每当用户请求包含url中参数的页面时,重新计算哈希并查看它是否匹配.这将确保您的应用程序计算网址.它会使您的查询字符串参数可读.在伪代码中

SALT = "so9dnfi3i21nwpsodjf";

function computeUrl(url) {
  return url + "&hash=" + md5(url + SALT );
}

function checkUrl(url) {
  hash = /&hash=(.+)/.match(url);
  oldUrl = url.strip(/&hash=.+/);
  return md5(oldUrl + SALT ) == hash;
}
Run Code Online (Sandbox Code Playgroud)


Gar*_*owe 6

如果您尝试限制对数据的访问,则使用某种登录机制和cookie,提供单点登录身份验证密钥.如果客户端使用密钥发送cookie,则他们可以根据与其帐户相关联的权限(管理员,公共用户等)操纵数据.只需看看Spring Security,CAS等,就可以在Java中轻松使用它.cookie中提供的令牌通常使用发布服务器的私钥加密,通常是防篡改.

或者,如果您希望您的公共用户(未经身份验证的)能够将某些数据发布到您的网站,那么所有投注都将被取消.您必须在服务器端进行验证.这意味着限制对某些URI的访问并确保清除所有输入.

这里的黄金法则禁止一切,除了你知道的东西是安全的.