我对shell中的精髓是awk不敢苟同,不过awk对字符串的处理很是蛮强大的。

平时做unix/linux管理的朋友对cat、grep等肯定不会陌生,但我要说,awk才是shell中的精髓所在。

我们可以把awk看作一个小的c语言的实现,awk的灵活多变黎补了shell的不足。

学习awk可以从“man awk”开始,但更高级的用法,可以参考网上的更详尽的文档。nawk是awk的兄弟,算是awk的一个高级实现,能实现更多的更高级(好用)的应用。

不会用awk,别说你已经懂了shell编程。

这里附录一下awk的常识:

1、awk程序体的一般格式为:
awk '
BEGIN{}         #程序开始前的预处理部分可以对一些变量进行初始化
{}              #对每条记录进行操作的主体部分
END{}' <文件名> #程序的结束部分,可以对处理的结果作一些善后或总结

2、awk的程序风格完全可以按照c语言的风格书写。例如:
awk '{
if ($1 == "FIND")
regex = $2;
else
{
where = match($0, regex);
if (where)
printf("Match of %s found at %d in %s",regex,where,$0);
}
}' <文件名>
当然,awk支持一些更简洁的书写风格,例如上面的printf语句可以写成:
print "Match of", regex, "found at", where, "in", $0

3、记录和字段的表示法。
整条记录表示为$0,第n个字段表示为$n

4、常用内在变量。
NR 是记录号,即当前正在处理第几条记录。
NF 是当前记录共有多少个字段,
这样,每条记录最后一个字段可表示为$NF,倒数第2个字段可表示为$(NF-1)
FS 是一个说明各个字段如何分隔开的预定义变量.
这经常用于BEGIN语句体中预定义,类似于cut中的-d功能.
RS 是一个说明各个记录如何分隔开的预定义变量.
这经常用于BEGIN语句体中预定义,例如,RS=":" 表示各条记录是用":"分开的.
OFS 定义各字段在输出时如何分隔开.
ORS 定义各条记录在输出时如何分隔开.

5、输出重定向。
例如:
awk '{ print $2 > "phone-list"
print $1 > "name-list" }' BBS-list
双引号内为文件名。

6、在awk中利用管道向shell命令传递参数。
例如:
awk '{ print $1 > "names.unsorted"
print $1 | "sort -r > names.sorted" }' BBS-list

7、awk的特有函数和其它功能请参阅awk手册。

另外,nawk比awk具有更多的功能,它能够把shell中的变量传递给nawk。
nawk格式:
Usage: nawk [-f programfile | 'program'] [-Ffieldstep] [-v var=value] [files]
例如,可以这样向nawk传递shell变量:
nawk -v dr=$HOME -v pk=`hostname` 'BEGIN{print dr pk}'
#!/bin/sh

var=$(awk '{print $1}' tmp.txt)

echo $var

注意:var= 后面没有空格;



-----------------------------------------

awk使用shell变量

1."'$var'"

#!/bin/bash
var="test"
awk 'BEGIN{print "'$var'"}'

这种写法要求变量var中不含有空格。若var中含有空格,那么就要用"'"$var"'"

2.export变量,然后用ENVIRON[“var”]

#!/bin/bash
var="test"
export var
awk 'BEGIN{print ENVIRON["var"]}'

3.使用-v选项。

#!/bin/bash
var="test"
awk -v nvar="$var" 'BEGIN{print nvar}'

shell使用awk传递出来的变量 --eval

$ cat awktest.sh


#!/bin/bash
var1="test"
var2="along"
eval $(awk 'BEGIN{print "var1=along;var2=test"}')
echo "var1:"$var1
echo "var2:"$var2

$ ./awktest.sh


var1:along
var2:test



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/shuinieh/archive/2009/10/10/4649723.aspx
shell基础:

$# :传递到脚本的参数个数。
一般$1表示第一个参数,  
  $2表示第二个参数,  
  ..依此类推,哈哈,  
  不要超过就是了哦
