我们的系统中可能会需要让某些特定的使用者(通常是高位者)为了操作上的【便利性】,让使用者可以直接点【超链结】就直接的【进入系统】,并到达某特定的【网页(文件)】
一般的做法可能是将【账号密码存于Cookie】的方式进行,但是这样的方式不是很恰当,其次再给予超链结的时候,也会将要导回哪些画面的信息直接放在超链结中,这样容易让用户知道您的程序会处理哪些字段的信息,造成用户透过尝试更改超链结信息方式浏览到用户不该浏览的数据。
例如:http://www.blueshop.com.tw/doc.asp?docid=1234
有心的黑客看到这样的信息,可能就会尝试着把1234改成1233或者1235来查看,程序上一不小心就会让使用者看到不该看的东西
而且将账号密码存于Cookie中,容易让【木马程序】透过【收集Cookie】的方式得知账号密码
所以如果要能够比较安全的方式,小喵提供以下这个方式给大家参考
1. 超链结中带的QueryString是一组GUID1(公钥)
例如:http://www.blueshop.com.tw/abc.asp?GID=405CACB3-F658-4DD5-82E5-D1DA7DDFDB7E
2. 进入系统后,从数据库中找到此组【GUID1公钥】提供给哪个【使用者】使用、以及哪些【文件超链结数据】
3. 透过2.的【使用者】,在【TA】验证该【使用者】存于Cookie中的【GUID2私钥】以及限定的IP,让只有【限定的IP】并且拥有【GUID2私钥】的人才可以开启,否则将拒绝进入
4. GUID2私钥给予的方式:用户登入后,检查数据库中是否有设定该【使用者】与【IP】有授权可以拥有【GUID2私钥】→如果有→产生【GUID2私钥】存放于数据库中,并产生Cookie存放【GUID2私钥】
首先会用的两个数据表:
使用者私钥管理表(TA):
PK | UserId | 使用者账号 |
PK | IP | 用户计算机IP |
| GUID2 | 私钥 |
超链结公钥管理表(TB):
PK | GUID1 | 公钥 |
PK | UserId | 使用者账号 |
| URLInfo | 超链结信息 |
使用者点选超链结后,首先从取得的【GUID1公钥】透过【TB】取得这份文件是允许哪些【使用者】可以浏览,接着将此【使用者】透过【TA】取得该用户允许在哪台计算机【IP】并且需要拥有哪个【GUID2私钥】才能看。
换言之,需要【GUID1(公钥)+允许的计算机IP+GUID2(私钥)】三个条件缺一不可,才能够进入该网页(文件)
要实现以上的方式,需要有三个公用程序
1. 正常登入后【产生私钥】
2. 产生Email中超链结时,【产生公钥】
3. 链结回来后【验证3要件】
这样的设定方式,适用于一个人拥有多个计算机,也适用于各系统自行运用。
FAQ:
Q1:请问如果用户拥有多台计算机,是否适用
A1:可以适用,因为TA中的主索引为UserId + IP,所以一个用户可以设定多台计算机,各每台计算机各自拥有各自的私钥
Q2:请问如果一个网页(文件)需指定三人可浏览,是否适用
A2:可以适用,因为TB中主索引为GUID1 + UserId,所以一份文件可以指定多人浏览
Q3:请问如果信件被别人拦截,是否可以直接点选超链结就进入系统
A3:不会。信件中的超链结中是公钥,必须加上【GUID2私钥】及【IP】两个条件都符合才能进入
A4 :不会,储存私钥必须符合【正常登入】【符合限制 IP 】才会储存,如果会担心,可将储存的动作作成按纽让使用者按下【在这台计算机储存私钥】的按钮后才储存【私钥】