2005年4月19日星期二

预防SQL注入漏洞函数

仅仅代表我的观点.不怕见笑.有问题请大家指教!我想如果你是牛人,那这个已经不是值得你看的内容,只是觉得对与很多刚入门的ASP程序员来说还是有点实际意义,所以不怕被大家笑话,写了贴在这里!

 

<%
Function checkStr(str)

if isnull(str) then

checkStr = ""

exit function

end if

checkStr=replace(str," ","")

checkStr=replace(str,"'","'")

checkStr=replace(str,";","'")

checkStr=replace(str,"--","'")

checkStr=replace(str,"(","'")

checkStr=replace(str,"[","'")

checkStr=replace(str,"$","'")

end function

%>


相关函数
Left(string, length)
 返回指定数目的从字符串的左边算起的字符
 
Asc(string)
 返回与字符串的第一个字母对应的 ANSI 字符代码。
 
Mid(string, start[, length])
 从字符串中返回指定数目的字符。
 
***********************************
我自己的做法是把字符串限定在8个字符内,呵!(千万条数据啊,没谁有这样大的记录吧?99,999,999呵!不够用,才怪了!除非你的数据从来不更新删出,那也没办法,问题是sql到了这样的时会是怎么样的速度)


---<%
if len(request.querystring("ddd"))> 8 then
response.write(黑我啊,不要了。少来)
response.end '最好有这句

'''初步是判断是否是数字=======IsNumeric 函数
if IsNumeric(request.querystring("ddd")) then

Execute("select * from [table]")

....

else

response.write(黑我啊,不要了。少来)
response.end '最好有这句

%>

当然了,加上上面的函数,在你的SQL过程里,效果就非常完美了!

呵!!!在变态点做个函数。

---<%
Function checkStr(str)

if isnull(str) then

checkStr = ""

exit function

end if

checkStr=replace(str," ","")

checkStr=replace(str,"'","'")

checkStr=replace(str,";","'")

checkStr=replace(str,"--","'")

checkStr=replace(str,"(","'")

checkStr=replace(str,"[","'")

checkStr=replace(str,"$","'")

checkStr=replace(str,"asc'," ")

checkStr=replace(str,"mid"," ")

checkStr=replace(str,"delete"," ")

checkStr=replace(str,"drop"," ")

'''呵!!我这里没屏蔽select,count,哈!想起来我就笑,太变态了,那其不是我什么都不用了不是更更安全啊!!!呵!!~^)^~
end function

%>


足够了,这个函数加载到sql选取记录集的地方。
如:rsql="select * from table where xxx="&checkstr(request.querystring("xxyy"))&""
或者来就判断字符串

说的有点林乱,但是就是这些了,对于普通的"黑客"已经足够他毫些时间了。但是对于老到的真正意义的黑客,这些都不是万能的东西,人家连服务器都黑,你能怎么样啊?嘿!!

看了些资料,结合自己的经验,写在这里。算是自己复习一下,看到的朋友也可以一起交流!

 

2005年4月18日星期一

WEBS上自动下载控件的实现方法

例子代码如下所示:


<SCRIPT LANGUAGE="VBScript">
<!--

Function OCXTest()
OCXTest = 1
dim ocx
on error resume next
err.clear
set ocx = createobject("I_FLEXGRID.FlexGridCtrl.2")
set ocx = nothing
if err <> 0 then
OCXTest = 0
err.clear
exit function
end if
set ocx = createobject("LEDGER50_I.Ledger50Ctrl_I.1")
set ocx = nothing
if err <> 0 then
OCXTest = 0
err.clear
exit function
end if

End function

//-->
</SCRIPT>

<Script language="JavaScript">


   var setup = OCXTest();

   if (setup==0) //客户端未安装控件,打开自解压包的链接提示用户下载安装

   {
   window.open("cab/instgb.exe");
   window.open("cab/dssview.exe");

   }


</script>

2005年4月17日星期日

WinXP之后如何安装Win2000

这种方法只可应用于 FAT32 格式的硬盘上.

安装 Windows 2000

1) 用一张 Win98\Me 启动盘(支持光驱)启动你的电脑。
2) 将 Windows 2000 CD 放入你的光驱中。
3) 在 A: 提示符下输入 X:\I386\WINNT.EXE 这里 X: 是你的光驱盘符。
4) 下面开始安装 Windows 2000 到非 Windows XP 的安装分区中。
5) 安装完毕之后,在 Windows 2000 中重启电脑。

修复 Windows XP 引导信息

用你的 Windows XP CD 启动电脑。当到达 Setup or Repair(安装与修复)步骤时,选择修复。在修复控制台中,输入如下内容:

1) FIXBOOT, answer Yes
2) CD
3) ATTRIB -H NTLDR
4) ATTRIB -S NTLDR
5) ATTRIB -R NTLDR
6) ATTRIB -H NTDETECT.COM
7) ATTRIB -S NTDETECT.COM
8) ATTRIB -R NTDETECT.COM
9) COPY X:I386NTLDR C:
10) COPY X:I386NTDETECT.COM C:

X 是你光驱的盘符。

2005年4月16日星期六

精妙SQL语句

下面是我搜集的一些精妙的SQL语句。

说明:复制表(只复制结构,源表名:a 新表名:b)
SQL: select * into b from a where 1<>1

说明:拷贝表(拷贝数据,源表名:a 目标表名:b)
SQL: insert into b(a, b, c) select d,e,f from b;

