首页 新闻 赞助 找找看

做毕业设计时候遇见的3个小问题!

0
悬赏园豆:5 [已解决问题] 解决于 2008-12-18 22:21

1.我做的网站,当注册用户在两个地方登录时候,如何使得先登录的自动掉线;

2.当使用URL跳转的时候如何使得地址栏的跳转字符加密(至少别显示是?id=222)这样的。

3.对于留言板需要过滤一部分脏字,我去那里下载脏字库啊?(靠现在自己想太慢了,也太少了)

期待中~~~

Jinzhi的主页 Jinzhi | 菜鸟二级 | 园豆:240
提问于:2008-12-18 09:09
< >
分享
最佳答案
0

1.其实你这个地方可以这样做,每个登录时都判断一下用户是否已经验证,如果验证了就不用登录,注意登录只是一个验证的过程,如果登录过再去登录是不是不太合适

2.这个地方你可以使用一些类库中的函数进行一下机密处理,获得以后进行解密再提取键值。这是以前在网上找的一个加函数:

using System.Security.Cryptography;

#region Encryption64

        private const string DEFAULT_KEY = "#kdsfsles";

        public static string Encrypt(string stringToEncrypt, string key)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            MemoryStream memoryStream = new MemoryStream();
            CryptoStream cryptoStream;

            // Check whether the key is valid, otherwise make it valid
            CheckKey(ref key);

            des.Key = HashKey(key, des.KeySize / 8);
            des.IV = HashKey(key, des.KeySize / 8);
            byte[] inputBytes = Encoding.UTF8.GetBytes(stringToEncrypt);

            cryptoStream = new CryptoStream(memoryStream, des.CreateEncryptor(), CryptoStreamMode.Write);
            cryptoStream.Write(inputBytes, 0, inputBytes.Length);
            cryptoStream.FlushFinalBlock();

            return Convert.ToBase64String(memoryStream.ToArray());
        }

        public static string Decrypt(string stringToDecrypt, string key)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            MemoryStream memoryStream = new MemoryStream();
            CryptoStream cryptoStream;

            // Check whether the key is valid, otherwise make it valid
            CheckKey(ref key);

            des.Key = HashKey(key, des.KeySize / 8);
            des.IV = HashKey(key, des.KeySize / 8);
            byte[] inputBytes = Convert.FromBase64String(stringToDecrypt);

            cryptoStream = new CryptoStream(memoryStream, des.CreateDecryptor(), CryptoStreamMode.Write);
            cryptoStream.Write(inputBytes, 0, inputBytes.Length);
            cryptoStream.FlushFinalBlock();

            Encoding encoding = Encoding.UTF8;
            return encoding.GetString(memoryStream.ToArray());
        }

        /// <summary>
        /// Make sure the used key has a length of exact eight characters.
        /// </summary>
        /// <param name="keyToCheck">Key being checked.</param>
        private static void CheckKey(ref string keyToCheck)
        {
            keyToCheck = keyToCheck.Length > 8 ? keyToCheck.Substring(0, 8) : keyToCheck;
            if (keyToCheck.Length < 8)
            {
                for (int i = keyToCheck.Length; i < 8; i++)
                {
                    keyToCheck += DEFAULT_KEY[i];
                }
            }
        }

        /// <summary>
        /// Hash a key.
        /// </summary>
        /// <param name="key">Key being hashed.</param>
        /// <param name="length">Length of the output.</param>
        /// <returns></returns>
        private static byte[] HashKey(string key, int length)
        {
            SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();

            // Hash the key
            byte[] keyBytes = Encoding.UTF8.GetBytes(key);
            byte[] hash = sha1.ComputeHash(keyBytes);

            // Truncate hash
            byte[] truncatedHash = new byte[length];
            Array.Copy(hash, 0, truncatedHash, 0, length);
            return truncatedHash;
        }

        #endregion

3.这个可以上网找找,应该挺多的!

PS:可能我没有说清楚,这个hash只是hash一个key,这个key不用解密

使用时是这样的:string value= Encrypt("222","ID");同样解密string old =Decrypt(value,"ID");

不过这个确实存在楼下中提到的特殊字符问题,请参考他的链接文章

GUO Xingwang | 老鸟四级 |园豆:3885 | 2008-12-18 09:34
其他回答(5)
0

1.判断下只许可一个用户登陆

2.把id=222加密

3.google search

明海哥哥 | 园豆:185 (初学一级) | 2008-12-18 09:19
0

1、在Application里保存一个当前在线用记列表(至少包含用户名和SessionID)当用户登录的时候查这个列表,如果有这个用户的信息就删掉,再把现在登录的用户的信息写进去。(具体实现还有很多方法,不过原理应该是相通的)

2、这个意义可能不大~因为如果都是加密的那别人直接用加的地址访问不跟明文一样?如果你只是不想让人从URL猜到对就数据在数据库里的ID,只能生成链接的时候把参数都先加密,到服务器再解密出来(可以把所有参数一起加密,这样别人连有几人参数都不知道。如:?args=EF982423ACBAE234

这里面把你所有的参数都放进来到服务器再解密,难点应该在服务器获取参数上(可以写个基页专门解密这个参数)

3、我不知道哪有下~~我觉得关键是有个好的、高效的、可配置的脏字过滤方法吧。

个人看法,希望对你有所帮助。

BB_Coder | 园豆:797 (小虾三级) | 2008-12-18 09:27
0

1.你说的是先登陆的断线,那么在WEB环境下不容易实现,因为先登陆的那位事实上已经和服务器断开了,很难做到“即时”的下线,我的思路是这样的:登陆的时候将登陆时间写在cookie中,数据库中再保存一份最后登陆时间,如果当前cookie中的登陆时间比数据库中的早,就说明之后有其他登陆行为,因此此次登陆无效,系统自动退出此帐号。但即使这么做,也必须在用户下一次访问网站的时候才能实现注销的功能

2.你可以使用最简单的base64加密,但base64加密会加密出一些和URL冲突的符号,比如说"/"这个符号,因此淘宝使用的改进后的base64加密,你可以查看一下javaeye上的一帖http://www.javaeye.com/topic/286240  另外当然还能有对称加密和非对称加密等,加密应当在服务器端进行,使用JS加密是对客户端资源的一种考验,但是楼上的使用HASH方法加密,会无法解密,因此你将222的ID加密后再也无法知道这是222了……

3.脏字库可以网上找,我相信搜索一下会很多

Gray Zhang | 园豆:17610 (专家六级) | 2008-12-18 09:45
0

1.不建议让第一个登录的自动掉线,因为可能存在被盗的情况,建议分两步,一提醒已登录者有人在用此帐号登录,二在新登录用户那边设置一个强制下线功能,而不是自动掉线.我们现在的系统采用的就是我说的第二点.

2.你自己都说加密了,用MD5之类的都行.

3.没搞过.你弄好了麻烦告诉我一声.job.chang@live.cn

有所为,有所不为 | 园豆:1200 (小虾三级) | 2008-12-18 10:10
0

第一个问题在web的情况下一般是不考虑的

如果非要考虑就是要有个在线列表

将用户id附加一个登录id 登录id根据随机数生成记录在线表中

然后当再次登录的时候制动清理以前的登录id

第二个

加密什么方法都可以这个无所谓

至于脏字那个

一般都是看效率了

在功能上没什么大问题

小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2008-12-18 11:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册