1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 |
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Collections; namespace DBUtility { /// <summary> /// 数据库操作类 /// </summary> public abstract class SqlHelper { // 数据库连接 public static readonly string ConnectionStringLocalTransaction = ConfigurationManager.ConnectionStrings["SQLConnString1"].ConnectionString; // 用哈希表缓存参数 private static readonly Hashtable ParmCache = Hashtable.Synchronized(new Hashtable()); /// <summary> /// 执行一个SQL语句(连接字符串) /// </summary> /// <param name="connectionString">连接字符串</param> /// <param name="cmdType">命令类型</param> /// <param name="cmdText">命令字符串</param> /// <param name="commandParameters">参数集</param> /// <returns>返回命令影响的行数</returns> public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) { var cmd = new SqlCommand(); using (var conn = new SqlConnection(connectionString)) { PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); var val = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); return val; } } /// <summary> /// 执行一个SQL语句(连接对象) /// </summary> /// <param name="connection">一个已经存在的连接对象</param> /// <param name="cmdType">命令类型</param> /// <param name="cmdText">命令字符串</param> /// <param name="commandParameters">参数集</param> /// <returns>返回命令影响的行数</returns> public static int ExecuteNonQuery(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) { var cmd = new SqlCommand(); PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters); var val = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); return val; } /// <summary> /// 执行一个SQL语句(事务) /// </summary> /// <param name="trans">一个已经存在的事务</param> /// <param name="cmdType">命令类型</param> /// <param name="cmdText">命令字符串</param> /// <param name="commandParameters">参数集</param> /// <returns>an int representing the number of rows affected by the command</returns> public static int ExecuteNonQuery(SqlTransaction trans, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) { var cmd = new SqlCommand(); PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters); var val = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); return val; } /// <summary> /// 执行一个返回DataReader的SQL语句 /// </summary> /// <param name="connectionString">一个有效的连接字符串</param> /// <param name="cmdType">命令类型</param> /// <param name="cmdText">命令字符串</param> /// <param name="commandParameters">参数集</param> /// <returns>返回一个DataReader对象</returns> public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) { var cmd = new SqlCommand(); var conn = new SqlConnection(connectionString); // we use a try/catch here because if the method throws an exception we want to // close the connection throw code, because no datareader will exist, hence the // commandBehaviour.CloseConnection will not work try { PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); var rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); cmd.Parameters.Clear(); return rdr; } catch { conn.Close(); throw; } } /// <summary> /// 返回DataSet /// </summary> /// <param name="connectionString"></param> /// <param name="cmdText"></param> /// <param name="cmdParms"></param> /// <returns></returns> public static DataSet ExecuteDataSet(string connectionString, string cmdText, params SqlParameter[] cmdParms) { using (var connection = new SqlConnection(connectionString)) { var cmd = new SqlCommand(); PrepareCommand(cmd,connection,null,CommandType.Text,cmdText,cmdParms); using (var da = new SqlDataAdapter(cmd)) { var ds = new DataSet(); try { da.Fill(ds, "ds"); cmd.Parameters.Clear(); } catch (SqlException ex) { throw new Exception(ex.Message); } return ds; } } } /// <summary> /// 根据SQL语句返回DataSet /// </summary> /// <param name="cmdText"></param> /// <param name="cmdParms"></param> /// <returns></returns> public static DataSet Query(string cmdText, params SqlParameter[] cmdParms) { using (var connection = new SqlConnection(ConnectionStringLocalTransaction)) { var cmd = new SqlCommand(); PrepareCommand(cmd, connection, null, CommandType.Text, cmdText, cmdParms); using (var da = new SqlDataAdapter(cmd)) { var ds = new DataSet(); try { da.Fill(ds, "ds"); cmd.Parameters.Clear(); } catch (SqlException ex) { throw new Exception(ex.Message); } return ds; } } } /// <summary> /// 执行返回一个对象的SQL语句(连接字符串) /// </summary> /// <param name="connectionString">连接字符串</param> /// <param name="cmdType">命令类型</param> /// <param name="cmdText">命令字符串</param> /// <param name="commandParameters">参数集</param> /// <returns>返回一个object对象,对象中只包含一列。</returns> public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) { var cmd = new SqlCommand(); using (var connection = new SqlConnection(connectionString)) { PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters); var val = cmd.ExecuteScalar(); cmd.Parameters.Clear(); return val; } } /// <summary> /// 执行返回一个对象的SQL语句(连接对象) /// </summary> /// <param name="connection">一个已经存在的连接对象</param> /// <param name="cmdType">命令类型</param> /// <param name="cmdText">命令字符串</param> /// <param name="commandParameters">参数集</param> /// <returns>返回一个object对象,对象中只包含一列。</returns> public static object ExecuteScalar(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) { var cmd = new SqlCommand(); PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters); var val = cmd.ExecuteScalar(); cmd.Parameters.Clear(); return val; } /// <summary> /// 添加参数集到缓存 /// </summary> /// <param name="cacheKey">缓存的名称</param> /// <param name="commandParameters">要缓存的参数集</param> public static void CacheParameters(string cacheKey, params SqlParameter[] commandParameters) { ParmCache[cacheKey] = commandParameters; } /// <summary> /// 从缓存中获取参数集 /// </summary> /// <param name="cacheKey">key used to lookup parameters</param> /// <returns>Cached SqlParamters array</returns> public static SqlParameter[] GetCachedParameters(string cacheKey) { var cachedParms = (SqlParameter[])ParmCache[cacheKey]; if (cachedParms == null) return null; var clonedParms = new SqlParameter[cachedParms.Length]; var j = cachedParms.Length; for (var i = 0; i < j; i++) clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]).Clone(); return clonedParms; } /// <summary> /// 为执行准备命令对象 /// </summary> /// <param name="cmd">command 对象</param> /// <param name="conn">连接对象</param> /// <param name="trans">事务对象</param> /// <param name="cmdType">命令类型</param> /// <param name="cmdText">命令字符串</param> /// <param name="cmdParms">参数集</param> private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, IEnumerable<SqlParameter> cmdParms) { if (conn.State != ConnectionState.Open) conn.Open(); cmd.Connection = conn; cmd.CommandText = cmdText; if (trans != null) cmd.Transaction = trans; cmd.CommandType = cmdType; if (cmdParms == null) return; foreach (var parm in cmdParms) cmd.Parameters.Add(parm); } /// <summary> /// 是否存在记录 /// </summary> /// <param name="strSql"></param> /// <returns></returns> public static bool Exists(string strSql) { var obj = ExecuteScalar(ConnectionStringLocalTransaction, CommandType.Text, strSql); int cmdresult; if ((Equals(obj, null)) || (Equals(obj, DBNull.Value))) { cmdresult = 0; } else { cmdresult = int.Parse(obj.ToString()); } return cmdresult != 0; } /// <summary> /// 是否存在记录 /// </summary> /// <param name="strSql"></param> /// <param name="cmdParms"></param> /// <returns></returns> public static bool Exists(string strSql, params SqlParameter[] cmdParms) { var obj = ExecuteScalar(ConnectionStringLocalTransaction,CommandType.Text,strSql, cmdParms); int cmdresult; if ((Equals(obj, null)) || (Equals(obj, DBNull.Value))) { cmdresult = 0; } else { cmdresult = int.Parse(obj.ToString()); } return cmdresult != 0; } } } |
View Details
数据库是电子商务、金融以及ERP系统的基础,通常都保存着重要的商业伙伴和客户信息。大多数企业、组织以及政府部门的电子数据都保存在各种数据库中,他们用这些数据库保存一些个人资料,比如员工薪水、个人资料等等。数据库服务器还掌握着敏感的金融数据。包括交易记录、商业事务和帐号数据,战略上的或者专业的信息,比如专利和工程数据,甚至市场计划等等应该保护起来防止竞争者和其他非法者获取的资料。数据完整性和合法存取会受到很多方面的安全威胁,包括密码策略、系统后门、数据库操作以及本身的安全方案。但是数据库通常没有象操作系统和网络这样在安全性上受到重视。 微软的SQL Server是一种广泛使用的数据库,很多电子商务网站、企业内部信息化平台等都是基于SQL Server上的,但是数据库的安全性还没有被人们更系统的安全性等同起来,多数管理员认为只要把网络和操作系统的安全搞好了,那么所有的应用程序也就安全了。大多数系统管理员对数据库不熟悉而数据库管理员有对安全问题关心太少,而且一些安全公司也忽略数据库安全,这就使数据库的安全问题更加严峻了。数据库系统中存在的安全漏洞和不当的配置通常会造成严重的后果,而且都难以发现。数据库应用程序通常同操作系统的最高管理员密切相关。广泛SQL Server数据库又是属于“端口”型的数据库,这就表示任何人都能够用分析工具试图连接到数据库上,从而绕过操作系统的安全机制,进而闯入系统、破坏和窃取数据资料,甚至破坏整个系统。 这里,我们主要谈论有关SQL Server2000数据库的安全配置以及一些相关的安全和使用上的问题。 在进行SQL Server 2000数据库的安全配置之前,首先你必须对操作系统进行安全配置,保证你的操作系统处于安全状态。然后对你要使用的操作数据库软件(程序)进行必要的安全审核,比如对ASP、PHP等脚本,这是很多基于数据库的WEB应用常出现的安全隐患,对于脚本主要是一个过滤问题,需要过滤一些类似 , ‘ ; @ / 等字符,防止破坏者构造恶意的SQL语句。接着,安装SQL Server2000后请打上补丁sp1以及最新的sp2。 在做完上面三步基础之后,我们再来讨论SQL Server的安全配置。 1、使用安全的密码策略 我们把密码策略摆在所有安全配置的第一步,请注意,很多数据库帐号的密码过于简单,这跟系统密码过于简单是一个道理。对于sa更应该注意,同时不要让sa帐号的密码写于应用程序或者脚本中。健壮的密码是安全的第一步! SQL Server2000安装的时候,如果是使用混合模式,那么就需要输入sa的密码,除非你确认必须使用空密码。这比以前的版本有所改进。 同时养成定期修改密码的好习惯。数据库管理员应该定期查看是否有不符合密码要求的帐号。比如使用下面的SQL语句: Use master Select name,Password from syslogins where password is null 2、使用安全的帐号策略。 由于SQL Server不能更改sa用户名称,也不能删除这个超级用户,所以,我们必须对这个帐号进行最强的保护,当然,包括使用一个非常强壮的密码,最好不要在数据库应用中使用sa帐号,只有当没有其它方法登录到 SQL Server 实例(例如,当其它系统管理员不可用或忘记了密码)时才使用 sa。建议数据库管理员新建立一个拥有与sa一样权限的超级用户来管理数据库。安全的帐号策略还包括不要让管理员权限的帐号泛滥。 SQL Server的认证模式有Windows身份认证和混合身份认证两种。如果数据库管理员不希望操作系统管理员来通过操作系统登陆来接触数据库的话,可以在帐号管理中把系统帐号“BUILTINAdministrators”删除。不过这样做的结果是一旦sa帐号忘记密码的话,就没有办法来恢复了。 很多主机使用数据库应用只是用来做查询、修改等简单功能的,请根据实际需要分配帐号,并赋予仅仅能够满足应用要求和需要的权限。比如,只要查询功能的,那么就使用一个简单的public帐号能够select就可以了。 3、加强数据库日志的记录。 审核数据库登录事件的“失败和成功”,在实例属性中选择“安全性”,将其中的审核级别选定为全部,这样在数据库系统和操作系统日志里面,就详细记录了所有帐号的登录事件。 请定期查看SQL Server日志检查是否有可疑的登录事件发生,或者使用DOS命令。 findstr /C:"登录" d:Microsoft SQL ServerMSSQLLOG*.* 4、管理扩展存储过程 对存储过程进行大手术,并且对帐号调用扩展存储过程的权限要慎重。其实在多数应用中根本用不到多少系统的存储过程,而SQL Server的这么多系统存储过程只是用来适应广大用户需求的,所以请删除不必要的存储过程,因为有些系统的存储过程能很容易地被人利用起来提升权限或进行破坏。 如果你不需要扩展存储过程xp_cmdshell请把它去掉。使用这个SQL语句: use master sp_dropextendedproc 'xp_cmdshell' xp_cmdshell是进入操作系统的最佳捷径,是数据库留给操作系统的一个大后门。如果你需要这个存储过程,请用这个语句也可以恢复过来。 sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll' […]
View DetailsWindows 2000 的终端服务由于使用简单、方便等特点,备受众多管理员喜爱,很多管理员都利用它进行远程管理服务器的一个重要工。然后就是因为它的简单、方便,不与当前用户产生一个交互式登陆,可以在后台登陆操作,它也受到了黑客关注。现在我们来通过认真的配置来加强它的安全性。 1。修改终端服务的端口 修改注册表:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp 和HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp 将这两个分支下的portnumber键值改为你想要的端口。 在客户端这样连接就可以了. 2。隐藏登陆的用户名 隐藏上次登陆的用户名,这样可防止恶意攻击者获得系统的管理用户名后进行穷举破解。 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinlogonDontDisplayLastUserName 的值改为1就可以了。 3。指定用户登陆。为了安全,我们没必要让服务器上所有用户都登陆,譬如以下,我们只允许315safe这个用户登陆到终端服务器,按照如下方法做限制: 在“管理工具”—“终端服务配置”—“连接”,再选择右边的“RDP-TCP”的属性,找到“权限”选项,删除administrators组,然后再添加我们允许的315safe这个用户,其他一律不允许登陆。 4、启动审核 “终端服务”默认没有日志记录,需要手动开启,在RDP-TCP”的属性,找到“权限”选项下“高级”里有个“审核”添加everyone,然后选择需要记录的的事件。 “事件查看器”里终端服务日志很不完善。下面我们就来完善一下终端服务器日志。 在D盘目录下,创建2个文件“ts2000.BAT”(用户登录时运行的脚本文件)和“ts2000.LOG”(日志文件)。 编写“ts2000.BAT”脚本文件: time /t >>ts2000.log netstat -n -p tcp | find ″:3389″>>ts2000.log start Explorer 第一行代码用于记录用户登录的时间,“time /t”的意思是返回系统时间,使用追加符号“>>”把这个时间记入“ts2000.LOG”作为日志的时间字段;第二行代码记录终端用户的IP地址,“netstat”是用来显示当前网络连接状况的命令,“-n”用于显示IP和端口,“-p tcp”显示TCP协议,管道符号“|”会将“netstat”命令的结果输出给“find”命令,再从输出结果中查找包含“3389”的行,最后把这个结果重定向到日志文件“ts2000.LOG”;最后一行为启动Explorer的命令。 把“ts2000.BAT”设置成用户的登录脚本。在终端服务器上,进入“RDP-Tcp属性”窗口,并切换到“环境”框,勾选“替代用户配置文件和远程桌面连接或终端服务客户端的设置”,在“程序路径和文件名”栏中输入“D:\ts2000.bat”,在“开始位置”栏中输入“D:\”,点击“确定”即可完成设置。此时,我们就可通过终端服务日志了解到每个用户的行踪了。 5。限制、指定连接终端的地址 启用服务器自带的IPSEC来指定特定的IP地址连接服务器。首先禁止所有3389的连接。 1。在“本地安全策略”选择“IP安全策略,在本地机器”,在右边的空白处按右键,“创建IP安全策略”,下一步,给策略取名(如3389),不选“激活默认响应规则”,完成,这是会打开一个对话框,是新建立策略(3389)的属性。2。添加新建规则,出现“IP筛选器列表”,起名叫all_3389,不选“使用添加向导”再按“添加”。按“确定”、“关闭”回到“新规则”属性窗口,选中刚设置的规则“all_3389”,再按“筛选器操作”选项,“筛选器操作”里没有我们的“阻止”我们新建立一项阻止。还是不选“使用添加向导”,按“添加”,在弹出的对话框中,在“安全措施”处选“阻止”项。 再按“常规”,在“名称”处给他起个名字,如”阻止3389“,然后确定回到”新规则“属性的”筛选器操作”处,选中刚才建立的“阻止3389”,再按“关闭”,回到开始时的“本地安全设置”对话框,选中“3389”后指派。这样所有的机器都无法连接到我们终端服务器了。 3。同样服务器也被栏在外面了,下面我们建立一条规则,只允许服务器信任的机器进行连接,譬如219.139.240.90 .我们打开“3389”的属性,不选“使用添加向导”,按“添加”,打开“新规则”属性,再按“添加”,出现“IP筛选器列表”,给它起个名字"OK_3389",不选使用添加向导,再按”添加“,出现”筛选器“属性,”寻址“选项设置成如图。 协议处设置TCP,3389,在”筛选器操作“里选择”允许“。这样就OK了,这样除了我们自己信任的机器,其他任何机器都无法登陆到终端服务器了。也可以设置为一个网关的信任机器。这样终端服务器就安全多了。
View DetailsWin2003 Server的安全性较之Win2K确实有了很大的提高,但是用Win2003 Server作为服务器是否就真的安全了?如何才能打造一个安全的个人Web服务器?下面我们简单介绍一下…… 一、Windows Server2003的安装 1、安装系统最少两需要个分区,分区格式都采用NTFS格式 2、在断开网络的情况安装好2003系统 3、安装IIS,仅安装必要的 IIS 组件(禁用不需要的如FTP 和 SMTP 服务)。默认情况下,IIS服务没有安装,在添加/删除Win组件中选择“应用程序服务器”,然后点击“详细信息”,双击Internet信息服务(iis),勾选以下选项: Internet 信息服务管理器; 公用文件; 后台智能传输服务 (BITS) 服务器扩展; 万维网服务。 如果你使用 FrontPage 扩展的 Web 站点再勾选:FrontPage 2002 Server Extensions 4、安装MSSQL及其它所需要的软件然后进行Update。 5、使用Microsoft 提供的 MBSA(Microsoft Baseline Security Analyzer) 工具分析计算机的安全配置,并标识缺少的修补程序和更新。下载地址:见页末的链接 二、设置和管理账户 1、系统管理员账户最好少建,更改默认的管理员帐户名(Administrator)和描述,密码最好采用数字加大小写字母加数字的上档键组合,长度最好不少于14位。 2、新建一个名为Administrator的陷阱帐号,为其设置最小的权限,然后随便输入组合的最好不低于20位的密码 3、将Guest账户禁用并更改名称和描述,然后输入一个复杂的密码,当然现在也有一个DelGuest的工具,也许你也可以利用它来删除Guest账户,但我没有试过。 4、在运行中输入gpedit.msc回车,打开组策略编辑器,选择计算机配置-Windows设置-安全设置-账户策略-账户锁定策略,将账户设为“三次登陆无效”,“锁定时间为30分钟”,“复位锁定计数设为30分钟”。 5、在安全设置-本地策略-安全选项中将“不显示上次的用户名”设为启用 6、在安全设置-本地策略-用户权利分配中将“从网络访问此计算机”中只保留Internet来宾账户、启动IIS进程账户。如果你使用了Asp.net还要保留Aspnet账户。 7、创建一个User账户,运行系统,如果要运行特权命令使用Runas命令。 三、网络服务安全管理 1、禁止C$、D$、ADMIN$一类的缺省共享 打开注册表,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters,在右边的窗口中新建Dword值,名称设为AutoShareServer值设为0 2、 解除NetBios与TCP/IP协议的绑定 右击网上邻居-属性-右击本地连接-属性-双击Internet协议-高级-Wins-禁用TCP/IP上的NETBIOS 3、关闭不需要的服务,以下为建议选项 Computer Browser:维护网络计算机更新,禁用 Distributed File System: 局域网管理共享文件,不需要禁用 Distributed linktracking client:用于局域网更新连接信息,不需要禁用 Error reporting service:禁止发送错误报告 Microsoft Serch:提供快速的单词搜索,不需要可禁用 NTLMSecuritysupportprovide:telnet服务和Microsoft Serch用的,不需要禁用 PrintSpooler:如果没有打印机可禁用 Remote Registry:禁止远程修改注册表 Remote Desktop Help Session Manager:禁止远程协助 四、打开相应的审核策略 在运行中输入gpedit.msc回车,打开组策略编辑器,选择计算机配置-Windows设置-安全设置-审核策略在创建审核项目时需要注意的是如果审核的项目太多,生成的事件也就越多,那么要想发现严重的事件也越难当然如果审核的太少也会影响你发现严重的事件,你需要根据情况在这二者之间做出选择。 推荐的要审核的项目是: 登录事件 成功 失败 账户登录事件 成功 失败 系统事件 成功 失败 […]
View Details错误:Microsoft OLE DB Provider for SQL Server 错误 '80004005' 在 sys.servers 中找不到服务器 'SUNMAY2008\SQLEXPRESS’。请验证指定的服务器名称是否正确。如果需要,请执行存储过程 sp_addlinkedserver 以将服务器添加到 sys.servers。 /Admin/Admin_TemplateProject.asp,行 1003 解决方法:出现这个错误一般是因为改动了服务器的计算机名.所以出现找不到服务器名的错误.出现这个错误可以通过重新添加服务器名来解决. 在查询分析器中分别执行下列语句 select * from sys.servers (查看系统表,看原来的服务器名) sp_dropserver '原来的服务器名' (删除原来的服务器名) sp_addserver '现在的服务器名' (添加现在的服务器名) sp_serveroption '现在的服务器名',’data access', 'true' (设定 SQL Server 选项,使其允许加入linked server)
View Details由于最近在改版一个PHP的网站程序,但原网站使用的是ASP+Access,所以要把Access数据库中的记录全部转换到Mysql中,并且新的网站所有页面使用的都是UTF-8的编码格式,于是就有了现在的问题。 不过问题终于还是在10分钟内得到解决了。先上代码: <?php$connstr="DRIVER=Microsoft Access Driver (*.mdb);DBQ=".realpath("wenxue.mdb"); $connid=odbc_connect($connstr,"","",SQL_CUR_USE_ODBC); $query=odbc_do($connid,"select top 1 * from articles"); while(odbc_fetch_row($query)){ for($i=0;$i<4;$i++){ $record1[$i] = odbc_result($query,$i+1); echo iconv('gb2312′,’utf-8',$record1[$i]); echo " "; } echo "<br>"; } ?> 其实,PHP连接Access数据库的方法有很多,这里只是其中的一种。重要的是解决乱码问题,也就是iconv方法的使用(文中的粗体)。 转自:http://neville.liu.blog.163.com/blog/static/4993878120096279929917/
View Details1:如何修改网站"欢迎光临本店" 回答:languages\zh_cn\common.php文件中, $_LANG['welcome'] = '欢迎光临本店';将他修改成你需要的字样。 2:如何修改首页"热门搜索关键字" 回答:后台->系统设置->网店设置->显示设置->首页搜索关键字,修改他的内容,然后保存 3:如何修改首页标题 "Powered by ECShop" 回答:includes/lib_main.php,找到$page_title = $GLOBALS['_CFG']['shop_title'] . ' – ' . 'Powered by ECShop';修改成$page_title = $GLOBALS['_CFG']['shop_title']就可以了。 4:如何去除cshop底部查询信息的显示 回答:library/page_footer.lbi中,删除 {insert name=’query_info'} 5:如何发布首页公告 回答:后台->系统设置->商店设置->网店信息->商店公告.填写你需要的公告就可以了. 6:如何发布站内新闻 ecshop管理文章十分灵活,既可以管理帮助信息,也可以管理站内文章.站内新闻. 1:增加文章帮助信息 后台->文章分类->增加文章分类->(选择)网店帮助分类-> 填写分类的名称xxx 后台->文章列表->增加文章->选择网店帮助分类(xxx)->发布文章 2:增加站内信息,站内新闻 后台->文章分类->增加文章分类->增加一个文章顶级分类news 后台->文章类表->增加文章->选择分类news->发布文章 7:如何修改网站logo 回答:用你的logo图片替换/themes/default/images/logo.gif中图片就可以了 8:如何修改产品图片的大小 回答:在ecshop/themes/default/style.css中,找到.goodsItem .goodsimg{width:100px; height:100px; border:4px solid #eef8ff; margin-bottom:4px;}就可以控制产品图片的大小. 9:如何管理首页flash播放器 回答:后台 -> flash播放器管理 -> 增加自定义,你就可以上传和控制图片的位置 10:如何修改首页"精品推荐"栏目的more小图片 回答:模板文件中library/recommend_best.lbi中,<div class="more"><a href="../search.php?intro=best"><img src="images/more.gif" /></a></div> 中more.gif图片换成你要的图片,或者将图片换成你需要的文字. 11:如何修改首页"新品上市"栏目的more小图片 回答:模板文件library/recommend_new.lbi中,<div class="more"><a href="../search.php?intro=new"><img src="images/more.gif" /></a></div> more.gif修改成你需要的图片或者是换成你需要的文字. 12:如何手动修改支付方式排列顺序 回答:数据库表中,找到payment表,pay_order字段就是用来控制顺序的,你如果想让A支付方式排在第一,那么你需要修改该字段的值稍微大一些。 13:如何去除ecshop产品详细页产品电击率 回答:模板文件中,打开goods.dwt,删除<strong>{$lang.goods_click_count}:</strong>{$goods.click_count} 14:首页模板在哪个文件,头部模板,底部模板个什么文件名称 回答:首页模板在为index.dwt, 头部模板在library/page_header.lbi,底部文件在library/page_footer.lbi 15:网站关闭了注册,如何修改“该网店暂停注册”字样 回答:languages\zh_cn\common.php 中$_LANG['shop_register_closed'] = '该网店暂停注册';修改该文字就可以了 16:收货人详细信息js弹出框的提示脚本在哪个文件 回答:languages\zh_cn\shopping_flow.php [比如 $_LANG['flow_js']['country_not_null'] = '请您选择收货人所在国家!';] 17:网站公告代码段在那里 回答: index.php文件中, $smarty->assign('shop_notice', $_CFG['shop_notice']); // 商店公告代码段控制公告 18:网站首页"精品推荐"显示数量在那里设置 ecshop中,为了让更多更丰富的购买信息显示在首页,可以根据自己所在行业特点,根据自己所在行业购买行为的分析,在ecshop首页设置热买促销新品的数量,让版面更加合理,让用户体验. 设置ecshop首页热买商品的数量. 模板管理 -> 设置模板 -> 热买商品 (修改其显示数量)修改下面的10为你需要的数量,这就是热买商品 设置ecshop首页新品的数量. 模板管理 -> 设置模板 -> 新品上架 (修改其显示数量)修改下面的10为你需要的数量,这就是新品上架 设置ecshop首页精品的数量. 模板管理 -> 设置模板 -> 精品推荐 (修改其显示数量)修改下面的10为你需要的数量,这就是精品推荐 19:网站首页"新品上市"显示数量在那里设置 20:如何修改产品的库存 回答:商品管理 -> 商品列表 -> 选中(库存),编辑就可以了. 21:如何修改ecshop表的前缀 回答:修改data/config.php下的$prefix = "ecs_";将ecs_修改成你需要的前缀.其次,在数据库中,修改表名比如ecs_goods修改为"xxx_goods"; 22:如何去除首页flash下面的空白区域 首先.ecshop首页flash下面有两个空白的地方,第一个是用来显示促销产品的,右边是用来显示品牌的。 1:显示促销产品 后台 -> 商品管理 -> 商品列表 -> 编辑产品 -> 通用信息 -> 勾上促销价 -> 填写促销期限 -> 保存-> 更新缓存 前台flash下空白处就被填充了. 2:如何显示商品品牌列表 商品管理 -> 商品品牌 -> 增加品牌X -> 保存 增加该品牌X下的产品 商品管理 -> 增加新产品 -> 选择商品品牌 -> 保存 -> 更新缓存 23:如何修改ecshop导航栏目名称 回答:后台 -> 系统设置 -> 自定义导航栏 -> 编辑 -> 修改导航栏名称 24:如何将最新产品栏目显示在导航栏里面? 回答:后台 -> 系统设置 -> 自定义导航栏 -> 增加自定义导航,在链接的栏目中输入"search.php?intro=new" 25:如何更换ecshop模板 回答:比如新模板“test”,你将放在themes目录下,形成的路径为themes/test,然后在后台 -> 模板管理 -> 模板选择 ,起用你新加的模板就OK了。 26:ecshop产品相关的图片有那几种 回答:$goods_img = "; // 初始化商品图片 $goods_thumb = "; // 初始化商品缩略图 $original_img = "; // 初始化原始图片 $old_original_img = "; // 初始化原始图片旧图 27:ecshop首页如何设置“新品”,“精品”,“热卖”商品 回答:参照http://www.chinab4c.com/html/shangchengchengxu/ecshopchangjianwenti/2009/0706/82.html 28:如何修改“支付方式”显示顺序 回答:打开ecs_payment表,如果你想让他显示在前面,你将设置pay_order值小一些,比如想让“支付宝”排第一,“快钱”排第二,你就可以设置支付宝pay_order=1,快钱pay_order=2 29:详细页面的积分 回答:详细页面的积分在模板<strong>{$lang.goods_give_integral}</strong><font class="f4">{$goods.give_integral} {$points_name}</font>中来控制的 30:如何修改产品缩略图大小 回答:后台 -> 系统设置 -> 网店设置 -> 显示设置 -> 缩略图宽度.,当然你也可以设置缩略图高度 31:如何设置ecshop货币格式和日期格式。 回答:后台 -> 系统设置 -> 网店设置 -> 显示设置 -> 货币格式(¥%s元)或者时间格式(Y-m-d H:i:s) 32:如何开取和关闭ecshop登陆验证码 回答:后台 -> 系统设置 -> 验证码管理 ,在这里你可以操作各种验证码,开启和关闭 33:如何修改个人帐户信息里面,出生年月的范围 […]
View Details— 表的结构 ecs_account_log CREATE TABLE IF NOT EXISTS ecs_account_log ( log_id mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID号', user_id mediumint(8) unsigned NOT NULL COMMENT '用户登录后保存在session中的id号,跟users表中的user_id对应', user_money decimal(10,2) NOT NULL COMMENT '用户该笔记录的余额', frozen_money decimal(10,2) NOT NULL COMMENT '被冻结的资金', rank_points mediumint(9) NOT NULL COMMENT '等级积分,跟消费积分是分开的', pay_points mediumint(9) NOT NULL COMMENT '消费积分,跟等级积分是分开的', change_time int(10) unsigned NOT NULL COMMENT '该笔操作发生的时间', change_desc varchar(255) NOT NULL COMMENT '该笔操作的备注,一般是,充值或者提现。也可是是管理员后台写的任何在备注', change_type tinyint(3) unsigned NOT NULL COMMENT '操作类型,0为充值,1为提现,2为管理员调节,99为其他类型', PRIMARY KEY (log_id), KEY user_id (user_id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT=’用户帐号情况记录表,包括资金和积分等' AUTO_INCREMENT=42 ; — —————————————————— — 表的结构 ecs_ad […]
View Details解决: 初次碰到这个问题,试过很多方法,比如:停止索引服务,重装IIS,重装.Net Framework,删除Temporary ASP.NET Files目录再重赋权限,甚至重装系统,问题依旧;还有一点很奇怪,我重装系统前赋予了Temporary ASP.NET Files文件夹asp.net,network service和everyone用户的最大权限,但是我格式化重装系统后,Temporary ASP.NET Files目录的权限设置居然跟重装系统之前一样,不知是不是NTFS文件系统的问题,网上搜了一下,很多人碰到这个问题想到的都是给Temporary ASP.NET Files目录赋权限,我开始也是这样,最后在微软的网站搜到了这个问题的解决方法,其实很简单,只要在windows/temp权限设置里面把Network service(如果是win2000则是asp.net用户)的权限加上就行。 具体解决方法请参照:http://support.microsoft.com/default.aspx?scid=kb;en-us;825791
View Details