说明:显示文章、提交人和最后回复时间
SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

说明:外连接查询(表名1:a 表名2:b)
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

说明:日程安排提前五分钟提醒
SQL:  select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

说明:两张关联表,删除主表中已经在副表中没有的信息
SQL: 
delete from info where not exists ( select * from infobz where info.infid=infobz.infid )

说明:四表联查问题:
SQL: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c  inner join d on a.a=d.d where .....

说明:得到表中最小的未使用的ID号
SQL:
SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID
FROM  Handle
WHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle a)
 
COALESCE
返回其参数中第一个非空表达式。

语法
COALESCE ( expression [ ,...n ] )

2005年4月15日星期五

JSP的参数传递的乱码解决

本文解决了JSP的URL字符 encoding 问题:

如果通过 get/post 方式从 browser 返回的值中包含汉字信息, servlet 将无法得到正确的值。

解决方案

http://www.williamlong.info/index.jsp?value=你好

解决方案是用这种方案:

<%@ page contentType="text/html;charset=gb2312" %>
<html>
你好<%=new String(request.getParameter("value").getBytes("8859_1"),"gb2312")%>
</html>

2005年4月12日星期二

三种禁用FileSystemObject组件的方法

众所周知,FileSystemObject组件的强大功能及破坏性是它屡屡被免费主页提供商(那些支持ASP)的禁用的原因,我整理了一下,本来只找到两种方法,后来被某人一刺激,硬是想到第三种不为人所知的方法,呵呵,也不知道是不是这样的。

第一种:用RegSrv32 /u C:WINDOWSSYSTEMscrrun.dll(win98路径)来注销该组件。此方法过于狠毒,属于同归于尽的方法,大家都没得用,是下招

第二种:修改Progid的值,在ASP里调用组件的方式通常是 Set 对象名=Server. CreateObject("Progid"),这时候我们就可以通过修改注册表中的Progid值从达到禁用该组件的方法。在 开始-运行中敲入regedit,然后找到HKEY_CLASSES_ROO TScripting.FileSystemObject,这时候我们就可以更改该Progid的值了,如改成Scripting.FileSystemObject8。这样在ASP页里就这样调用了:

<%@ Language=Vbscript%>
<%
Set Fs=Server.CreateObject("Scripting.FileSystemObject8")
%>

(如果你前面没有调用过该组件的话,则无须重启,就可以看到效果了,否则请重启后看效果。)

这时候我们看看还是用原来的调用方法的结果:

<%@ Language=Vbscript%>
<%
Set Fs=Server.CreateObject("Scripting.FileSystemObject")
%>

这时候的运行结果为:
服务器对象 错误 'ASP 0177 : 800401f3'

Server.CreateObject 失败

/aspimage/testfile2.asp, 行3

800401f3

(OK,达到我们的要求)

该方法由于本人迟了两步,结果就让别人抢着回答了,这样极大的刺激了我,结果就产生了第三种方法。

第三种:细心的高手们会想,既然能通过修改Progid值来禁用该组件,那Clsid是否也可以来修改呢?(OK,你想得和我一样)我们知道,除了CreateObject方法以外,也可以使用一般的<object>标注建立一个组件,我们可以在ASP里面使用HTM L的<object>标注,以便在网页中加入一个组件。方法是:

<object runat=server id=fs1 scope=page progid="Scripting.FileSystemObject"></object>

Runat表示是在服务端执行,Scope表示组件的生命周期,可以选用Session,Appl ication或page(表示当前页面,也可缺省)

这种写法对我们没用,还有一种写法是:

<object runat=server id=fs1 scope=page classid="clsid:clsid的值"></object>

我们也可以通过修改该Clsid的值而禁用该组件,如将注册表中HKEY_CLASSES_RO OTScripting.FileSystemObjectCLSID的值0D43FE01-F093-11CF-8940-00A0C90 54228改成0D43FE01-F093-11CF-8940-00A0C9054229(改了最后面一位),这时候的写法为:

<object runat=server id=fs1 scope=page classid="clsid:0D43FE01-F093-11CF-8940-00A0C9054229"></object>

看运行结果,没问题,OK。这时候我们再用

<object runat=server id=fs1 scope=page classid="clsid:0D43FE01-F093-11CF-8940-00A0C9054228"></object>

这时候就出错了。(本文来源于网络论坛,原始作者不详)

2005年4月11日星期一

编写COM组件,将数据库链接的语句写成COM组件

打开VB,新建ActiveX Dll,将工程改名为COMConnection,类模块改名为class,在class的代码里写

Option Explicit


Public Function GetConn(m_objConn As Connection) As String
   
    On Error GoTo here
   
    Dim m_szConnstr As String
   
    m_szConnstr = "Provider=SQLOLEDB.1;Data Source=192.168.0.101;User ID=sa;Password=;Initial Catalog=aaa"
   
    m_objConn.Open m_szConnstr
   
    GetConn = "OK"
    Exit Function
   
here:
    GetConn = "open database is error.error id is " & err.Description

End Function


然后编译
Asp里这样用
<%
    dim obj,conn,msg
    set obj=server.create("COMConnection.class")
    set conn=server.create("adodb.connection")
    msg=obj.GetConn(conn)
    if msg="OK" then
        //这里写代码,conn已经打开数据库了
    else
        resposne.write msg   //出错了,显示出错信息
    end if
%>