我们经常会遇到批量上传的问题,也会遇到将某个目录下所有文件都上传到服务器上的问题。那么,如何解决此类问题呢?以前的技术一般采用ActiveX等方式,这里笔者采用SharpZlib来实现,听说VS2005已有压缩和解压缩的解决方案,笔者还没有时间用VS2005,所以就只好使用VS2003 + SharpZlib来解决问题了。

  1、首先从这里下载0.84版本的SharpZlib源码及示例码。
  2、下载下来之后你发现它没有VS2003的解决方案文件,没有关系。你可以自己建立,首先新建一个ZipUnzip的解决方案,然后,将上面经过解压缩之后的所有文件及目录COPY到你的解决方案所在的目录下。
  3、在VS2003解决方案资源管理器(一般是在右上方中部点的位置)中点击显示所有文件按钮,然后可以见到很多“虚”的图标、文件及文件夹等,可以一次选择它们,然后包含进项目中。
  4、编译,最好使用Release选项,编译完成之后你可以在inRelease看到ZipUnzip.dll的类了。如果你编译时报错,说什么AssemblyKeyFile之类的,你可以使用强命名工具新建一个,也可以将AssemblyInfo.cs中[assembly: AssemblyKeyFile("。。。。。")]改成:[assembly: AssemblyKeyFile("")] (不推荐这样做)。
  5、新建一个WEBFORM项目,添加ZipUnzip.dll类的引用,然后添加如下文件及内容:

// ——————————————
// 1. AttachmentUnZip.cs
// ——————————————
using System;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;

namespace WebZipUnzip
{
public class AttachmentUnZip
{
public AttachmentUnZip()
{
}
public static void UpZip(string zipFile)
{
string []FileProperties=new string[2];
FileProperties[0]=zipFile;//待解压的文件
FileProperties[1]=zipFile.Substring(0,zipFile.LastIndexOf("\")+1);//解压后放置的目标目录
UnZipClass UnZc=new UnZipClass();
UnZc.UnZip(FileProperties);
}
}
}

// ———————————————
// 2. UnZipClass.cs
// ———————————————

using System;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;

namespace WebZipUnzip
{
public class UnZipClass
{
///
/// 解压文件
///
/// 包含要解压的文件名和要解压到的目录名数组
public void UnZip(string[] args)
{
ZipInputStream s = new ZipInputStream(File.OpenRead(args[0]));
try
{
ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{
string directoryName = Path.GetDirectoryName(args[1]);
string fileName = Path.GetFileName(theEntry.Name);

//生成解压目录
Directory.CreateDirectory(directoryName);

if (fileName != String.Empty)
{
//解压文件到指定的目录
FileStream streamWriter = File.Create(args[1]+fileName);

int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}

streamWriter.Close();
}
}
s.Close();
}
catch(Exception eu)
{
throw eu;
}
finally
{
s.Close();
}

}//end UnZip
public static bool UnZipFile(string file, string dir)
{
try
{
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
string fileFullName = Path.Combine(dir,file);
ZipInputStream s = new ZipInputStream(File.OpenRead( fileFullName ));

ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{
string directoryName = Path.GetDirectoryName(theEntry.Name);
string fileName = Path.GetFileName(theEntry.Name);

if (directoryName != String.Empty)
Directory.CreateDirectory( Path.Combine(dir, directoryName));

if (fileName != String.Empty)
{
FileStream streamWriter = File.Create( Path.Combine(dir,theEntry.Name) );
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}

streamWriter.Close();
}
}
s.Close();
return true;
}
catch (Exception)
{
throw;
}
}

}//end UnZipClass
}
// ———————————————-
// 3. ZipClass.cs
// ———————————————-
using System;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;

namespace WebZipUnzip
{
///
/// 压缩文件
///
public class ZipClass
{
public void ZipFile(string FileToZip, string ZipedFile ,int CompressionLevel, int BlockSize,string password)
{
//如果文件没有找到,则报错
if (! System.IO.File.Exists(FileToZip))
{
throw new System.IO.FileNotFoundException("The specified file " + FileToZip + " could not be found. Zipping aborderd");
}

System.IO.FileStream StreamToZip = new System.IO.FileStream(FileToZip,System.IO.FileMode.Open , System.IO.FileAccess.Read);
System.IO.FileStream ZipFile = System.IO.File.Create(ZipedFile);
ZipOutputStream ZipStream = new ZipOutputStream(ZipFile);
ZipEntry ZipEntry = new ZipEntry("ZippedFile");
ZipStream.PutNextEntry(ZipEntry);
ZipStream.SetLevel(CompressionLevel);
byte[] buffer = new byte[BlockSize];
System.Int32 size =StreamToZip.Read(buffer,0,buffer.Length);
ZipStream.Write(buffer,0,size);
try
{
while (size < StreamToZip.Length)
{
int sizeRead =StreamToZip.Read(buffer,0,buffer.Length);
ZipStream.Write(buffer,0,sizeRead);
size += sizeRead;
}
}
catch(System.Exception ex)
{
throw ex;
}
ZipStream.Finish();
ZipStream.Close();
StreamToZip.Close();
}
public void ZipFileMain(string[] args)
{
//string[] filenames = Directory.GetFiles(args[0]);
string[] filenames = new string[]{args[0]};

Crc32 crc = new Crc32();
ZipOutputStream s = new ZipOutputStream(File.Create(args[1]));

s.SetLevel(6); // 0 – store only to 9 – means best compression

foreach (string file in filenames)
{
//打开压缩文件
FileStream fs = File.OpenRead(file);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
ZipEntry entry = new ZipEntry(file);

entry.DateTime = DateTime.Now;

// set Size and the crc, because the information
// about the size and crc should be stored in the header
// if it is not set it is automatically written in the footer.
// (in this case size == crc == -1 in the header)
// Some ZIP programs have problems with zip files that don‘t store
// the size and crc in the header.
entry.Size = fs.Length;
fs.Close();

crc.Reset();
crc.Update(buffer);

entry.Crc = crc.Value;

s.PutNextEntry(entry);

s.Write(buffer, 0, buffer.Length);

}
s.Finish();
s.Close();
}
}
}
// ———————————————
// 4. WebForm1.aspx
// ———————————————
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="WebZipUnzip.WebForm1" %>&nbsp;
<META content="Microsoft Visual Studio .NET 7.1" name=GENERATOR>
<META content=C# name=CODE_LANGUAGE>
<META content=JavaScript name=vs_defaultClientScript>
<META content=http://schemas.microsoft.com/intellisense/ie5 name=vs_targetSchema>
<FORM id=Form1 method=post runat="server"><?xml:namespace prefix = asp /><asp:Button id=Button1 style="Z-INDEX: 101; LEFT: 56px; POSITION: absolute; TOP: 64px" runat="server" Text="压缩"></asp:Button><asp:Button id=Button2 style="Z-INDEX: 102; LEFT: 112px; POSITION: absolute; TOP: 64px" runat="server" Text="解压"></asp:Button><INPUT id=File1 style="Z-INDEX: 103; LEFT: 32px; POSITION: absolute; TOP: 24px" type=file name=File1 runat="server"> </FORM></BODY></HTML>
//——————————————-
// 5.WebForm1.aspx.cs
//——————————————-

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace WebZipUnzip
{
///
/// Summary description for WebForm1.
///
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.HtmlControls.HtmlInputFile File1;
protected System.Web.UI.WebControls.Button Button2;

private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}