main(int   argc,   char   *   argv[])  
    
  $1   是表示   argv[0]?     argv[1]?  
$1表示argv[1]

动态获取shell的argv变量及下载Url的文件名及目录位置,wget下载确保安全下载的方法:

阅读全文
武功再高,也怕菜刀

  ——解析武学衰落之路
  遍观整个金庸武侠世界,可以说是一代不如一代,从北宋天龙那个群星闪耀,到韦爵爷宝衣匕首横行天下,这中间究竟发生了什么?

  要解决这个问题,首先要回答另一个问题为什么要学武。或者说,武功有什么用?大致说来,武学拥有两个功能:第一强身健体;第二克敌制胜。有人或者会说,这种划分不正确。因为强身健体,自然就能克敌制胜,克敌制胜的同时也能强身健体。这是一而二,二而一的问题。本来也是这样,但从一代剑魔独孤求败的出现,这两个目的开始分化,并最终导致了整个武学的衰落。

  大家知道,独孤求败有四柄长剑,两位传人。同为独孤传人的杨过和令狐冲,他们的剑法为什么会差别这么大。一个是“重剑无锋,大巧不工”,拿把几十斤的重剑砸过来砸过去,以浑厚的内力取胜;另一个却没有半点内力,有剑在手便纵横驰骋,没剑了便是废物一个。一个极度依赖内力,一个用一把剑就可以弥补内力的不足。我只能说杨过学的是第三把剑重剑,令狐冲学的是第四把剑木剑。

  “四十岁后,不滞于物,草木竹石均可为剑自此精修,渐进於无剑胜有剑之境”这句话是什么意思。窃以为: “无剑胜有剑”说的是实事求是,具体问题具体分析。而“不滞于物,草木竹石均可为剑”是说“黑猫白猫,捉住老鼠就是好猫”。只要你能打败对方,不论你用什么,木头石头都是可以的,正所谓,“不滞于物”。而不是要求你把内力炼到飞花摘叶都可伤人的地步。这才是独孤求败的最高剑法——把你手中的东西捅进对方的身体,其他的东西你就不用管了。就这样,一代剑魔独孤求败把武学带进了魔道。

  独孤求败用自己毕生的智慧揭示一个深刻无比的道理:武功再高,也怕菜刀。说到截金断玉,十年内功不如买把好刀。内力高有什么用,任我行抽再多的内力,也摸不到东方不败半点裙子。如果你能摸到,用内力劈还不如拿菜刀砍。与其花费毕生精力修习内力,不如把工夫花在琢磨怎么把菜刀砍在别人身上。

  伟大的独孤求败天才地揭示了武学中的菜刀定理,伟大的令狐冲天才地实践了这一理念。在两位先哲的指导下,越来越多的大侠小侠们在追求武学的实用性上越走越远。于是韦小宝对陈近南的内功不屑一顾,拿着匕首石灰蒙汗药横行江湖。武学也一步步走向衰落。
