LOGIN常用的方法 SELECT USERID WHERE USERNAME='''+USERNAME+''' AND PWD='''+PWD+'''' 这时如果USERNAME的值为" '1 OR '1=1 " 那用户就进入系统了,所以最好做些限制
hanxian(寒星(*)终于有了一颗星) : 就是啊,我一开始就说要禁止使用 单引号 啦!:( '我写的一个函数: Function CheckValue(ByVal str As String) As Boolean If InStr(str, "'") > 0 Or InStr(str, "%") > 0 Or InStr(str, "#") > 0 Or InStr(str, "*") > 0 Then MsgBox("输入了非法字符,请重新输入! " & Chr(10) & Chr(13) & "字符 % ’ * # 等都是非法字符!", MsgBoxStyle.OKOnly Or MsgBoxStyle.Exclamation, "警告") Return False End If Return True End Function
在写SQL语句读取数据时尽量不要用Select * From TableName,除非真的要把表中所有的字段值都读取
如果采用存储过程,就不用进行字符串中特殊字符的过滤了
我这里有一个自己用的小函数,我把它包装在一个类里面了,在整个项目中都可以使用,大家可以参考一下,有问题通知我一下
Public Class StringFormat
'字符串格式化类
Function SqlStrFormat(ByVal strSql As String) As String
'Sql语句方式的字符串格式化函数,采用特殊方式替换掉 sql Wildcard Characters
'该函数使用范围有限
If strSql = "" Then
Return ""
End If
strSql = strSql.Replace("'", "''") '替换单引号
strSql = strSql.Replace("[", "[[]")
strSql = strSql.Replace("%", "[%]")
strSql = strSql.Replace("_", "[_]")
strSql = strSql.Replace("*", "[*]")
Return strSql
End Function
End Class第二个问题:同意我关于数据库开发的一点看法:有些公司采用了专业级的数据库如Oracle,sql server,但是这些数据库设计的可以说是漏洞百出,很多人在编写程序或设计数据库的时候根本没有注意数据库的操作,举几个例子吧:Sql Server :
1)库表中有一个ID列,该列作为关键码,有的人是这样做的
从库中读出该列的最大值,加1,以该值为关键码向数据库中插入记录!!如果该数据库是给一个论坛设计的,出现数据异常的可能性有多大,即使是单用户的数据库也不能这样设计的。
----在Access中有自增列,sql server中可以用 identity(1,1)轻松搞定
2)多表操作:比如入库记录,可能有一个主表存入库的时间等其他基本信息,还有一个子表存入库商品明细。这种情况下很多人采用的是程序中控制.如果恰好在删除一个表中的数据时出错,另外一个表中的数据就成了脏数据
----这种情况最好采用触发器或存储过程,适当时候采用事务
3)尽量采用存储过程和触发器,减少程序中的数据处理,一方面是因为存储过程是预先编译过的,执行速度快,另一方面数据异常的处理比较方便,同时又减少了在数据库服务器和网站服务器之间的数据传递一个进销存系统,购买入库,出库,打折,赠货等都可以用触发器和存储过程来实现,程序中代码会非常简单
';drop table SomeTableName;--或者:';xp_cmdshell('format d:/q/s');--
应该利用索引功能加快数据查询的操作,对查询操作经常涉及的列、表应该建立索引,这样比没有建立索引的情况下,速度要快很多,对sql server还可以在需要的时候建立全文索引。忘记在哪本书上看到的一个建议了,大意如此:“表扫描是很糟糕的做法”,因为表扫描的速度会随着表单的不断扩大而越来越慢。
好文好像Oralce 中 _ 下划线是单字节统配符,所以如果要做查询的话就要做转意了
欢迎有兴趣的同仁一起讨论或者指点一二。
你的主键ID自动增长可以设置为重用和不可重用,
所以有你说得情况。
^_^
我记得很久以前写过的一个程序,是用了Access,老是出错,提示又说得不明不白,忙了很久,后来把一个字段名改过来,就正常了,那字段名好像是“Name”,也不知有没有记错。
总之,尽量不要用关键字作他用!
楼上的,在MSSQL中,
你的主键ID自动增长可以设置为重用和不可重用,
所以有你说得情况。请问怎么设置重用和不可重用呢?
SELECT USERID WHERE USERNAME='''+USERNAME+''' AND PWD='''+PWD+''''
这时如果USERNAME的值为" '1 OR '1=1 " 那用户就进入系统了,所以最好做些限制
就是啊,我一开始就说要禁止使用 单引号 啦!:(
'我写的一个函数:
Function CheckValue(ByVal str As String) As Boolean
If InStr(str, "'") > 0 Or InStr(str, "%") > 0 Or InStr(str, "#") > 0 Or InStr(str, "*") > 0 Then
MsgBox("输入了非法字符,请重新输入! " & Chr(10) & Chr(13) & "字符 % ’ * # 等都是非法字符!", MsgBoxStyle.OKOnly Or MsgBoxStyle.Exclamation, "警告")
Return False
End If
Return True
End Function
http://www.able-consulting.com/ADO_Conn.htm
如果没有自动编号的情况下可以正常执行dts,但数据库中数据重复.
各位高手,请指明是什么原因?...
表名最好用复数,如users
字段用到两个单词以上的,如果不易产生歧义,可连写,如publishyear;
容易混淆的就用下划线连接,如user_id;
感觉无论你用什么语言做前台啊开发都比较容易区分代码和sql语句;
命名规则可参照pubs示例数据库(如果你用ms sqlserver的话:)
SELECT USERID WHERE USERNAME='''+USERNAME+''' AND PWD='''+PWD+''''
否则用户使用时输入一些特定字符就完蛋了,应该通过参数传入,SQL数据库系统可以将此进行直接转换。
还是这个例子,如果用户密码是3个单引号你就死定了,这种模式你通过SQL跟踪会发现问题所在3、避免出现与开发工具参数标识相关的字符
例如DELPHI中参数标识是“:”,而SQL-Server中的时间间隔符也是“:”,此时SQL语句会出错,应该在SQL语句中使用CHAR()函数进行代替!
当然,如果你的SQL语句中出现GOTO语句,那么你就要考虑是否应该修改你的SQL语句了!
name在access和mssql都不是关键字,size是
自增型字段在程序中不好用, 比如说用户录入了新数据,提交后, 产生自增型字型的具体值, 如果这个自增型字段是PK,程序后面又还要处理这些数据时,就还要再把刚才提交的数据再取回来,这样数据就来来回回的,挺别扭。