///
/// Required method for Designer support – do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Button2.Click += new System.EventHandler(this.Button2_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion

#region 压缩
private void Button1_Click(object sender, System.EventArgs e)
{
string []FileProperties=new string[2];
string fullName=this.File1.PostedFile.FileName;//C: esta.txt
string destPath=System.IO.Path.GetDirectoryName(fullName);//C: est
//待压缩文件
FileProperties[0]=fullName;

//压缩后的目标文件
FileProperties[1]= destPath +"\"+ System.IO.Path.GetFileNameWithoutExtension(fullName) + ".zip";
ZipClass Zc=new ZipClass();
Zc.ZipFileMain(FileProperties);

//删除压缩前的文件
System.IO.File.Delete(fullName);
}

#endregion

#region 解压
private void Button2_Click(object sender, System.EventArgs e)
{
string fullName=this.File1.PostedFile.FileName;//C: esta.zip
//解压文件
//AttachmentUnZip.UpZip(fullName);

// string[] FileProperties = new string[2];
// FileProperties[0] = fullName;//待解压的文件
// FileProperties[1] = System.IO.Path.GetDirectoryName(fullName);//解压后放置的目标目录
// UnZipClass UnZc=new UnZipClass();
// UnZc.UnZip(FileProperties);
string dir = System.IO.Path.GetDirectoryName(fullName);
string fileName = System.IO.Path.GetFileName(fullName);
UnZipClass.UnZipFile(fileName, dir);
}
#endregion
}
}
  OK! 试试看。

  此方案解决了文件名中文字的问题,目录解压缩问题。
  至于整个文件夹批量上传并压缩成一个WINZIP压缩包的问题,没有时间解决了,各位如有解决方案,不妨共享一下。

  为什么使用Google扫描安全漏洞

  如果你正在执行信息安全评估――渗入测试、漏洞评估,或者范围更广的黑客测试――你就不能没有一个相应的测试工具。虽然对于一个网站来说,此类工具很难找,但Google(是的,www.google.com)还是一个你可以使用的,能够测试Windows系统安全漏洞的最热工具中的其中之一。假设它的功能和力量能够被用来攻击你,那么在对你的恶意攻击之前,这是一个让你知道自己系统漏洞,并采取相应保护措施的好工具。

  除了能够用Google做你能做的事情之外,它的最大优势之一就是不存在价格上的问题。Google被认为是穷人的安全评估工具,或者是为那些很少,甚至没有IT预算的安全管理员(即几乎所有的人)提供的工具。我个人是商业安全评估工具的大力提倡者,它们有助于提供更加详尽的测试项目、优良的报告能力和其它可以使你的评估工作更加容易的工具。然而,“花多少钱办多少事”,有时和它们并不相符。Google能够提供像黑客一样的眼睛,做你想像不到的事情,或者能够做任何安全测试工具(包括商业软件、免费软件或开源软件)能够做的事情,而这一切都是免费的!

  和许多外部测试工具一样,Google能够看到当前你为网络世界提供的服务。并且,它能够搜集、缓存、寻找和挖掘那些对你来说并不是很新的信息,或者在你不知道的情况下放上互联网的内容。在执行安全评估查询方面,你可以有几个选择,在Google的首页,高级搜索页面,甚至使用Google API写一个你自己的Web应用程序。

  当在你的系统上执行信息安全测试时,你最想做的就使像黑客一样进行查看,这也是Google最为擅长的。这里是一些进行黑客测试时Google能够找到的信息的例子:

  1.信用卡信息(credit card information)、社会安全号(social security number)和其它公众可以通过Web应用程序和数据库访问的机密信息。

  2.网络摄像头。

  3.文字处理文档、电子表格和演示文稿文件。

  4.Outlook Web Access相关的文件。

  5.默认的(通常是不安全的)IIS文件和自定义的ISS错误信息。

  6.本想隐藏的Web登录页面。

  7.进行不属于你的网络的主机欺诈。

  8.包含敏感信息的新闻组帖子。

  以上述的最后一个为例,当在Google Groups中执行一个基本的查询时,我看到了一个我认识的电信供应商的支持组信息,它是由供应商的网络管理员发表的。那个帖子泄漏了供应商内部网络的详细配置,包括网络布局、内网IP地址和主机名。它显露出的这么多信息给我的第一感觉是,我不应该信息那个公司,并将自己企业的敏感信息交给他们。我使用公司的名称和几个关键词,执行简单的搜索就找到了这些信息,若是使用Google的高级搜索,还不知道能够找到多少信息呢!

  在今天高价漏洞评估工具的世界里,Google是一阵清新的空气,它的安全测试查询是无敌的!作为一个安全漏洞检测的顶级人士,你不仅需要像黑客一样进行工作,还需要有创新的测试方法,Google无疑就是这样一款工具,他允许你进行这样的工作。

  在不久的将来,我将向你讲述使用真实的Google查询测试你的Windows系统的安全,这将帮助你确定自己的Windows系统是否足够健壮。

  用Google工具自动执行黑客测试

  已经有多种Google工具能够自动执行黑客测试,或者增强Google黑客测试的能力,它们包括:

  ·Johnny Long的Google Hacking Database (GHDB):http://johnny.ihackstuff.com/index.php?module=prodreviews,提供许多查询样例,你可以调节这些样例,将其用于你自己的站点或域名上。

  ·Foundstone公司的SiteDigger(http://www.foundstone.com/resources/proddesc/sitedigger.htm),它利用Foundstone自己个性化的Google查询,像Johnny Long的Google Hacking Database (GHDB)一样执行自动搜索。

  注意:Google每天最多只允许运行1,000条查询,这看起来挺多,但对于此类工具来说,很快就能够执行完毕。

  ·Johnny Long的Gooscan for Linux(http://johnny.ihackstuff.com/modules.php?op=modload&name=Downloads&file=indexreq=viewdownload&cid=5),它能够用来在Linux下执行命令行方式的Google查询。

  ·Google Toolbar for Internet Explorer允许你不进入Google的首页www.google.com就能够在IE浏览器中直接输入关键词进行简单的查询。如果你是IE的反对者,还可以使用能够在Netscape或者Mozilla Firefox下执行的开放源码的Googlebar(http://googlebar.mozdev.org/)。

  ·GooDelete(http://www.dirfile.com/goodelete_history.htm)能够清理那些你不想留下的,使用Google Toolbar查询留下的,可能包含敏感信息的缓存。

  另外,如果你非常热心于Google黑客行为,你的书橱中就不能少了Johnny Long撰写的,具有很高评价的《Google Hacking for Penetration Testers.》(_ihackstuff-20/102-5005443-2664941?v=glance&s=books">http://www.amazon.com/exec/obidos/tg/detail/-/1931836361/ref=ase_ihackstuff-20/102-5005443-2664941?v=glance&s=books)这本书。

  用Google查询人工执行黑客测试

  在上一个技巧列出的自动查询工具之外,你可能还想执行自主的人工Google查询,这里是一些我在服务器上运行过的测试,它们可以作为你的开始。

  注意:事实上,你能够使用Google进行的这些查询是非常非常少的一部分,你只需将你的想像力与前述的工具结合即可,它们对你要进行的查询的数量没有限制。

  ·site:你的主机或者域名 需要找的关键字

  这将测试搜索一个特定Internet主机或域名下的任意关键字,你可以使用如SSN、 confidential、finance、student等众多关键字。

  ·filetype:想要找的文件扩展名 site:你的主机或者域名

  这个测试将搜索你系统中的特定文件,你可以输入任意文件扩展名,比如doc、pdf、ppt、db、dbf等,只要是你能够想像到的就行。

  除非你能够确定你的信息已经泄漏到了其它网站,否则就一直使用“site:”操作符来限定你的搜索结果。使用“link:”操作符则能够搜索连接到个页面上的超链接。

  如果Google返回了查询结果,但其中的链接已经成为死链,你可以点击搜索结果下面的“快照”链接进行搜索和查找。这将搜索Google的缓存,你的信息可能有存在那里的机会。同样,确定在Google Groups(网上论坛)搜索敏感信息,我曾经利用这种方法,在这里搜索到很多有用的信息。你还可以查看Interesting Google Queries(http://artkast.yak.net/81)这个网页,找到针对Microsoft的特殊Google搜索技巧。

  四个步骤保护Windows数据远离Google黑客

  使用适当的对策,可以帮助你将高度机密信息远离Google,不能够被Google黑客搜索到。这里有四个步骤,你可以尝试做一下:

  1.巩固你的服务器,并将其与外部环境隔离

  有一个很不幸的事实是,许多关键服务器仍然完全暴露在Internet上,现在请收紧你服务器的存取控制,并将其放在防火墙之后。

  2.设置robots.txt文件,禁止Google索引你的网页

  你能够通过设置“googlebot”的“User-agent:”参数的方法保护网络服务器的文件和目录免受Google索引,方法是在“Disallow:”部分列出你想保密的信息。

  或者,如果你想所有的Web机器人都不访问你的网站和网页,就请将“User-agent:”参数设置为“*”,不过记住,怀有恶意的在网上到处闲逛的人能够从你的Web Server上得到此文件,并且看到你不想被别人看到的是哪些信息。如果这看起来像互联网的弱点,那么它就是。你可以不用robots.txt文件,但你应该允许机器人只能索引那些具体的公开页面,或者通过输入“Disallow /”禁止它们索引任何以根目录开始的信息。

  请访问The Web Robots Pages(http://www.robotstxt.org/wc/robots.html)获取如何配置你的robots.txt文件和如何执行更多反机器人欺骗的信息。Google同样有一个FAQ on Googlebot’s operation(http://www.google.com/bot.html)。

  3.将高度机密的信息从公众服务器上去除

  制定一项组织策略用来保护高度机密的信息(例如密码、机密文件等)远离公众可以访问的服务器。否则,使用任何可能的存取控制措施来保护它们,并且确保这些策略能够被强制执行,并且管理那些违规者。

  4.保证你的服务器是安全的

  为了维护服务器安全,请使用我在这一系列技巧中讨论过的Google测试工具和Google查询对其进行黑客测试。

  我高度推荐使用自动化测试工具,譬如SiteDigger和Gooscan进行黑客测试,手工执行多个查询的方式不仅缓慢枯燥,还不易于管理。

  记住,这些测试只是通过Google进行的挖掘测试,它们并不能代表所有的黑客和Internet安全,这些也不是测试所有系统漏洞的最好工具。作为替代,你必须使用“多层”测试手段:同时使用Google和其它免费的、开源的,以及――据我看来,最具有综合性和可靠性的――商业性的工具进行测试,这些商业性的工具我推荐的有SPI Dynamics公司的WebInspect(应用于Web应用程序,http://www.spidynamics.com/)、Application Security公司的AppDetective(用于Web数据库,http://www.appsecinc.com/)和Qualys公司的QualysGuard(用于操作系统和网络漏洞,http://www.qualys.com/)。

  如果模拟黑客、渗入测试和普通的网络安全审计是你工作职责的一部分,这些Google黑客技术和相应的工具将成为你需要的安全工具箱中的一部分。为了安全的缘故,请现在就开始执行它,并且以后也经常执行。

  关于作者:Kevin Beaver是一位独立的信息安全顾问、作者,也是位于亚特兰大的Principle Logic, LLC公司的发言人,他专门为那些需要严格安全保护,或者突发安全事件寻求解决方法的公司提供信息安全研究服务。他是四本有关信息安全的书的作者或共同作者,其中包含获得巨大成功的《Hacking for Dummies》(_1_2/002-6195114-4480811?v=glance&s=books">http://www.amazon.com/exec/obidos/tg/detail/-/076455784X/qid=1086746862/sr=1-2/ref=sr_1_2/002-6195114-4480811?v=glance&s=books)和即将出版的《Hacking Wireless Networks for Dummies》(http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764597302.html)。这些书都由Wiley Publishing出版集团策划发行。你可以通过[email protected]联系Kevin Beaver,这是他的个人邮箱。也可以通过http://searchwindowssecurity.techtarget.com/ateAnswers/0,289620,sid45_tax297883,00.html,直接向他提问有关黑客方面的问题

    大家一定使用过 phpmyadmin 里面的数据库导入,导出功能,非常方便。但是在实际应用中,我发现如下几个问题:

  1 数据库超过一定尺寸,比如6M 这时使用导出一般没问题,可以正确的保存到本机硬盘上面,但是导入则不行!原因是:一般的 PHP.INI 里面设置临时文件/上传文件的大小限制为2M,而phpmyadmin使用了上传的方式,造成失败。

  2 导出到硬盘的 .SQL 文件在导回时,经常出现由于某些单引号的问题引起失败,造成导入失败,只能用 mysql等应用程序导入了。 我的数据库已经超过10M,所以必须解决这个问题。我的思路:

  导出: 用phpmyadmin 保存数据库/表格结构,用脚本读取数据库内容并保存到文件里面!
  导入: 用phpmyadmin 恢复数据库/表格结构,用脚本读取文件,然后保存到库里面!

  导出程序如下:调用方法为 ****.php?table=tablename
  这个简单的程序目前一次保存一个表格!!每行为一个字段的数据!!

以下为引用的内容:
< ?
if($table=="")exit();
mysql_connect("localhost","name","password");
mysql_select_db("database");
$result = mysql_query("select * from $table");
if(mysql_num_rows($result) < = 0) exit();
echo "开始转换数据到文本…
";
$handle = fopen("$table.txt","w");
$numfields = mysql_num_fields($result);
fputs($handle,$numfields."
");
for($k=0;$k< mysql_num_rows($result);$k++)
{
$msg = mysql_fetch_row($result);
for($i=0;$i< $numfields;$i++)
{
$msg[$i] = str_replace("
","&&php2000mysqlreturn&&",$msg[$i]);
$msg[$i] = str_replace("
" ,"&&php2000mysqlreturn&&",$msg[$i]);
fputs($handle,$msg[$i]."
");
}
fputs($handle,"——- php2000 dump data program V1.0 for MySQL ——–
");
}
fclose($handle);
echo "ok";
?>

  导入的程序如下:用法同上面!

以下为引用的内容:
< ?
if($table=="")exit();
mysql_connect("localhost","name","password");
mysql_select_db("database");
$message = file("$table.txt");
echo $numfields = chop($message[0]);
for($k=1;$k< count($message);$k+=($numfields+1))
{
$value="";
for ($i=$k;$i< ($k+$numfields-1);$i++)
{
$tmp = str_replace("&&php2000mysqlreturn&&","
",chop($message[$i]));
$value .= "‘".addslashes($tmp)."‘,";
}
$tmp = str_replace("&&php2000mysqlreturn&&","
",chop($message[$k+$numfields-1]));
$value .= "‘".$tmp."‘";
$query = "insert into $table values (".$value.")";
echo mysql_error();
mysql_query($query);
echo $k." ";
}
echo "ok";
?>

  使用方法和可能的问题!
  1 导入时 file()函数可能会有问题(我的10M的数据没出现问题),可以改为 fopen()然后没次读一行!!
  2 导入,导出都需要用 ftp 操作,也就是导出后,用 ftp 把数据转到本机,导入时先用ftp转移数据到服务器!

转自:http://www.weste.net/2006/7-14/16243358863.html

查询手机是正品还是水货,方法很简单,需要进行“手机IMEI号验证”和“标志验证”,方法如下:

登录电信设备进网管理网站,网址是 http://www.tenaa.com.cn/

第一步:手机IMEI号验证
地址:http://www.tenaa.com.cn/WSFW/FlagValidateImei.aspx

按照网页中的提示进行选择,在手机上按“*#06#”获得手机的IMEI码。

第二步:标志验证
鉴于手机IMEI号可以被伪造,此种验证方式仅供参考,如需准确查询请使用“标志验证”进行验证。
地址:http://www.tenaa.com.cn/WSFW/FlagValidate.aspx

两个验证都无误说明您的手机是正品。

其他验证方式:

短消息验证进网许可标志方式:

方法介绍:

1.进入手机写信息界面;

2.按以下格式输入信息:

1).查询进网许可证信息:RW#许可证编号;
2).查询进网许可证标志真伪:RW#许可证编号#扰码;
3).查询手机设备真伪:RW#许可证编号#扰码#手机串号;

说明:
A、“RW”为固定代码,可以不分大小写;
B、“#”为间隔符,可以用空格代替;
C、许可证编号为进网标志上第1行,如“02-0010-994631”,其中“-”可以用字母“A”(不分大小写)代替;
D、扰码为进网标志上第3行,如“3N48PT7C17XP3X1”;
E、在手机上输入“*#06#”可以获得手机串号。只需输入数字,不需输入“/”或“-”
F、若需获得帮助信息,只需输入“RW”;

输入完毕,发送至9500,即可等待回复结论。

适用范围:手机短信查验进网许可标志的适用范围:目前适用于中国移动的全部用户和中国联通的全部用户。

服务时间:24小时开通

收费标准:每条一元

如果你想把二进制的数据,比如说图片文件和HTML文件,直接保存在你的MySQL数据库,那么这篇文章就是为你而写的!我将告诉你怎样通过HTML表单来储存这些文件,怎样访问和使用这些文件。
  本文概述: 
  在mysql中建立一个新的数据库 
  一个怎样储存文件的例子程序 
  一个怎样访问文件的例子程序 
  在mysql中建立一个新的database
   首先,你必须在你的mysql中建立一个新的数据库,我们将会把那些二进制文件储存在这个数据库里。在例子中我会使用下列结构,为了建立数据库,你必须做下列步骤: 
  进入MySql控制器 
  输入命令"create database binary_data;" 
  输入命令"use binary_data;" 
  输入命令"CREATE TABLE binary_data ( id INT  (4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
description CHAR(50), bin_data LONGBLOB, filename CHAR(50), filesize CHAR  (50), filetype CHAR(50));" (不能断行) 
  如果没有意外,数据库 和 表 应该建立好了。 
  一个怎样储存文件的例子程序 用这个例子你可以通过Html表单将文件传输到数据库中。.

store.php3

以下为引用的内容:

// store.php3 – by Florian Dittmer 
?>

// 如果提交了表单,代码将被执行:

if ($submit) {

     // 连接到数据库
     // (你可能需要调整主机名,用户名和密码)

    MYSQL_CONNECT( "localhost", "root", "password");
    mysql_select_db( "binary_data");

    $data = addslashes(fread(fopen($form_data,  "r"), filesize($form_data)));

    $result=MYSQL_QUERY( "INSERT INTO binary_data (description,bin_data,filename,filesize,filetype) ".
         "VALUES (’$form_description’,’$data’,’$form_data_name’,’$form_data_size’,’$form_data_type’)");

    $id= mysql_insert_id();
    print  "

This file has the following Database ID: $id";

    MYSQL_CLOSE();

} else {

     // 否则显示储存新数据的表单
?> 
}

?>

  如果你执行了这个程序,你将会看见一个简单的Html表单,单击“浏览”选择一个文件,然后单击提交。
  当文件上传至web服务器之后,程序将会告诉你刚刚上传的文件的ID,记住这个ID,待会要用的。
  一个怎样访问文件的例子程序
  你可以通过这个程序访问你刚才储存的文件

以下为引用的内容:

// getdata.php3 – by Florian Dittmer 
// 调用方法: getdata.php3?id=

if($id) {

     // 你可能需要调整主机名,用户名和密码:
    @MYSQL_CONNECT( "localhost", "root", "password");

    @mysql_select_db( "binary_data");

    $query =  "select bin_data,filetype from binary_data where id=$id";
    $result = @MYSQL_QUERY($query);

    $data = @MYSQL_RESULT($result,0, "bin_data");
    $type = @MYSQL_RESULT($result,0, "filetype");

    Header(  "Content-type: $type");
    echo $data;

};
?>

  程序必须知道要访问那个文件, 你必须将ID作为一个参数。
  例如: 一个文件在数据库中的ID为2. 你可以这样调用它:
                    getdata.php3?id=2如果你将图片储存在数据库里, 你可以向调用图片一样调用它。
  Example: 一个图片文件在数据库中的ID为3. 你可以这样调用它:
                    
  怎样储存大于1MB的文件:
  如果你想储存大于1MB的文件,你必须对你的程序、PHP设置、SQL设置进行许多修改,。
  下面几条也许可以帮助你储存小于24MB的文件:
  修改 store.php3 ,将 MAX_FILE_SIZE 的值改成 24000000。 
  修改你的PHP设置,在一般情况下,PHP只允许小于2MB的文件,你必须将max_filesize(在php.ini中)的值改成24000000

  去掉MYSQL的数据包大小限制,在一般情况下 MYSQL 小于1 MB的数据包. 
  你必须用以下参数重启你的MYSQL
  /usr/local/bin/safe_mysqld -O key_buffer=16M -O table_cache=128 -O sort_buffer=4M -O record_buffer=1M -O max_allowed_packet=24M 

    一、修改硬盘分区表信息

    硬盘分区表信息对硬盘的启动至关重要,如果找不到有效的分区表,将不能从硬盘启动或即使从软盘启动也找不到硬盘。 通常,第一个分区表项的第0子节为80H,表示C盘为活动DOS分区,硬盘能否自举就依靠它。

    若将该字节改为00H,则不能从硬盘启动,但从软盘启动后,硬盘仍然可以访问。分区表的第4字节是分区类型标志,第一分区的此处通常为06H,表示C盘为活动DOS分区,若对第一分区的此处进行修改可对硬盘起到一定加密作用。

    具体表现在:

    1.若将该字节改为0,则表示该分区未使用,当然不能再从C盘启动了。从软盘启动后,原来的C盘不见了,你看到的C盘是原来的D盘,D盘是原来的E盘,依此类推。

    2.若将此处字节改为05H,则不但不能从硬盘启动,即使从软盘启动,硬盘的每个逻辑盘都不可访问,这样等于整个硬盘被加密了。另外,硬盘主引导记录的有效标志是该扇区的最后两字节为55AAH。若将这两字节变为0,也可以实现对整个硬盘加锁而不能被访问。硬盘分区表在物理0柱面0磁头1扇区,可以用Norton for Win95中的Diskedit直接将该扇区调出并修改后存盘。或者在Debug下用INT 13H的02H子功能将0柱面0磁头1扇区读到内存,在相应位置进行修改,再用INT 13H的03H子功能写入0柱面0磁头1扇区就可以了。

    上面的加密处理,对一般用户来讲已足够了。但对有经验的用户,即使硬盘不可访问,也可以用INT 13H的02H子功能将0柱面0磁头1扇区读出,根据经验将相应位置数据进行修改,可以实现对硬盘解锁,因为这些位置的数据通常是固定的或有限的几种情形。

    另外一种保险但显得笨拙的方法是将硬盘的分区表项备份起来,然后将其全部变为0,这样别人由于不知道分区信息,就无法对硬盘解锁和访问硬盘了。

    二、对硬盘启动加口令

    我们知道,在CMOS中可以设置系统口令,使非法用户无法启动计算机,当然也就无法使用硬盘了。但这并未真正锁住硬盘,因为只要将硬盘挂在别的计算机上,硬盘上的数据和软件仍可使用。要对硬盘启动加口令,可以首先将硬盘0柱面0磁头1扇区的主引导记录和分区信息都储存在硬盘并不使用的隐含扇区,比如0柱面0磁头3扇区。

    然后用Debug重写一个不超过512字节的程序(实际上100多字节足矣)装载到硬盘0柱面0磁头1扇区。该程序的功能是执行它时首先需要输入口令,若口令不对则进入死循环;若口令正确则读取硬盘上存有主引导记录和分区信息的隐含扇区(0柱面0磁头3扇区),并转去执行主引导记录。

    由于硬盘启动时首先是BIOS调用自举程序INT 19H将主硬盘的0柱面0磁头1扇区的主引导记录读入内存0000:7C00H处执行,而我们已经偷梁换柱,将0柱面0磁头1扇区变为我们自己设计的程序。这样从硬盘启动时,首先执行的不是主引导程序,而是我们设计的程序。

    在执行我们设计的程序时,口令若不对则无法继续执行,也就无法启动了。即使从软盘启动,由于0柱面0磁头1扇区不再有分区信息,硬盘也不能被访问了。当然还可以将我们设计的程序像病毒一样,将其中一部分驻留在高端内存,监视INT 13H的使用,防止0柱面0磁头1扇区被改写。

    三、对硬盘实现用户加密管理

    UNIX操作系统可以实现多用户管理,在DOS系统下,将硬盘管理系统进行改进,也可实现类似功能的多用户管理。该管理系统可以满足这样一些要求:

    1.将硬盘分为公用分区C和若干专用分区D。其中“超级用户”来管理C区,可以对C区进行读写和更新系统;“特别用户”(如机房内部人员)通过口令使用自己的分区,以保护自己的文件和数据;“一般用户”(如到机房上机的普通人员)任意使用划定的公用分区。后两种用户都不能对C盘进行写操作,这样如果把操作系统和大量应用软件装在C盘,就能防止在公共机房中其他人有意或无意地对系统和软件的破坏,保证了系统的安全性和稳定性。

    2.在系统启动时,需要使用软盘钥匙盘才能启动系统,否则硬盘被锁住,不能被使用。 此方法的实现可通过利用硬盘分区表中各逻辑盘的分区链表结构,采用汇编编程来实现。

    四、对某个逻辑盘实现写保护

    我们知道,软盘上有写保护缺口,在对软盘进行写操作前,BIOS要检查软盘状态,如果写保护缺口被封住,则不能进行写操作。而写保护功能对硬盘而言,在硬件上无法进行,但可通过软件来实现。

    在DOS系统下,磁盘的写操作包括几种情况:

    ①在COMMAND.COM支持下的写操作,如MD、RD、COPY等;

    ②在DOS功能调用中的一些子功能如功能号为10H、13H、3EH、5BH等可以对硬盘进行写操作;

    ③通过INT 26H将逻辑扇区转换为绝对扇区进行写;

    ④通过INT 13H的子功能号03H、05H等对磁盘进行写操作。 但每一种写操作最后都要调用INT 13H的子功能去实现。

    因此,如果对INT 13H进行拦截,可以实现禁止对硬盘特定逻辑盘的写操作。由于磁盘上文件的写操作是通过INT 13H的03H子功能进行写,调用此子功能时,寄存器CL表示起始扇区号(实际上只用到低6位);CH表示磁道号,在硬盘即为柱面号,该柱面号用10位表示,其最高两位放在CL的最高两位。

    对硬盘进行分区时可以将硬盘分为多个逻辑驱动器,而每个逻辑驱动器都是从某一个完整的柱面开始。如笔者的硬盘为2.5GB,分为C、D、E、F、G五个盘。其中C盘起始柱面号为00H,D盘起始柱面号为66H,E盘起始柱面号为E5H,F盘起始柱面号为164H,G盘起始柱面号为26BH。如果对INT 13H进行拦截,当AH=03H,并且由CL高两位和CH共同表示的柱面号大于E4H并小于164H,就什么也不做就返回,这样就可以实现对E盘禁止写。

    SQL Server连接中的常见错误:

  一、"SQL Server 不存在或访问被拒绝"

  这个是最复杂的,错误发生的原因比较多,需要检查的方面也比较多。

  一般说来,有以下几种可能性:

  1、SQL Server名称或IP地址拼写有误

  2、服务器端网络配置有误

  3、客户端网络配置有误

  要解决这个问题,我们一般要遵循以下的步骤来一步步找出导致错误的原因。

  首先,检查网络物理连接

  ping <服务器IP地址/服务器名称>

  如果 ping <服务器IP地址> 不成功,说明物理连接有问题,这时候要检查硬件设备,如网卡,HUB,路由器等。

  还有一种可能是由于客户端和服务器之间安装有防火墙软件造成的,比如 ISA Server。防火墙软件可能会屏蔽对 ping,telnet 等的响应

  因此在检查连接问题的时候,我们要先把防火墙软件暂时关闭,或者打开所有被封闭的端口。

  如果ping <服务器IP地址> 成功而,ping <服务器名称> 失败

  则说明名字解析有问题,这时候要检查 DNS 服务是否正常。

  有时候客户端和服务器不在同一个局域网里面,这时候很可能无法直接使用服务器名称来标识该服务器,这时候我们可以使用HOSTS文件来进行名字解析,

  具体的方法是:

  1、使用记事本打开HOSTS文件(一般情况下位于C:WINNTsystem32driversetc)。

  添加一条IP地址与服务器名称的对应记录,如:

  172.168.10.24 myserver

  2、或在 SQL Server 的客户端网络实用工具里面进行配置,后面会有详细说明。

   其次,使用 telnet 命令检查SQL Server服务器工作状态

  telnet <服务器IP地址> 1433

  如果命令执行成功,可以看到屏幕一闪之后光标在左上角不停闪动,这说明 SQL Server 服务器工作正常,并且正在监听1433端口的 TCP/IP 连接

  如果命令返回"无法打开连接"的错误信息,则说明服务器端没有启动 SQL Server 服务,

  也可能服务器端没启用 TCP/IP 协议,或者服务器端没有在 SQL Server 默认的端口1433上监听。

  接着,我们要到服务器上检查服务器端的网络配置,检查是否启用了命名管道。是否启用了 TCP/IP 协议等等

  可以利用 SQL Server 自带的服务器网络使用工具来进行检查。

  点击:程序 — Microsoft SQL Server — 服务器网络使用工具

  打开该工具后,在"常规"中可以看到服务器启用了哪些协议。

  一般而言,我们启用命名管道以及 TCP/IP 协议。

  点中 TCP/IP 协议,选择"属性",我们可以来检查 SQK Server 服务默认端口的设置

  一般而言,我们使用 SQL Server 默认的1433端口。如果选中"隐藏服务器",则意味着客户端无法通过枚举服务器来看到这台服务器,起到了保护的作用,但不影响连接。

   接下来我们要到客户端检查客户端的网络配置

  我们同样可以利用 SQL Server 自带的客户端网络使用工具来进行检查,

  所不同的是这次是在客户端来运行这个工具。

  点击:程序 — Microsoft SQL Server — 客户端网络使用工具

打开该工具后,在"常规"项中,可以看到客户端启用了哪些协议。

  一般而言,我们同样需要启用命名管道以及 TCP/IP 协议。

  点击 TCP/IP 协议,选择"属性",可以检查客户端默认连接端口的设置,该端口必须与服务器一致。

  单击"别名"选项卡,还可以为服务器配置别名。服务器的别名是用来连接的名称,

  连接参数中的服务器是真正的服务器名称,两者可以相同或不同。别名的设置与使用HOSTS文件有相似之处。

  通过以上几个方面的检查,基本上可以排除第一种错误。  

    二、"无法连接到服务器,用户xxx登陆失败"

  该错误产生的原因是由于SQL Server使用了"仅 Windows"的身份验证方式,

  因此用户无法使用SQL Server的登录帐户(如 sa )进行连接。解决方法如下所示:

  1、在服务器端使用企业管理器,并且选择"使用 Windows 身份验证"连接上 SQL Server

  2、展开"SQL Server组",鼠标右键点击SQL Server服务器的名称,选择"属性",再选择"安全性"选项卡

  3、在"身份验证"下,选择"SQL Server和 Windows "。

  4、重新启动SQL Server服务。

  在以上解决方法中,如果在第 1 步中使用"使用 Windows 身份验证"连接 SQL Server 失败,

  那就通过修改注册表来解决此问题:

  1、点击"开始"-"运行",输入regedit,回车进入注册表编辑器

  2、依次展开注册表项,浏览到以下注册表键:

  [HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSSQLServerMSSQLServer]

  3、在屏幕右方找到名称"LoginMode",双击编辑双字节值

  4、将原值从1改为2,点击"确定"

  5、关闭注册表编辑器

  6、重新启动SQL Server服务。

  此时,用户可以成功地使用sa在企业管理器中新建SQL Server注册,

  但是仍然无法使用Windows身份验证模式来连接SQL Server。

  这是因为在 SQL Server 中有两个缺省的登录帐户:

  BUILTINAdministrators

  <机器名>Administrator 被删除。

  要恢复这两个帐户,可以使用以下的方法:

  1、打开企业管理器,展开服务器组,然后展开服务器

  2、展开"安全性",右击"登录",然后单击"新建登录"

  3、在"名称"框中,输入 BUILTINAdministrators

  4、在"服务器角色"选项卡中,选择"System Administrators"

  5、点击"确定"退出

  6、使用同样方法添加 <机器名>Administrator 登录。

  说明:

  以下注册表键:
  HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSSQLServerMSSQLServerLoginMode

  的值决定了SQL Server将采取何种身份验证模式。

  1、表示使用"Windows 身份验证"模式

  2、表示使用混合模式(Windows 身份验证和 SQL Server 身份验证)。

    三、提示连接超时

  如果遇到第三个错误,一般而言表示客户端已经找到了这台服务器,并且可以进行连接,

  不过是由于连接的时间大于允许的时间而导致出错。

  这种情况一般会发生在当用户在Internet上运行企业管理器来注册另外一台同样在Internet上的服务器,并且是慢速连接时,有可能会导致以上的超时错误。有些情况下,由于局域网的网络问题,也会导致这样的错误。

  要解决这样的错误,可以修改客户端的连接超时设置。

  默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是 4 秒,而查询分析器是 15 秒(这也是为什么在企业管理器里发生错误的可能性比较大的原因)。

  具体步骤为:

  企业管理器中的设置:

  1、在企业管理器中,选择菜单上的"工具",再选择"选项"

  2、在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡

  3、在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数字,如 20。

  查询分析器中的设置:

  工具 — 选项 — 连接 — 将登录超时设置为一个较大的数字

  连接超时改为0

  1、先保证ping通

  2、在dos下写入telnet ip 1433不会报错

  3、用ip连如企业管理器:

  企业管理器–>右键SQlserver组–>新建sqlserver注册–>下一步–>写入远程实例名 (IP,机器名)–>下一步–>选Sqlserver登陆–>下一步–>写入登陆名与密码(sa,pass)– >下一步–>下一步–>完成

  4、如果还不行:

  sqlserver服务器–>开始菜单–>SQLserver–>服务器网络实用工具–>启用 WinSock代理–>代理地址:(sqlserver服务器IP)–>代理端口–>1433–>OK了

  5、如果还不行:

  sqlserver客户端–>开始菜单–>SQLserver–>客户端网络实用工具–>别名–>添加–>写入别名如"大力"–>"网络库"选tcp/ip–>服务器名称写入远程ip或实例名–>OK了

1. www.365kit.com 自动更新的通讯录
从名字来看,像是365key的姊妹网站,多种方式备份通讯录到服务器,随时取回,通过多种方式查询和管理通讯录。朋友联系方式改变,通讯录会自动更新。能与 Outlook,/Foxmail/手机 中的通讯薄直接同步。

2. www.yupoo.com 个人照片发布、存储、共享平台,影集、个人相册、完全免费、无限容量。照片共享部分很像国外的 Flickr.。

3. www.allmoneygomyhome.com 在线家庭理财及购物指南
名字有点长,好像是源于一条著名的手机短信。提供免费的在线家庭账本,详细的收支统计帮助你制定更合适的家庭财务计划,同时可以共享其他用户的消费记录,比如看看你心仪的商品别人以什么样的价格成交等。

4. www.diglog.com 奇客发现 有趣新鲜
把有趣、新鲜、实用、好玩的资讯或者链接分享出来,并且采用digg机制进行筛选。用户可以提交发现日志,分享给大家,同时让更多的人访问您的网络日志。

5. www.dodoor.cn 读岛个性化主页
类似 live.com 和 Google ig 的个性化浏览器首页,提供RSS订阅、天气预报、收藏夹、音乐盒等功能,较之国外同类网站,预置内容更符合国人口味。遗憾的是,作为游览器首页,访问速度似乎有待提高。

6. www.lend.com.cn 借物网
这个网站提供物品租借中介服务,看起来还是蛮有用的,域名也相当不错。你需要先登录几样闲置不用的物品借他人借用,然后你就可以查询和借用别人的物品了。我觉得特别适合二手书刊、音像制品的交流。

7. www.123cha.com 全库网123查
IP地址查询、手机号码归属地、邮政编码、身份证号码验证、世界时间、万年历、域名查询等各式各样的查询。

8. www.dict.cn 在线翻译 英汉词典
由在美国印第安纳大学的中国留学生创建,提供英汉/汉英词典在线翻译,支持拼写纠正,变形识别,拼音查询,查词历史保存,不重复汉英词条331万,英汉词条169万。可以不装几百M的金山词霸了。

9. www.8684.cn 公交查询
"86"代表中国,"84"是bus的谐音,代表巴士,公交的意思。可以查询全国各城市公交线路,连地级市都可以查询到。

10. www.flydays.com 电视剧剧情搜索
这个网站功能很单一,但很实用,它们提供电视剧的剧情搜索,并对搜索结果提供RSS支持。我搜索了一下,似乎数据库还不够全,应该会慢慢丰富起来。

11. www.btlao.com 一个站非常不错的BT站

变态佬BT,名字非常好记忆,收集了超过6万个种子的站,很多人下载,下载速度极快。。。。。网站也比较干净整洁,虽然开张不久,但访问量一点也不打折扣。

  一个网络系统的安全程度,在很大程度上取决于管理者的素质,以及管理者所采取的安全措施的力度。在对系统进行配置的同时,要把安全性问题放在重要的位置。

  SCO UNIX,作为一个技术成熟的商用网络操作系统,广泛地应用在金融、保险、邮电等行业,其自身内建了丰富的网络功能,具有良好的稳定性和安全性。但是,如果用户没有对UNIX系统进行正确的设置,就会给入侵者以可乘之机。因此在网络安全管理上,不仅要采用必要的网络安全设备,如:防火墙等,还要在操作系统的层面上进行合理规划、配置,避免因管理上的漏洞而给应用系统造成风险。

  下面以SCO UNIX Openserver V5.0.5为例,对操作系统级的网络安全设置提几点看法,供大家参考。

  合理设置系统安全级别

  SCO UNIX提供了四个安全级别,分别是Low、Traditional、Improved和High级,系统缺省为Traditional级;Improved级达到美国国防部的C2级安全标准;High级则高于C2级。用户可以根据自己系统的重要性及客户数的多少,设置适合自己需要的系统安全级别,具体设置步骤是:scoadmin→system→security→security profile manager。

  合理设置用户

  建立用户时,一定要考虑该用户属于哪一组,不能随便选用系统缺省的group组。如果需要,可以新增一个用户组并确定同组成员,在该用户的主目录下,新建文件的存取权限是由该用户的配置文件.profile中的umask的值决定。umask的值取决于系统安全级, Tradition安全级的umask的值为022,它的权限类型如下:

  文件权限: – r w – r – – r – –

  目录权限: d r w x r – x r – x

  此外,还要限制用户不成功登录的次数,避免入侵者用猜测用户口令的方法尝试登录。为账户设置登录限制的步骤是:Scoadmin–〉Account Manager–〉选账户–〉User–〉Login Controls–〉添入新的不成功登录的次数。

  指定主控台及终端登录的限制

  如果你希望root用户只能在某一个终端(或虚屏)上登录,那么就要对主控台进行指定,例如:指定root用户只能在主机第一屏tty01上登录,这样可避免从网络远程攻击超级用户root。设置方法是在/etc/default/login文件增加一行:CONSOLE=/dev/tty01。

  注意:设置主控台时,在主机运行中设置后就生效,不需要重启主机。

  如果你的终端是通过Modem异步拨号或长线驱动器异步串口接入UNIX主机,你就要考虑设置某终端不成功登录的次数,超过该次数后,锁定此终端。设置方法为:scoadmin→Sysrem→Terminal Manager→Examine→选终端,再设置某终端不成功登录的次数。如果某终端被锁定后,可用ttyunlock〈终端号〉进行解锁。也可用ttylock〈终端号〉直接加锁。

  文件及目录的权限管理

  有时我们为了方便使用而将许多目录和文件权限设为777或666,但是这样却为黑客攻击提供了方便。因此,必须仔细分配应用程序、数据和相应目录的权限。发现目录和文件的权限不适当,应及时用chmod命令修正。

  口令保护的设置

  口令一般不要少于8个字符,口令的组成应以无规则的大小写字母、数字和符号相结合,绝对避免用英语单词或词组等设置口令,而且应该养成定期更换各用户口令的习惯。通过编辑/etc/default/passwd文件,可以强制设定最小口令长度、两次口令修改之间的最短、最长时间。另外,口令的保护还涉及到对/etc/passwd和/etc/shadow文件的保护,必须做到只有系统管理员才能访问这两个文件。

  合理设置等价主机

  设置等价主机可以方便用户操作,但要严防未经授权非法进入系统。所以必须要管理/etc/hosts.equiv、.rhosts和.netrc这3个文件。其中,/etc /hosts.equiv列出了允许执行rsh、rcp等远程命令的主机名字;.rhosts在用户目录内指定了远程用户的名字,其远程用户使用本地用户账户执行rcp、rlogin和rsh等命令时不必提供口令;.netrc提供了ftp和rexec命令所需的信息,可自动连接主机而不必提供口令,该文件也放在用户本地目录中。由于这3个文件的设置都允许一些命令不必提供口令便可访问主机,因此必须严格限制这3个文件的设置。在.rhosts中尽量不用“+ +”,因为它可以使任何主机的用户不必提供口令而直接执行rcp、rlogin和rsh等命令。

  合理配置/etc/inetd.conf文件

  UNIX系统启动时运行inetd进程,对大部分网络连接进行监听,并且根据不同的申请启动相应进程。其中ftp、telnet、rcmd、rlogin和finger等都由inetd来启动对应的服务进程。因此,从系统安全角度出发,我们应该合理地设置/etc/inetd.conf文件,将不必要的服务关闭。关闭的方法是在文件相应行首插入“#”字符,并执行下列命令以使配置后的命令立即生效。

  #ps-ef   grep inetd   grep -v grep

  #kill -HUP 〈 inetd-PID 〉

  合理设置/etc/ftpusers文件

  在/etc/ftpuser文件里列出了可用FTP协议进行文件传输的用户,为了防止不信任用户传输敏感文件,必须合理规划该文件。在对安全要求较高的系统中,不允许ftp访问root和UUCP,可将root和UUCP列入/etc/ftpusers中。

  合理设置网段及路由

  在主机中设置TCP/IP协议的IP地址时,应该合理设置子网掩码(netmask),把禁止访问的IP地址隔离开来。严格禁止设置缺省路由(即:default route)。建议为每一个子网或网段设置一个路由,否则其他机器就可能通过一定方式访问该主机。

  不设置UUCP

  UUCP为采用拨号用户实现网络连接提供了简单、经济的方案,但是同时也为黑客提供了入侵手段,所以必须避免利用这种模式进行网络互联。

  删除不用的软件包及协议

  在进行系统规划时,总的原则是将不需要的功能一律去掉。如通过scoadmin–〉Soft Manager去掉X Window;通过修改/etc/services文件去掉UUCP、SNMP、POP、POP2、POP3等协议。

  正确配置.profile文件

  .profile文件提供了用户登录程序和环境变量,为了防止一般用户采用中断的方法进入$符号状态,系统管理者必须屏蔽掉键盘中断功能。具体方法是在.porfile首部增加如下一行:

  trap ‘ ‘ 0 1 2 3 5 15

  创建匿名ftp

  如果你需要对外发布信息而又担心数据安全,你可以创建匿名ftp,允许任何用户使用匿名ftp,不需密码访问指定目录下的文件或子目录,不会对本机系统的安全构成威胁,因为它无法改变目录,也就无法获得本机内的其他信息。注意不要复制/etc/passwd、/etc/proup到匿名ftp的etc下,这样对安全具有潜在的威胁。

  应用用户和维护用户分开

  金融系统UNIX的用户都是最终用户,他们只需在具体的应用系统中完成某些固定的任务,一般情况下不需执行系统命令(shell),其应用程序由.profile调用,应用程序结束后就退到login状态。维护时又要用root级别的su命令进入应用用户,很不方便。可以通过修改.profile 文件,再创建一个相同id用户的方法解决。例:应用用户work有一个相同id相同主目录的用户worksh, 用户work的.profile文件最后为:

  set — `who am i`

  case $1 in

  work ) exec workmain;exit;;

  worksh ) break;;

  esac