前言
这个其实目的只是为了配合软件用的,昨天帮个朋友写个软件需要这种网络验证的功能,太复杂的没研究过,所以自己写了一个简单的。贴上来共同学习,哪里可以改善欢迎提出。有兴趣的朋友可以参考一下
代码
<?php
header("Content-type: text/html; charset=utf-8");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache");
header("Pragma: no-cache");
date_default_timezone_set("PRC");
//全局变量//
$effect = @$_GET["effect"]; //GET,执行指定动作 1=登陆 2=注册 3=充值 4=生成卡密
$ver = @$_GET["ver"]; //GET,接收软件版本号
$name = @$_GET["name"]; //GET,接收用户名
$pw = @$_GET["pw"]; //GET,接收密码
//$email = @$_GET["email"]; //GET,接收邮箱
$key = @$_GET["key"]; //GET,接收卡密
$day = @$_GET["day"]; //GET,接收卡密天数
$time = date("Y-m-d"); //获取当前时间,用于验证
//数据库//
$mysql = @mysql_connect("localhost","root","123456789"); //服务期地址,数据库账号,数据库密码
$db = @mysql_select_db("demo",$mysql); //选择要连接的数据库
//开始工作//
if($db){
//检查更新
$update = "SELECT * FROM `update`"; //SQL命令,查询
$query = mysql_query($update); //执行SQL命令
$result = mysql_fetch_array($query); //储存结果
if($result['new'] > $ver){
echo $result['url'];
}
//登陆
if($effect === "1"){
$login = "SELECT * FROM `user` WHERE `name` LIKE '".$name."' AND `pw` LIKE '".$pw."'"; //SQL命令,查询
$query = mysql_query($login); //执行SQL命令
$result = mysql_fetch_array($query); //储存结果
if($result['name'] == ""){
ob_end_clean();
echo '用户不存在或者密码错误';
exit();
}elseif($result['time'] <= $time){
ob_end_clean();
echo '您的账号已到期,请充值后重试';
exit();
}elseif($result['online'] == "1"){
ob_end_clean();
echo '该用户正在使用中,请勿重复登陆';
exit();
}else{
$online="UPDATE `user` SET `online` = '1' WHERE `name` = '".$name."'"; //SQL命令,写入用户在线状态
@mysql_query($online); //执行SQL命令
ob_end_clean();
echo '登陆成功';
exit();
}
}
//注册
if($effect === "2"){
$register = "SELECT * FROM `user` WHERE `name` = '".$name."'";//SQL命令,判断用户名是否存在
$query = mysql_query($register); //执行SQL命令
$result = mysql_fetch_array($query); //储存结果
if($result['name'] == ""){
$register = "INSERT INTO `user` (`name`, `pw`, `time`, `online`) VALUES ('".$name."', '".$pw."', '".$time."', '0');";
@mysql_query($register); //执行SQL命令
ob_end_clean();
echo '注册成功';
exit();
}else{
ob_end_clean();
echo '抱歉,这个用户名已经存在';
exit();
}
}
//充值
if($effect === "3"){
$recharge = "SELECT * FROM `key` WHERE `key` = '".$key."'";//SQL命令,判断卡密是否存在
$query = mysql_query($recharge); //执行SQL命令
$result = mysql_fetch_array($query); //储存结果
if($result['key'] == ""){
ob_end_clean();
echo '抱歉,充值卡密不存在或者错误';
exit();
}else{
$day = $result['day'];//记录卡密天数
$time = date("Y-m-d",strtotime("+$day day")); //获取当前时间,用于验证
@mysql_query("DELETE FROM `key` WHERE `key` = '".$key."'");//删除卡密
@mysql_query("UPDATE `user` SET `time` = '".$time."' WHERE `name` = '".$name."'");//充值
ob_end_clean();
echo '充值成功';
exit();
}
}
//生成卡密
if($effect === "4"){
$generate = "SELECT * FROM `key` WHERE `key` = '".$key."'";//SQL命令,判断卡密是否存在
$query = mysql_query($generate); //执行SQL命令
$result = mysql_fetch_array($query); //储存结果
if($result['key'] == ""){
@mysql_query("INSERT INTO `key` (`key`, `day`) VALUES ('".$key."', '".$day."')");//生成卡密
ob_end_clean();
echo '添加充值卡密成功';
exit();
}else{
ob_end_clean();
echo '抱歉,充值卡密已经存在,请重试';
exit();
}
}
}else{
echo '服务期维护中,请稍后重试';
}
?>
差不多就是这样,数据库的话自己按着代码折腾把...
你这代码不会是用在你这个站上吧,要不然我有办法可以攻破.???
接口最好使用类来操作
"4"不是全等于4,这个注意就行
1.不建议使用like迷糊查询以及*,可以使用 SELECT time,online,pw FROM `user` WHERE `name`='{$name}' LIMIT 1
根据返回数据判断是否密码正确等等操作
2.不要相信用户给你的数据,接收的参数必须过滤(推荐正则)
3.可以考虑预处理
何不封装个查询了。
支持
这。。。看着感觉不安全- -,全是裸的,也没过滤?
想要安全一些最普遍的做法就是把数据库单独写在一个比如conn.inc.php的文件里,然后调用就行了。没什么不安全的,除非有高人能攻破你的服务器
用户名和密码都没限制输入的内容,你确定不会出现where 1=1?
噢,刚才去了解了一下,按照你说的,再密码部分的POST加个or 1=1确实是可以绕过登录验证,不过只是绕过了登录验证而已,并不能绕过时间验证,所以等于绕过也没用。难道还会有什么更危险的操作?我对SQL注入方面不是很懂,是否值得加上mysql_real_escape_string()?
能加一下QQ请教一下吗,我的QQ279721075
用户名和密码都没限制输入的内容,你确定不会出现where 1=1?
好久没来了~
随时欢迎呐!你博客换新主题了哟,很漂亮?
代码显示很漂亮
不错,写得很好。
谢谢大雄,其实我觉得写得有点乱?