我在做一个游戏网站,主页有个功能:一个身份证号可以领取一个游戏帐号和密码,
帐号里送了3w财富。
一开始是根据ip地址来限制的,一个ip地址限领5次,后来发现有人生成很多身份证号码,换着ip地址天天来领取,1w个帐号很快就没了....
怎么能获得客户端的机器码或者别的唯一标识? 就可以控制换ip的问题了。
或者,大家有更好的办法吗?
谢谢,在线等待.........
解决方案 »
- 为什么总是找不到我配置的IHttpModule
- 如何清除repeater中的删除二个字呢?
- 如何用绑定的数据做DIV+CSS的导航?
- GridView的自定义修改界面
- GridView弹出制定大小新窗口
- onserverclick="aaa('<%# Eval("FilePath") %>')"怎么写?
- 今天就差5分就到500专家分了,就是没人结贴,郁闷,散分..................
- 新手入门级两个问题,求教老鸟~~
- 做棵树,用xml呢,还是用数据库?
- .net怎样在服务器返回一个数组到页面的js里面,不是用get方法
- 三层架构中,业务逻辑层和表示层应该如何明确分离?各自的责任如何明确?请指教.
- FormView控件不太好用啊?!
游戏地址:www.gamektv.com ,有兴趣去看看:)
很有难度...
就像CSDN的帐户一样
....楼主应该 考虑更合理的 发放方式
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;
}
<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>
公司要求这么发放的(因为是初期阶段,为了聚集人气),有些玩家稍微多领点也容许。
现在就试试MAC地址的方法,真是非常感谢大家,有时间去我们游戏里玩,我多送你们财富:)网址:www.gamektv.com (不过送财富活动被我暂时取消了,因为1w个帐号已经被领完了,
做完mac地址限制后再放上去)
就像CSDN的帐户一样
//
// 读取硬盘序列号
// 参数: 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;
}
IP地址,更不可靠.这种问题,不能用纯技术来解决的...