[ 转自铁血社区 http://bbs.tiexue.net/ ]

  杀死一个人,最好的方法是什么?用手枪。——火器来了,武学走了。在中华大地武学一步步走向衰落的时候,在西方却有一种运动的兴起,奥林匹克。因为它们追求的是第一种目的强身健体,而中华武学却被那个疯子带入了魔道。
Shell是每一个UNIX系统都有的工具,他功能强大,有很多系统启动程序是用Shell来写的.

在这里,我们利用Shell程序来操作MySQL数据库.
约定: MySQL管理用户为root, 密码为secret.


# vi mysql_opt.sh

#!/bin/sh
#

# 调用方法: mysql_opt $db_name "SQL语句"


sql_user=root
sql_pass=secret
sql_opt="-u$sql_user -p$sql_pass -s"

mysql_opt() {
  db_name=$1
  sql_lan=$2
  mysql $sql_opt << EOF
    USE $db_name;
    $sql_lan;
    QUIT
EOF
}

#
# The file mysql_opt.sh ends here!


这样,就能通过调用mysql_opt函数来对MySQL数据库进行操作.
例: 要查找数据库test_db中test_table表的所有数据


# vi select.sh

#!/bin/sh
#

. ./mysql_opt.sh

echo "Query..."
data=`mysql_opt test_db "SELECT * FROM test_table WHERE 1"`
echo $data
echo "Done!"

#
# The file select.sh ends here!

[root@kevin bin]# ./mysql -u root -p111111 -e "use mysql;select host,user,password from user";
+-----------+------+-------------------------------------------+
&#124; host      &#124; user &#124; password                                  &#124;
+-----------+------+-------------------------------------------+
&#124; localhost &#124; root &#124; *FD571203974BA9AFE270FE62151AE967ECA5E0AA &#124;
&#124; kevin.com &#124; root &#124;                                           &#124;
&#124; 127.0.0.1 &#124; root &#124;                                           &#124;
&#124; localhost &#124;      &#124;                                           &#124;
&#124; kevin.com &#124;      &#124;                                           &#124;
+-----------+------+-------------------------------------------+

****************************************


#!/bin/bash

/usr/local/mysql-5.1.32/bin/mysql -u root -p111111 -e "use mysql;select host,user,password from user";

exit 0;

****************************************


如果需要导出mysql的记录到文本文件:


/usr/local/mysql-5.1.32/bin/mysql -u root -p111111 -e "use mysql;select host,user,password from user into outfile '/home/mysql/aa.txt';"
mysql -u $user -p$password -e "create database test;"


我知道的有如下两种方式可以在shell中访问操作mysql数据库
1. mysql -uusername -ppasswd -e "command;command"

[root@localhost ~]# mysql -uroot -p123456 -e "select user,host from mysql.user"
+------+-----------------------+
&#124; user &#124; host                  &#124;
+------+-----------------------+
&#124; root &#124; %                     &#124;
&#124; root &#124; 127.0.0.1             &#124;
&#124; php  &#124; localhost             &#124;
&#124; root &#124; localhost             &#124;
&#124; root &#124; localhost.localdomain &#124;
+------+-----------------------+
请看下面这段文字:(引自mysql参考手册)
对mysql偶尔有用的另一个选项是-e或--execute选项,可用来将SQL语句传递给服务器。该语句必须

用引号引起来(单引号或双引号)。(然而,如果想要在查询中将值引起来,则对于查询应使用双引号

,查询中引用的值应使用单引号)。当使用该选项时,语句被执行,然后mysql立即退出命令外壳。

例如,你可以用下面的命令获得用户账户列表:

shell> mysql -u root -p -e "SELECT User, Host FROM User" mysql

请注意mysql数据库名作为一个独立的参量传递。然而,相同的查询可能已经使用mysql -u root -p

-e "SELECT User,Host FROM mysql.User"从外壳中执行。

可以按这种方式传递多个SQL语句,用分号隔开:


shell> mysql -u root -p --execute="SELECT Name FROM Country WHERE Name LIKE

'AU%';SELECT COUNT(*) FROM City" world


2. 如果sql语句比较多,可使用如下方式:

[root@localhost ~]# mysql -uroot -p123456 << EOF
> use mysql;
> select user,host from user;
> EOF
user    host
root    %
root    127.0.0.1
php     localhost
root    localhost
root    localhost.localdomain


从查询结果中可以看出,两者的输出结果格式不一样,前一种方式保留了mysql的输出格式。
另外,与此篇文章有关的shell 重定向知识,可以查阅ABS guide第16章节“I/O重定向”和第17章节“Here Documents”

重定向示意:

mysql -uroot -p123qwe <"/opt/sqlinfo.sql" >"a.txt"


自动登录mysql(root:root,passwd:123456),查询test库,test1表里的user=aa的记录.
#!/bin/sh
mysql -uroot -p123456 <use test;
select * from testaa while a=10000;     ###1000 not usr single quote mark,because a is int type,only char type need single quote mark.
EOF
cat /tmp/765469051.txt |grep 2009-12-06|awk '{print $2 "  " $3}'|grep 5|wc
使用 pq magic 8.0分区出现 Error 983 报错信息的处理办法

解决方法:

1.确保登陆的用户为 Administrator,并且 Administrator 的缺省权限没有修改过。
2.执行 chkdsk /f 命令确认硬盘磁道及其文件和分区注册表没有问题
3.请关闭 norton 的自动保护功能和其他有系统保护功能的程序。
4.执行 pqmagic 8.0 进行分区工作。
另外,如果是ntfs分区格式的硬盘,请取消其对属性的改动。例如:取消压缩和设置密码。 这些都会导致操作的失败。

多数情况下只要在运行chkdsk /f 即可解决。
sysfader:iexplore.exe-应用程序错误的解决方法
起因

每一次写blog就报这个错误……好打击积极性……还好有解决办法……

现象:

在运行iexplore.exe浏览网页的时候,有时会弹出错误提示框,一点确定就把IE关闭了。这由于设置了网页的指定颜色导致的。

错误信息提示如下:
错误:“0x029b6c3d”指令引用的“0x00000000”内存。该内存不能 为“read”。

sysfader.exe是附属于Nvidia显卡驱动程序的,用于处理桌面的淡入/淡出效果,以及气球提示条,在通常情况是不会出现在进程中并引起错误的。

解决

第一步:
注册所有的Dll,具体方法是:
点击:开始-->运行,在运行框中输入cmd,在命令提示符下输入:
for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1

第二步:
请右键单击"我的电脑",点击"属性"-->"高级",在"性能"一栏中,将所有特殊效果取消。即调整为最佳性能。
(然后在转为最佳视觉看看还会不会出错……不然windows太难看了……)
把本地连接属性里面的TCP/IP协议属性对话框打开,然后选手动配置IP,随便填入192.168.0.1之类的IP,子网掩码输入255.255.255.0,点确定即可。
出现提示的原因是:
SP2更多考虑了安全问题,你的IP设置为自动获取,其实是从DHCP服务器获取IP及相关参数,但是这个过程可能由于某种原因,没有完成.在SP1时代,这种情况下,操作系统为了防止脱网(微软这么写的),自作主张为网卡设置169.x.x.x的保留IP,不作任何错误提示,如果有多台计算机没有获得正确的IP,那么他们通过保留地址还可以互相通讯。但是安装SP2后,操作系统依据“安全”至上的原则,不分配任何IP,切断网络连接,并报告错误“本地连接受限制或无连接”。
脑上的本地连接显示受限制或无连接是跟网络服务器和网卡有关的。反正属于网络方面的问题,跟计算机没多大关系,不影响系统,可以不用管他的。如果实在烦,可以在“网络连接“的”本地连接“的设置里把”无连接时通知我“的选项去掉.不影响上网
内网的话指定一个IP就好啦........

http://www.cisco.com/web/CN/products/products_netsol/wireless/pdf/wireless_cg_6.pdf
台式机,安装Windows XP SP2,使用PCI 54M无线网卡,连接无线路由器。阅读全文
struts就相当于业务层,一般是用来控制跳转,hibernate是提供数据的,也就是数据持久层,与数据库打交道的那一层,spring是对hibernate的更深次包装,他是一个大型的平台既包含struts也包含hibernate更包其他的框架,
1 Struts

虽然不打算过多介绍Struts的原理,但是大概介绍一下还是有必要的。Struts本身就是 MVC 在这里负责将用户数据传人业务层,以及 将业务层处理的结果返回给用户,此系统属于较简单WEB应用,采用了OpenSessionInView模式处理LazyLoad问题,这样我们可以在用户视图中使用 get,set方法来方便地获取关联对象。为了处理庞大的Action和ActionForm问题,在此我门准备使用DynaActionForm (DynaValidatorForm)和DispatchAction以及 动态验证框架 来解决。及使用Tile来解决框架问题 。使用自定义标签处理分页和身份验证问题。

2 Spring

Spring Framework最得以出名的是与Hibernate的无缝链接,虽然Spring 对Hibernate提供了90%以上的封装,使我们不必去关心Session 的建立,关闭,以及事务使我们能够专心的关注业务逻辑。但是一些特殊情况如 有时需要Query以及Criteria 对象,分页等,Spring不能给我们提供支持,总不能每次都在你的DAO上写个HibernateCallBackup()吧?Spring的作用不是把Hibernate再封装一层,而是让你接触不到Hibernate的API,而是帮助你管理好Session和Transaction。

在这里解决方法是:首先 写一个IBase 的接口,和一个BaseDao的实现。在实现中仿照HibernateTemplate,将其功能一一实现,同时考虑到Spring 未能支持的地方,我们不得已只好自己来管理Session,因此加入public Session openSession(),public Query getQuery(String sql),public Criteria getCriteria(Class clazz),以及分页的方法。 然后为每一个Entity 都建立继承于以上类的IEntity,与EntityDao。这里可以根据需求对Entity加入特殊的方法实现,如 在 StudentsDao.java 中加入类似用户身份验证等。以上就是数据访问层。接下来在Service层中通过对dao的引用完成业务逻辑方法。在下面的例子中我们分别为学生模块,教师模块,管理员模块构建Service层,StudentsServiceImpl,TeachersServiceImpl,AdminServiceImpl。



3 Hibernate

有了Spring的封装,我们要对Hibernate做的就是正确实现对象关系的映射。由于此处处于系统的最底层,准确无误的实现对象之间的关联关系映射将起着至关重要的作用。

总之,理解了Struts,Spring,Hibernate地原理以及之间的关系之后,剩下的工作就如同在以Spring为核心的Struts为表现的框架中堆积木。
最后:
框架只是幫助你快速開發的。好的軟件公司更注重你在j2se、數據結構、算法設計、設計模式、操作系統、計算機組成原理、計算機網絡等方面的素質。如果以上這些方面的基礎都穩固了,你就已經比那些只會框架的“軟件民工”值錢了。那個時候,別說學框架了,自己已經能開始寫框架了。

Add Time:(2014-09-15)
兄弟,struct hibernate spring 这三层你们都用上了?
只用 spring

http://www.bsdlover.cn/html/79/n-3779.html

点击在新窗口中浏览此图片
每次都要去chmod -R * ;chown -R nobody.nogroup * 很是麻烦,写一脚本解决,到时候直接调用一下secureCRT的脚本--》运行--》选择脚本即可!
代码如下:

Sub Main
  crt.Screen.Synchronous = True
  crt.Screen.Send "chmod -R 755 *" & vbcr
  crt.Screen.Send "chown -R nobody.nogroup *" & vbcr
  crt.Screen.Send " "
  crt.Screen.Synchronous = False
End Sub


【前言】
SecureCRT是一款非常流行和受欢迎的远程登录和终端仿真软件,支持Telnet,SSH等。
它还可以支持VBScript和JScript,通过Script的支持,SecureCRT能够自动完成我们设定
好的各种任务。阅读全文
在路上:
马化腾说。吃着碗里的,看着锅里的,再想着田里的,这个业务做起来,需要其他业务养,它成熟后再养别的业务。他还说好的人才总是缺,以战养战,且对长线业务充满耐心!
尽管时间隔了多年,但是他的一些思考任然很犀利,文章开始:

正如近两年明显表现出来的, QQ 的用户群,其实正态分布在一个区间内:他们通常年纪不大,以娱乐为使用 QQ 的首要目的。这些用户,也许随着年龄和身边人群的变化,会转移到其他即时通讯软件上,比如 MSNmessenger 和 GoogleTalk 。这个意义上,腾讯的问题类似于一家儿童用品公司:小孩子总要长大,重要的是新生代是否依然选择你?阅读全文
互联网公司特写

  下个十年阅读全文
dio_open()和dio_stat()函数都不能使用,
提示Fatal error: Call to undefined function dio_stat()这个错误!!!
请各位大侠指教。。。。

注: 本扩展已被移动到 PECL 库中且自以下版本起不再被绑定到 PHP 中:5.1.0.

This extension is only available on Windows Platforms as of PHP 5.0.0
本扩展仅在Windows平台PHP5.0.0时有效

需求
要编译本扩展模块无需外部库文件。

注意一下你的版本!

Note that many DLL files are located in the extensions/ (PHP 4) ext/ (PHP 5) extension folders as well as the separate PECL DLL download (PHP 5). Be sure to appropriately set the extension_dir directive.
http://pecl.php.net/
http://php.morva.net/manual/zh/install.pecl.windows.php
先去下載再安裝

php.ini中做了如此配置extension=php_dio.dll
并且php_dio.dll这个库文件也在ext目录下,为什么还是不能使用那些函数?????
问题已经解决,需要php和pecl的版本一致。。。



文章来源:http://tw2.php.net/manual/en/ref.dio.php

Direct IO Functions
Table of Contents

    * dio_close — Closes the file descriptor given by fd
    * dio_fcntl — Performs a c library fcntl on fd
    * dio_open — Opens a file (creating it if necessary) at a lower level than the C library input/ouput stream functions allow.
    * dio_read — Reads bytes from a file descriptor
    * dio_seek — Seeks to pos on fd from whence
    * dio_stat — Gets stat information about the file descriptor fd
    * dio_tcsetattr — Sets terminal attributes and baud rate for a serial port
    * dio_truncate — Truncates file descriptor fd to offset bytes
    * dio_write — Writes data to fd with optional truncation at length


(sorry for my English)
http://pecl.php.net/get/dio seems broken at the moment
to get dio extension follow these steps (steps 1.a and 1.b are equivalent):

1.a  get source files using cvs (you may need cvsnt or similar):

     (in shell run)
     cvs -d :pserver:cvsread@cvs.php.net:/repository login
     Password: phpfi
     cvs -d :pserver:cvsread@cvs.php.net:/repository co pecl/dio
     cd pecl/dio/

-- or --

1.b  manually download all files at http://cvs.php.net/cvs.php/pecl/dio clicking on the revision number link
     move to the destination directory

2.   (in shell run)
     phpize (if the system is missing the 'phpize' command see http://php.mirrors.ilisys.com.au/manual/en/install.pecl.phpize.php)
     ./configure --enable-dio --with-php-config=/path/to/php-config (usually /usr/local/php/bin/php-config or /usr/bin/php-config)

     make
     make install (you need root/admin privilegies)
php dot 5 dot gavinostlund at spamgourmet dot com
08-Dec-2007 12:36
You can manually build the dio extension for your version of PHP, or install an older version of PHP that still bundled dio.  It's not that hard to build it yourself, just a bit of a process, and it helps if you're on linux, and have a build environment... which I would assume you have if you are doing some kind of development that requires direct device I/O...  Just get the dio source from the cvs repo, compile it, and then add the extension to your php configuration...
tom at bitworks dot de
03-Nov-2007 01:41
to use mandatory locking on a linux system, the filesystem has to be well prepared.

# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>               <dump>  <pass>
/dev/hda1       /               ext3    errors=remount-ro,mand  0       1
/dev/hda2       none            swap    sw                      0       0
proc            /proc           proc    defaults                0       0
/dev/fd0        /floppy         auto    user,noauto             0       0
/dev/cdrom      /cdrom          iso9660 ro,user,noauto          0       0

For example here the ext3 partition has been prepared for mandatory locking. Otherwise no dio_function will work on the system.
richard d_0t cubek a_t example D0_t com
25-Sep-2007 08:13
IMPORTANT:

--enable-dio is NOT recognized as an option. After reporting a bug, i got following answer:

It is not bundled anymore. See http://pecl.php.net/dio to fetch the CVS version (being unmaintained, there is no release in pecl). Not a bug > bogus.

[b]如何编译dio_open 的so文件:[/b]
http://php.mirrors.ilisys.com.au/manual/en/install.pecl.phpize.php
摘录部分:
Compiling shared PECL extensions with phpize

Sometimes, using the pecl installer is not an option. This could be because you're behind a firewall, or it could be because the extension you want to install is not available as a PECL compatible package, such as unreleased extensions from SVN. If you need to build such an extension, you can use the lower-level build tools to perform the build manually.

The phpize command is used to prepare the build environment for a PHP extension. In the following sample, the sources for an extension are in a directory named extname:

$ cd extname
$ phpize
$ ./configure
$ make
# make install

A successful install will have created extname.so and put it into the PHP extensions directory. You'll need to and adjust php.ini and add an extension=extname.so line before you can use the extension.

If the system is missing the phpize command, and precompiled packages (like RPM's) are used, be sure to also install the appropriate devel version of the PHP package as they often include the phpize command along with the appropriate header files to build PHP and its extensions.

Execute phpize --helpto display additional usage information.


http://cvs.php.net/viewvc.cgi/pecl/dio/
SQL Injection with MySQL,安全天使的一篇文章,写得很有深度,值得阅读和借鉴:
http://www.4ngel.net/article/36.htm


①SELECT * FROM article WHERE articleid='$id'
②SELECT * FROM article WHERE articleid=$id

  两种写法在各种程序中都很普遍,但安全性是不同的,第一句由于把变量$id放在一对单引号中,这样使得我们所提交的变量都变成了字符串,即使包含了正确的SQL语句,也不会正常执行,而第二句不同,由于没有把变量放进单引号中,那我们所提交的一切,只要包含空格,那空格后的变量都会作为SQL语句执行,我们针对两个句子分别提交两个成功注入的畸形语句,来看看不同之处。

① 指定变量$id为:
1' and 1=2 union select * from user where userid=1/*
此时整个SQL语句变为:
SELECT * FROM article WHERE articleid='1' and 1=2 union select * from user where userid=1/*'

②指定变量$id为:
1 and 1=2 union select * from user where userid=1
此时整个SQL语句变为:
SELECT * FROM article WHERE articleid=1 and 1=2 union select * from user where userid=1


  看出来了吗?由于第一句有单引号,我们必须先闭合前面的单引号,这样才能使后面的语句作为SQL执行,并要注释掉后面原SQL语句中的后面的单引号,这样才可以成功注入,如果php.ini中magic_quotes_gpc设置为on或者变量前使用了addslashes()函数,我们的攻击就会化为乌有,但第二句没有用引号包含变量,那我们也不用考虑去闭合、注释,直接提交就OK了。
  大家看到一些文章给出的语句中没有包含单引号例如pinkeyes的《php注入实例》中给出的那句SQL语句,是没有包含引号的,大家不要认为真的可以不用引号注入,仔细看看PHPBB的代码,就可以发现,那个$forum_id所在的SQL语句是这样写的:

$sql = "SELECT *
FROM " . FORUMS_TABLE . "
WHERE forum_id = $forum_id";


  由于没有用单引号包含变量,才给pinkeyes这个家伙有机可乘,所以大家在写PHP程序的时候,记得用单引号把变量包含起来。当然,必要的安全措施是必不可少的。
分页: 221/338 第一页 上页 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 下页 最后页 [ 显示模式: 摘要 | 列表 ]