我们有一个电子商务网站,其中有一个项目(移动)有两种类别。一个是'good-mobiles'
,另一个是'bad-mobiles'
。
我们通过对某些参数运行一些计算来决定这一点。
我们有两个数据库表,一个存储所有好的移动设备(表名:gMobiles
),其他存储所有坏移动设备(表名:bMobiles
)。我们之前使用一些自动递增的id添加'g'或'b'并将其存储在相应的表中。
因此gMobiles
包含以'g'开头的所有ID,而bMobiles包含以'b'开头的所有ID。我们将此ID添加到详细信息页面的URL中。
现在问题是用户可以通过查看网址或将鼠标悬停在桌面列表页面上的项目来轻松识别移动设备是坏还是坏。
为了解决这个问题,我们考虑使用编码(例如base64编码),但编码问题是编码字符串'g'被其他一些字符替换,而对于所有'g',它总是给出相同的字符,所以它不会解决我们的问题。
Orig Text | Encoded Text
----------|-------------
g1234 | ZDEyMz
g1267 | ZDEyUS
b3456 | YTEyMz
b7654 | YTMyQs
g7654 | ZDMyQs
我们没有使用加密,因为加密的字符串会很长(对于8个字符的输入字符串,它会给出40-50个字符)。
是否有任何方法可以对结果字符串进行排序,只是通过查看URL无法确定移动设备是好还是坏。
答案 0 :(得分:4)
您的问题源于不正确的数据库设计。你可以全力以赴,尝试解决这个问题,但更明智的方法是修改这个设计。
不要将实体存储在不同的表中,因为它们因单个属性而不同。接下来是什么,grMobiles
为好的红色手机,bbMobiles
为坏黑手机?为什么还要将前缀添加到主键?它已经在表名中了。
解决方案是将“quality”属性保存在同一个表的单独列中。这将解决您的所有问题,并且将来甚至允许您销售除了好的和坏的之外的“平庸”手机。
答案 1 :(得分:2)
正如许多其他人在此指出的那样,根本原因是数据库设计,您应该更改。如果出于某种原因,你不能这样做,那么你可以考虑稍微模糊前缀。
一种选择是说所有字符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,大多数用户甚至不查看地址栏以查看他们的连接是否安全......
即便如此,你也可以发明自己的算法。解码时只需要确定性。
但你应该真正改变数据库设计。
答案 2 :(得分:0)
如前所述,您应该更改表格的设计,以便只有一个表格附加一列。
如果您无法更改此设置,则另一种解决方案可能是在 POST 请求中传递ID而不是 GET 请求,因此它会不会显示在网址。
人们仍然可以弄清楚您的手机是好还是坏,但对大多数用户来说,它不会明显。