注册时间12-10-25UID7813YY号
发表于 16-3-21 06:49:11
查看: 747|回复: 29
本帖最后由 子午随风 于 16-3-22 09:32 编辑
首先,雷迪森,杰特们。 我是永远爱你们的 子午随风
- 来自包养你工作室
啊呀,刚才忘记了。。。。打个广告 ,看这里,看这里 ,YY 30频道长期招收应用开发学员&&- 来自于包养你工作室的全心诚意。(对,这才是这篇帖子的核心) 恩,有兴趣就行! 开课时间待定啊!啊! 主讲小卢还在路上!
接下来就是繁杂的技术分享帖啦。。。 文章末尾包含我们工作室在N多小型项目上实践的php-mysql封装类
项目架构为分布式架构。使用BAE+BOS+MYSQL的解决方案搭建。代码逻辑层由BAE执行和计算。图片文件以及静态文件上传由BOS服务提供。BOS+CDN架构保证文件读取的效率和性能。数据库存储系统数据和文件列表索引保证文件地址的拼接和快速加载。
右上角登陆-账号test 密码 test
经典用户:WE陪玩
陪玩后台订单系统+陪玩前台官网系统 100元/月 最低三月起 十个月算一年
内部论坛模块 永久授权
统计分析模块 永久授权
基础系统 和 扩展模块定制- 后台订单系统 以分布式架构+后端集群式服务器保证系统 高流畅性和99.95%的可用性。
15分钟开通,支持绑定自有域名和分配2级域名。
YY知名第三方工作室 - 包养你工作室 荣誉出品。 复制代码登录界面:
16-3-21 06:42 上传
管理员角色界面示例:
16-3-21 06:43 上传
16-3-21 06:43 上传
16-3-21 06:43 上传
16-3-21 06:43 上传
16-3-21 06:43 上传
充值提现功能截图:
16-3-21 06:44 上传
16-3-21 06:44 上传
16-3-21 06:44 上传
用户余额功能完美集成了权限验证方案,由跟路由配置文件和管理员、***、陪练、客户 权限限制。只允许前三者访问和查询。
--系统路由的引用解决了小型项目的MVC架构。因为项目过小而且非开源项目。故为了实现团队协同和代码管理。以url为路由基础自构了简单路由。登陆注册页面因权限控制问题需要游客访问,故使用了特殊的路由标记处理。然后以 管理员、***、陪练、客户 四种角色为基础实现功能跳转和权限控制。所有请求经路由进入系统前台或者后端,故权限以页面数据中转控制更为安全。下图第一行示例有数组注明当前页面的可允许角色列表。
16-3-21 06:39 上传
自页面处理请求完成入库简化了项目代码和架构。
16-3-21 06:39 上传
同样继续延续了封装的MySQL处理类。简化sql语句使用和释放资源操作
文章末尾附带我们工作室自用的工具类封装
数据库字段接受过滤使用的是最原始的关键词替换,小型项目,简单暴力有效。function lib_replace_end_tag($str)
{
if (empty($str))
$str = htmlspecialchars($str);
$str = str_replace( ‘/’, “”, $str);
$str = str_replace(“\\”, “”, $str);
$str = str_replace(“&”, “”, $str);
$str = str_replace(“&”, “”, $str);
$str = str_replace(“&SCRIPT&”, “”, $str);
$str = str_replace(“&/SCRIPT&”, “”, $str);
$str = str_replace(“&script&”, “”, $str);
$str = str_replace(“&/script&”, “”, $str);
$str=str_replace(“select”,”select”,$str);
$str=str_replace(“join”,”join”,$str);
$str=str_replace(“union”,”union”,$str);
$str=str_replace(“where”,”where”,$str);
$str=str_replace(“insert”,”insert”,$str);
$str=str_replace(“delete”,”delete”,$str);
$str=str_replace(“update”,”update”,$str);
$str=str_replace(“like”,”like”,$str);
$str=str_replace(“drop”,”drop”,$str);
$str=str_replace(“create”,”create”,$str);
$str=str_replace(“modify”,”modify”,$str);
$str=str_replace(“rename”,”rename”,$str);
$str=str_replace(“alter”,”alter”,$str);
$str=str_replace(“cas”,”cast”,$str);
$str=str_replace(“&”,”&”,$str);
$str=str_replace(“&”,”&”,$str);
$str=str_replace(“&“,”&“,$str);
$str=str_replace(” “,chr(32),$str);
$str=str_replace(” “,chr(9),$str);
$str=str_replace(” “,chr(9),$str);
$str=str_replace(“&”,chr(34),$str);
$str=str_replace(“‘”,chr(39),$str);
$str=str_replace(“
”,chr(13),$str);
$str=str_replace(“””,”‘”,$str);
$str=str_replace(“css”,”‘”,$str);
$str=str_replace(“CSS”,”‘”,$str);
}复制代码由于系统商业保密,技术端解决方案则是用本地数组区分页面权限功能,解决多角色切换或者多角色页面权限限制。在数组中的设置一实时与数据后端刷新的方法验证当前用户是否具备当前页面的访问。解决因session丢失或者cookies破解带来的权限验证问题。比较棘手的就是在分布式架构下这种验证为了保证用户连贯性采用实时数据对比 无形中增加了数据库的压力,但在小型项目中无需缓存的介入。 MySQL的性能还是比人强的 = = ~/*
+-----------------------------------------------
| 文件概要:MYSQL数据库连接类
| 文件名称:mysql.class.php
| 创建时间:
+-----------------------------------------------
*/
class mysql {
private $ //服务器名
private $ //数据库用户名
private $ //数据库密码
private $ //数据库名
private $ //MYSQL连接标识符
private $charset = “utf8”; //数据库编码,默认为UTF8
/*=====================================================
* 方法:__construct
* 功能:构造函数
* 参数:$server,$user,$password,$database,$charset
* 说明:实例化时自动连接数据库.
====================================================*/
function __construct($server, $user, $password, $database, $charset) {
$this-&server = $
$this-&user = $
$this-&password = $
$this-&database = $
$this-&charset = $
$this-&connect();
}
/*====================================================
* 方法:connect
* 功能:连接数据库
* 参数:无
* 说明:连接MYSQL服务器,连接数据库,设置字符编码
===================================================*/
function connect() {
$this-&link = mysql_connect($this-&server, $this-&user, $this-&password) or die($this-&error(“数据服务器连接出错,请刷新重试!”));
mysql_select_db($this-&database, $this-&link) or die($this-&error(“数据库连接出错,请刷新重试!”));
mysql_query(“set names ‘$this-&charset'”);
}
/*===================================================
* 方法:query
* 功能:执行SQL
* 参数:$sql
* 说明:对传过来的SQL语句执行,并返回结果$result资源标识符
==================================================*/
function query($sql) {
$result = mysql_query($sql, $this-&link);
if (!$result) {
$this-&error($sql . “语句执行失败!”);
} else {
return $
}
}
/*===================================================
* 方法:fetcharray
* 功能:从结果集中取一行做为数组
* 参数:$result资源标识符
* 说明:需要提供SQL语句执行返回的资源标识符
==================================================*/
function fetcharray($result) {
return mysql_fetch_array($result);
}
/*===================================================
* 方法:fetchall
* 功能:从结果集中取出所有记录做为二维数组$arr
* 参数:$result资源标识符
* 说明:循环取所有记录保存为$arr
==================================================*/
function fetchall($result) {
$arr = array ();
while ($row = mysql_fetch_array($result)) {
$arr[] = $
}
mysql_free_result($result);
return $
}
/*===================================================
* 方法:numrows
* 功能:统计结果集中记录数
* 参数:$result资源标识符
* 说明:统计行数
==================================================*/
function numrows($result) {
return mysql_num_rows($result);
}
/*===================================================
* 方法:numfields
* 功能:统计结果集中字段数
* 参数:$result资源标识符
* 说明:统计字段数
==================================================*/
function numfields($result) {
return mysql_num_fields($result);
}
/*===================================================
* 方法:affectedrows
* 功能:取得前一次MySQL操作所影响的记录行数
* 参数:无
* 说明:取得前一次MySQL操作所影响的记录行数
==================================================*/
function affectedrows() {
return mysql_affected_rows($this-&link);
}
/*===================================================
* 方法:version
* 功能:取得MYSQL版本
* 参数:无
* 说明:取得当前数据库服务器MYSQL的版本
==================================================*/
function version() {
return mysql_get_server_info();
}
/*===================================================
* 方法:insertid
* 功能:取得上一步INSERT操作产生的ID
* 参数:无
* 说明:取得上一步INSERT操作产生的自增字段ID
==================================================*/
function insertid() {
return mysql_insert_id($this-&link);
}
/*===================================================
* 方法:checksql
* 功能:检查SQL语句
* 参数:SQL语句
* 说明:过滤sql注入
==================================================*/
function checksql($db_string, $querytype = ‘select’) {
$clean = ”;
$old_pos = 0;
$pos = - 1;
//如果是普通查询语句,直接过滤一些特殊语法
if ($querytype == ‘select’) {
$notallow1 = “[^0-9a-z@\._-]{1,}(union|sleep|benchmark|load_file|outfile)[^0-9a-z@\.-]{1,}”;
//$notallow2 = “-|/\*”;
if (eregi ( $notallow1, $db_string )) {
exit ( “&font size=’5′ color=’red’&Safe Alert: Request Error step 1 !&/font&” );
}
}
//完整的SQL检查
while ( true ) {
$pos = strpos ( $db_string, ‘\”, $pos + 1 );
if ($pos === false) {
}
$clean .= substr ( $db_string, $old_pos, $pos - $old_pos );
while ( true ) {
$pos1 = strpos ( $db_string, ‘\”, $pos + 1 );
$pos2 = strpos ( $db_string, ‘\\’, $pos + 1 );
if ($pos1 === false) {
} elseif ($pos2 == false || $pos2 & $pos1) {
$pos = $pos1;
}
$pos = $pos2 + 1;
}
$clean .= ‘$s$’;
$old_pos = $pos + 1;
}
$clean .= substr ( $db_string, $old_pos );
$clean = trim ( strtolower ( preg_replace ( array (‘~\s+~s’ ), array (‘ ‘ ), $clean ) ) );
//老版本的Mysql并不支持union,常用的程序里也不使用union,但是一些黑客使用它,所以检查它
if (strpos ( $clean, ‘union’ ) !== false && preg_match ( ‘~(^|[^a-z])union($|[^[a-z])~s’, $clean ) != 0) {
$fail =
}
//发布版本的程序可能比较少包括-,#这样的注释,但是黑客经常使用它们
elseif (strpos ( $clean, ‘/*’ ) & 2 || strpos ( $clean, ‘-‘ ) !== false || strpos ( $clean, ‘#’ ) !== false) {
$fail =
}
//这些函数不会被使用,但是黑客会用它来操作文件,down掉数据库
elseif (strpos ( $clean, ‘sleep’ ) !== false && preg_match ( ‘~(^|[^a-z])sleep($|[^[a-z])~s’, $clean ) != 0) {
$fail =
} elseif (strpos ( $clean, ‘benchmark’ ) !== false && preg_match ( ‘~(^|[^a-z])benchmark($|[^[a-z])~s’, $clean ) != 0) {
$fail =
} elseif (strpos ( $clean, ‘load_file’ ) !== false && preg_match ( ‘~(^|[^a-z])load_file($|[^[a-z])~s’, $clean ) != 0) {
$fail =
} elseif (strpos ( $clean, ‘into outfile’ ) !== false && preg_match ( ‘~(^|[^a-z])into\s+outfile($|[^[a-z])~s’, $clean ) != 0) {
$fail =
}
//老版本的MYSQL不支持子查询,我们的程序里可能也用得少,但是黑客可以使用它来查询数据库敏感信息
elseif (preg_match ( ‘~\([^)]*?select~s’, $clean ) != 0) {
$fail =
}
if (! empty ( $fail )) {
exit ( “&font size=’5′ color=’red’&Safe Alert: Request Error step 2!&/font&” );
} else {
return $db_
}
}
/*===================================================
* 方法:close
* 功能:关闭连接
* 参数:无
* 说明:关闭非永久数据库连接
==================================================*/
function close() {
mysql_close($this-&link);
}
/*===================================================
* 方法:error
* 功能:提示错误
* 参数:$err_msg
* 说明:对给出的错误提示内容给予ECHO
==================================================*/
function error($err_msg = “”) {
if ($err_msg == “”) {
echo “Errno:” . mysql_errno . “&/br&”;
echo “Error:” . mysql_error . “&/br&”;
} else {
echo $err_
}
}
/*===================================================
* 方法:__destruct
* 功能:析构函数
* 参数:无
* 说明:释放类,关闭连接
==================================================*/
function __destruct() {
if(is_resource($this-&link)){
$this-&close();
}
}
}复制代码
(21.4 KB, 下载次数: 22)
16-3-21 06:40 上传
点击文件名下载附件
&宝宝,红色高亮是不允许的哦~&
发表于 16-3-21 11:53
楼主棒棒的!
注册时间12-8-29UID3655YY号
发表于 16-3-21 07:01:39
虽然看不懂,但是感觉好厉害的样子
给你99分,还有一分怕你骄傲
注册时间13-7-24UID28949YY号
发表于 16-3-21 07:24:10
看得我眼花缭乱 厉害啊
注册时间13-4-9UID18158威望3 臭虫0 人气7952 虾贝1 虾币337 经验5 虾米237 在线时间522 小时积分18150
特邀灌水员
终极大虾Lv.16, 积分 18150, 距离下一级还需 1850 积分
威望3 臭虫0 虾贝1 虾币337 经验5 积分18150
发表于 16-3-21 07:33:57
看不懂。。。。。。但是支持
注册时间13-3-26UID16369YY号
发表于 16-3-21 07:47:04
讲的好深奥,装作看不懂的样子→_→
注册时间13-7-28UID44320YY号
发表于 16-3-21 09:28:12
和楼上的所有人一样,瞬间就蒙了,话说这是什么,挺想知道~
注册时间14-9-5UID512751YY号威望0 臭虫0 人气1315 虾贝0 虾币234 经验12 虾米3508 在线时间69 小时积分4099
资深大虾Lv.10, 积分 4099, 距离下一级还需 901 积分
YY号威望0 臭虫0 虾贝0 虾币234 经验12 积分4099
发表于 16-3-21 09:40:05
我也要编程…………
注册时间13-7-28UID46737YY号
发表于 16-3-21 11:15:19
这都是啥啊,看不懂
注册时间13-9-2UID155453YY号威望0 臭虫0 人气3012 虾贝1 虾币1007 经验48 虾米2561 在线时间1687 小时积分23421
低头靠勇气,抬头靠实力.°
传奇神虾Lv.17, 积分 23421, 距离下一级还需 1579 积分
YY号威望0 臭虫0 虾贝1 虾币1007 经验48 积分23421
发表于 16-3-21 11:30:41
我去了 看的我眼睛都疼了~
一人一条小毛巾,?出你的自信心.°
注册时间12-10-25UID7813YY号
发表于 16-3-21 11:45:23
荏苒。 发表于 16-3-21 09:28
和楼上的所有人一样,瞬间就蒙了,话说这是什么,挺想知道~
O(∩_∩)O哈哈哈~ 一篇技术分享啦
通过虾米购买的论坛勋章
新版虾哥勋章
通过虾米购买的论坛勋章
新版论坛光荣测试人员
优秀论坛版主
和30频道马甲无关
虾哥六周年周年勋章
通过商城购买、频道摇骰子获得
30频道会员
30频道会员勋章(永久)
虾哥论坛初级写手
帖子大于100
虾哥论坛奥运勋章
虾哥论坛中级写手
帖子大于200
萌哒哒的手游勋章
新版测试虾
新版测试虾专属勋章
职业游虾中级
在线时间超过1000小时的虾哥论坛职业游侠
职业游虾初级
在线时间超过500小时的虾哥论坛职业游侠
虾哥论坛高级写手
帖子大于500
30频道VIP(永久)
领取后请联系920650上马甲
职业游虾终极
在线时间超过10000小时的虾哥论坛职业游侠
我是聚财小能手
虾哥购买以及活动发放 珍贵勋章发放量少
快看活动勋章
快看活动勋章
小恐龙定制版勋章
仅由产品建议版块限量颁发
通过虾米购买价格5000虾米富豪象征
白富美/高富帅
虾米大于2000的虾友
虾哥论坛人气大于500
虾哥论坛五周年勋章
虾哥论坛五周年勋章
虾哥六周年活动勋章
通过论坛活动获得
好丽友勋章
虾米购买哦
天平座勋章
个性化十二星座勋章,用户可用虾米购买
射手座勋章
个性化十二星座勋章,用户可用虾米购买
丘比特勋章
丘比特勋章
连续签到168天可获得 有效期183天(自动发放)
初级热心虾友
在问答版块协助虾友解决问题
看图猜歌送勋章
看图猜歌送勋章
通过虾米购买的论坛勋章
白羊座勋章
个性化十二星座勋章,用户可用虾米购买
金牛座勋章
个性化十二星座勋章,用户可用虾米购买
双子座勋章
个性化十二星座勋章,用户可用虾米购买
巨蟹座勋章
个性化十二星座勋章,用户可用虾米购买
处女座勋章
个性化十二星座勋章,用户可用虾米购买
狮子座勋章
个性化十二星座勋章,用户可用虾米购买
通过虾米购买的论坛勋章
天蝎座勋章
个性化十二星座勋章,用户可用虾米购买
连续签到90天可获得 有效期100天(自动发放)
连续签到365天可获得 有效期365天(自动发放)
摩羯座勋章
个性化十二星座勋章,用户可用虾米购买
水瓶座勋章
个性化十二星座勋章,用户可用虾米购买
双鱼座勋章
个性化十二星座勋章,用户可用虾米购买全新职业和公会玩法公布 《超级地城之光》7月27日重磅更新
由盛大与韩国知名游戏厂商Eyedentity Games联手打造的手游《超级地城之光》重大更新全面开启。《超级地城之光》是韩国动作 MMORPG《地城之光》的手游版,游戏中有四个基本职业:战士、游侠、法师、牧师,但与许多同类游戏相区别的是,本作可以使用一个角色同时体验多个职业,并且可以继承其他职业的技能,打出跨越职业的组合技。
全新职业【刺客】、全新公会掠夺战将于7月27日震撼登场,为你重新诠释控制与爆发的魅力所在。与此同时,全新时装铭刻、战魂训练全服亮相,也让游戏有了更多的成长性。相信在此次更新之后,《超级地城之光》的冒险之旅。会愈发精彩。
新职业【刺客】:隐匿在黑暗中的职业,鲁米那大陆古老忍者的后裔。拥有替身术,控制技能以及超强伤害爆发力的近战职业。
新公会玩法:参与全新公会玩法-掠夺战,个人掠夺榜第一名可获得永久称号“霸道总裁”,公会掠夺榜第一的公会成员,可获得称号“巧取豪夺”;
《超级地城之光》7月全新资料片“公会掠夺战”即将强势来袭,想要了解新版更多精彩资讯及后续福利活动,敬请留意任玩堂的后续报道。
您可能还喜欢
3D乱斗手游《超级地城之光》重磅来袭,五大“猛料”新战场、新时装、新战魂、新副本、新活动全面开启。
《超级地城之光》金秋十月版10月26日将至,新职业、新时装、新战魂已列队恭候,与此同时,还将开放130级全新等级上限.
我们将在每周五筛选最精华的 1-2 款游戏推荐给你,本周的新游质量都不俗,但最终我们选择了这两款游戏。
《侠盗一号》上映以来总被说“根本不按星战的套路来”,其实手游圈早有不甩A3大作系列套路,却依然被捧得很高的“外传”了。
随时,随地
扫描二维码
下载任玩堂客户端
热门搜索:
广州联亿网络科技有限公司
Copyright 2009- Inc. All rights reserved.
地址:广州市天河区天河路490号壬丰大厦1801
***:020-