如何编码为同一原始字符串字符提供不同编码字符的字符串?
How to encode string that give different encode character for same original string character?
我们有一个电子商务网站,其中有一个项目(移动)有两种类别。一个是 'good-mobiles'
,另一个是 'bad-mobiles'
。
我们通过 运行 对某些参数的一些计算来决定这一点。
我们有两个数据库 table,一个存储所有好手机(table 名称:gMobiles
),另一个存储所有坏手机(table 名称: bMobiles
)。我们在前面添加 'g' 或 'b' 一些自动递增的 id,并将其存储在相应的 table 中。
因此 gMobiles
包含所有以 'g' 开头的 ID,而 bMobiles 包含所有以 'b' 开头的 ID。然后我们将这个 id 添加到详细信息页面的 url 中。
现在的问题是用户只需查看 url 或将鼠标悬停在桌面列表页面上的项目上即可轻松识别移动设备的好坏。
为了解决这个问题,我们想到了使用编码(例如base64编码),但是编码的问题是在编码字符串中'g'被一些其他字符替换并且对于所有'g'它总是给出相同的字符,所以它不会解决我们的问题。
Orig Text | Encoded Text
----------|-------------
g1234 | ZDEyMz
g1267 | ZDEyUS
b3456 | YTEyMz
b7654 | YTMyQs
g7654 | ZDMyQs
我们没有使用加密,因为加密的字符串会很长(对于 8 个字符的输入字符串,它将给出 40-50 个字符)。
有什么方法可以对结果字符串进行排序,并且不能仅通过查看 URL 来判断移动设备的好坏。
您的问题源于不正确的数据库设计。您可以全力以赴尝试解决这个选择,但更明智的方法是修改该设计。
不要仅仅因为一个属性不同就将实体存储在不同的 table 中。接下来是什么,grMobiles
代表好的红色手机,bbMobiles
代表坏的黑色手机?为什么还要在主键前面加上前缀呢?它已经在 table 名称中。
解决方案是将 "quality" 属性保存在同一 table 中的单独列中。这将解决你所有的问题,将来甚至可以让你"mediocre"卖手机,区分好坏。
如前所述,您应该更改 table(s) 的设计,使您只有一个 table 和一个额外的列。
如果您无法更改它,另一种解决方案可能是在 POST 请求中传递 id 而不是 GET 请求,所以它 不会显示在 URL.
人们仍然可以判断您的手机是好是坏,但对大多数用户而言显而易见。
正如这里的许多其他人所指出的,根本原因是数据库设计,您应该对其进行更改。如果出于某种原因您不能这样做,那么您可以考虑稍微隐藏前缀。
一个选项是说所有字符 a-m
代表 g
,所有其他字符 n-z
代表 b
。这意味着您可以随机决定将 ID g1234
编码为 a1234
、h1234
或 l1234
,但是当您必须对其进行解码时,您会知道他们三个的意思都是 g1234
.
另一个规则可以说所有元音 a,e,i,o,u,y
代表 g
,所有辅音代表 b
。同样,这将使您能够将 i1234
解码为 g1234
,但将 h1234
解码为 b1234
.
对于网站的真正精明的用户,这可能仍然可以检测到,但是 IME,大多数用户甚至不看地址栏来查看他们的连接是否安全...
即便如此,您也可以发明自己的算法。您只需要在解码时确定它即可。
但你真的应该改变数据库设计。
我们有一个电子商务网站,其中有一个项目(移动)有两种类别。一个是 'good-mobiles'
,另一个是 'bad-mobiles'
。
我们通过 运行 对某些参数的一些计算来决定这一点。
我们有两个数据库 table,一个存储所有好手机(table 名称:gMobiles
),另一个存储所有坏手机(table 名称: bMobiles
)。我们在前面添加 'g' 或 'b' 一些自动递增的 id,并将其存储在相应的 table 中。
因此 gMobiles
包含所有以 'g' 开头的 ID,而 bMobiles 包含所有以 'b' 开头的 ID。然后我们将这个 id 添加到详细信息页面的 url 中。
现在的问题是用户只需查看 url 或将鼠标悬停在桌面列表页面上的项目上即可轻松识别移动设备的好坏。
为了解决这个问题,我们想到了使用编码(例如base64编码),但是编码的问题是在编码字符串中'g'被一些其他字符替换并且对于所有'g'它总是给出相同的字符,所以它不会解决我们的问题。
Orig Text | Encoded Text
----------|-------------
g1234 | ZDEyMz
g1267 | ZDEyUS
b3456 | YTEyMz
b7654 | YTMyQs
g7654 | ZDMyQs
我们没有使用加密,因为加密的字符串会很长(对于 8 个字符的输入字符串,它将给出 40-50 个字符)。
有什么方法可以对结果字符串进行排序,并且不能仅通过查看 URL 来判断移动设备的好坏。
您的问题源于不正确的数据库设计。您可以全力以赴尝试解决这个选择,但更明智的方法是修改该设计。
不要仅仅因为一个属性不同就将实体存储在不同的 table 中。接下来是什么,grMobiles
代表好的红色手机,bbMobiles
代表坏的黑色手机?为什么还要在主键前面加上前缀呢?它已经在 table 名称中。
解决方案是将 "quality" 属性保存在同一 table 中的单独列中。这将解决你所有的问题,将来甚至可以让你"mediocre"卖手机,区分好坏。
如前所述,您应该更改 table(s) 的设计,使您只有一个 table 和一个额外的列。
如果您无法更改它,另一种解决方案可能是在 POST 请求中传递 id 而不是 GET 请求,所以它 不会显示在 URL.
人们仍然可以判断您的手机是好是坏,但对大多数用户而言显而易见。
正如这里的许多其他人所指出的,根本原因是数据库设计,您应该对其进行更改。如果出于某种原因您不能这样做,那么您可以考虑稍微隐藏前缀。
一个选项是说所有字符 a-m
代表 g
,所有其他字符 n-z
代表 b
。这意味着您可以随机决定将 ID g1234
编码为 a1234
、h1234
或 l1234
,但是当您必须对其进行解码时,您会知道他们三个的意思都是 g1234
.
另一个规则可以说所有元音 a,e,i,o,u,y
代表 g
,所有辅音代表 b
。同样,这将使您能够将 i1234
解码为 g1234
,但将 h1234
解码为 b1234
.
对于网站的真正精明的用户,这可能仍然可以检测到,但是 IME,大多数用户甚至不看地址栏来查看他们的连接是否安全...
即便如此,您也可以发明自己的算法。您只需要在解码时确定它即可。
但你真的应该改变数据库设计。