我在做一个游戏网站,主页有个功能:一个身份证号可以领取一个游戏帐号和密码,
帐号里送了3w财富。
   一开始是根据ip地址来限制的,一个ip地址限领5次,后来发现有人生成很多身份证号码,换着ip地址天天来领取,1w个帐号很快就没了....
   怎么能获得客户端的机器码或者别的唯一标识? 就可以控制换ip的问题了。
   或者,大家有更好的办法吗?
   谢谢,在线等待.........

解决方案 »

  1.   

    现在游戏是初期阶段,就是为了增加人气,不可能每天只发100个,closetome,谢谢你的建议
      游戏地址:www.gamektv.com ,有兴趣去看看:)
      

  2.   

    web客户端获取机器码?
    很有难度...
      

  3.   

    这个问题不能纯靠技术解决
    就像CSDN的帐户一样
      

  4.   

    获取客户端的mac地址,这个能唯一标示
      

  5.   

    mac一样可以改掉
    ....楼主应该 考虑更合理的 发放方式
      

  6.   

    获取MACusing System;
    using System.Security.Cryptography;   
    using System.Management; 
    public ArrayList GetIt()     
    {     
    ManagementClass   mc   =   new   ManagementClass("Win32_NetworkAdapterConfiguration");     
    ManagementObjectCollection   moc   =   mc.GetInstances();     
    ArrayList   strArr   =   new   ArrayList();   
        
    //网卡数   
    foreach(ManagementObject   mo   in   moc)     
    {   
    if((bool)mo["IPEnabled"])     
    {   
    strArr.Add(mo["MacAddress"].ToString().Replace(":",""));   
    }   
    mo.Dispose();   
    }   
        
    return   strArr;     
    }
      

  7.   

    <HTML><HEAD><TITLE>WMI Scripting HTML</TITLE>
    <META http-equiv=Content-Type content="text/html; charset=gb2312">
    <SCRIPT language=JScript event="OnCompleted(hResult,pErrorObject, pAsyncContext)" for=foo>
     document.forms[0].txtMACAddr.value=unescape(MACAddr);
     document.forms[0].txtIPAddr.value=unescape(IPAddr);
     document.forms[0].txtDNSName.value=unescape(sDNSName);
     //document.formbar.submit();
      </SCRIPT><SCRIPT language=JScript event=OnObjectReady(objObject,objAsyncContext) for=foo>
       if(objObject.IPEnabled != null && objObject.IPEnabled != "undefined" && objObject.IPEnabled == true)
       {
        if(objObject.MACAddress != null && objObject.MACAddress != "undefined")
        MACAddr = objObject.MACAddress;
        if(objObject.IPEnabled && objObject.IPAddress(0) != null && objObject.IPAddress(0) != "undefined")
        IPAddr = objObject.IPAddress(0);
        if(objObject.DNSHostName != null && objObject.DNSHostName != "undefined")
        sDNSName = objObject.DNSHostName;
        }
      </SCRIPT><META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
    <BODY>
    <OBJECT id=locator classid=CLSID:76A64158-CB41-11D1-8B02-00600806D9B6 VIEWASTEXT></OBJECT>
    <OBJECT id=foo classid=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></OBJECT>
    <SCRIPT language=JScript>
       var service = locator.ConnectServer();
       var MACAddr ;
       var IPAddr ;
       var DomainAddr;
       var sDNSName;
       service.Security_.ImpersonationLevel=3;
       service.InstancesOfAsync(foo, 'Win32_NetworkAdapterConfiguration');
       </SCRIPT><FORM id="formfoo" name="formbar" action="index.do" method="post"><INPUT value="00-11-11-B4-52-EF"   name="txtMACAddr"> <INPUT value="202.102.188.170"  name="txtIPAddr"> <INPUT value="jackly" name="txtDNSName"> </FORM></BODY></HTML>
      

  8.   

    IE在安全设置里面是禁止不安全的 ActiveX 控件的,用 JavaScript 是获取不到 Mac,ip,机器名的。
      

  9.   

    谢谢大家了,大家把玩家当作技术高手了,呵呵^_^
    公司要求这么发放的(因为是初期阶段,为了聚集人气),有些玩家稍微多领点也容许。
    现在就试试MAC地址的方法,真是非常感谢大家,有时间去我们游戏里玩,我多送你们财富:)网址:www.gamektv.com (不过送财富活动被我暂时取消了,因为1w个帐号已经被领完了,
        做完mac地址限制后再放上去)
      

  10.   

    这个问题不能纯靠技术解决
    就像CSDN的帐户一样
      

  11.   

    可以获取硬盘、主板等序列号。///////////////////////////////////////////////////////////////////////
    //
    // 读取硬盘序列号
    // 参数: vstrSNo 硬盘序列号
    // vstrType 硬盘型号
    // 返回值:0 正确
    // 时间: 2006-01-09
    // 版本: 1.0
    // 历史:
    //
    ///////////////////////////////////////////////////////////////////////
    int GetDiskSNo(vector<CString> & vstrSNo, vector<CString> & vstrType)
    {
    BYTE ucTemp;
    BYTE pucSNo[20];
    BYTE pucType[40];
    BYTE pucTemp[40];
    int nStartPos;
    int nEndPos;
    int nSCount;
    int nTemp;
    DWORD ulOutBytes;
    CString strDisk;
    CString strTemp; HANDLE hDisk; GETVERSIONINPARAMS uVersionParams; memset(&uVersionParams, 0, sizeof(GETVERSIONINPARAMS)); vstrSNo.clear();
    vstrType.clear(); //枚举硬盘
    for (int nCount = 0; nCount < 4; nCount++)
    {
    strDisk.Format( "\\\\.\\PHYSICALDRIVE%d", nCount );
    hDisk = CreateFile(strDisk, GENERIC_READ | GENERIC_WRITE,
                FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    if (hDisk != INVALID_HANDLE_VALUE)
    {
    if (DeviceIoControl(hDisk, 0x00074080/*DFP_GET_VERSION*/,
    NULL, 0, &uVersionParams, sizeof(GETVERSIONINPARAMS),
    &ulOutBytes, NULL))
    {
    if (uVersionParams.bIDEDeviceMap != 0)
    {
    BYTE ucIDCmd = 0;
    SENDCMDINPARAMS uSendCmd; memset(&uSendCmd, 0, sizeof(SENDCMDINPARAMS)); ucIDCmd = (uVersionParams.bIDEDeviceMap >> nCount & 0x10) ? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;
                        BYTE pucIdOutCmd[sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1] = { 0 }; // Set up data structures for IDENTIFY command.
    uSendCmd.cBufferSize = IDENTIFY_BUFFER_SIZE;
    uSendCmd.irDriveRegs.bFeaturesReg = 0;
    uSendCmd.irDriveRegs.bSectorCountReg = 1;
    uSendCmd.irDriveRegs.bSectorNumberReg = 1;
    uSendCmd.irDriveRegs.bCylLowReg = 0;
    uSendCmd.irDriveRegs.bCylHighReg = 0;

    // calc the drive number.
    ucTemp = (BYTE)nCount;
    uSendCmd.irDriveRegs.bDriveHeadReg = 0xA0 | ((ucTemp & 1) << 4);

    // The command can either be IDE identify or ATAPI identify.
    uSendCmd.irDriveRegs.bCommandReg = ucIDCmd;
    uSendCmd.bDriveNumber = ucTemp;
    uSendCmd.cBufferSize = IDENTIFY_BUFFER_SIZE; if (DeviceIoControl(hDisk, DFP_RECEIVE_DRIVE_DATA,
    &uSendCmd, sizeof(SENDCMDINPARAMS) - 1,
    pucIdOutCmd,
    sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1,
    &ulOutBytes, NULL))
    {
    //拷贝序列号
    memset(pucTemp, 0, 40);
    strTemp.Empty(); memcpy(pucSNo, 
    ((IDINFO*)(((PSENDCMDOUTPARAMS)pucIdOutCmd)->bBuffer))->sSerialNumber, 20);
    nStartPos = 0;
    while (pucSNo[nStartPos] == 32)
    {
    nStartPos++;
    }
    nEndPos = 19;
    while (pucSNo[nEndPos] == 0)
    {
    nEndPos--;
    }
    memcpy(pucTemp, &pucSNo[nStartPos], nEndPos - nStartPos + 1);
    for (nSCount = 0; nSCount < nEndPos - nStartPos; nSCount += 2)
    {
    ucTemp = pucTemp[nSCount + 1];
    pucTemp[nSCount + 1] = pucTemp[nSCount];
    pucTemp[nSCount] = ucTemp;
    }
    pucTemp[nEndPos - nStartPos + 1] = '\0';
    strTemp = pucTemp;
    vstrSNo.push_back( strTemp ); //拷贝型号
    memset(pucTemp, 0, 40);
    strTemp.Empty(); memcpy(pucType, 
    ((IDINFO*)(((PSENDCMDOUTPARAMS)pucIdOutCmd)->bBuffer))->sModelNumber, 40);
    for (nSCount = 0; nSCount < 40; nSCount++)
    {
    if (pucType[nSCount] == 32)
    {
    break;
    }
    else
    {
    nTemp = nSCount;
    pucTemp[nSCount] = pucType[nSCount];
    }
    }
    for (nSCount = 0; nSCount < nTemp; nSCount += 2)
    {
    ucTemp = pucTemp[nSCount + 1];
    pucTemp[nSCount + 1] = pucTemp[nSCount];
    pucTemp[nSCount] = ucTemp;
    }
    pucTemp[nTemp + 1] = '\0';
    strTemp = pucTemp;
    vstrType.push_back(strTemp);
    }
    }
    } CloseHandle(hDisk);
    }
    } return 0;
    }
      

  12.   

    取mac的有时也有问题,这个问题跟那个投票系统原理差不多,想取唯一的标识,但一般来说不太可能达到很理想的目的,毕竟是客户端的东西,如果全部那么容易的就取到了,还有什么安全可言
      

  13.   

    MAC地址也可以用软件修改之后,欺骗你的程序.
    IP地址,更不可靠.这种问题,不能用纯技术来解决的...