Mar 22, 2010
/***********************************************************
* hoagie_udp_sendmsg.c
* LOCAL LINUX KERNEL ROOT EXPLOIT (< 2.6.19) - CVE-2009-2698
*
* udp_sendmsg bug exploit via (*output) callback function
* used in dst_entry / rtable
*
* Bug reported by Tavis Ormandy and Julien Tinnes
* of the Google Security Team
*
* Tested with Debian Etch (r0)
*
* $ cat [...]
Mar 22, 2010
账号管理:
管理员的工作中,相当重要的一环就是『管理账号』啦!因为整个系统都是你在管理的,并且所有的一般用户的申请,都必须要透过你的协助才行!所以你就必须要了解一下如何管理好一个网站的账号管理啦!在管理 Linux 主机的账号时,我们必须先来了解一下 Linux 到底是如何辨别每一个使用者的!
使用者的 ID 与群组的 ID :
其实 Linux 并不会直接认识你的『账号名称』,他认识的其实是你的『账号 ID 』才是!如果你曾经以 tarball 安装过软件的话,那么应该不难发现,在解压缩之后的档案,嘿?档案拥有者竟然是『不明的数字』?奇怪吧?这没什么好奇怪的,因为 Linux 说实在话,他真的只认识代表你身份的号码而已!而对应的号码与账号,则是记录在 /etc/passwd 当中!
怎样登入 Linux 主机呀?
好了,那么我们再来谈一谈,到底我们是怎样登入 Linux 主机的呢?其实也不难啦!当我们在主机前面或者是以 telnet 或者 ssh 登入主机时,系统会出现一个 login 的画面让你输入账号,这个时候当你输入账号与密码之后, Linux 会:
先找寻 /etc/passwd 里面是否有这个账号?如果没有则跳出,如果有的话则将该账号对应的 UID ( User ID )与 GID ( Group ID )读出来,另外,该账号的家目录与 shell 设定也一并读出;
再来则是核对密码表啦!这时 Linux 会进入 /etc/shadow 里面找出对应的账号与 UID,然后核对一下你刚刚输入的密码与里头的密码是否相符?
如果一切都 OK 的话,就进入 Shell 控管的阶段啰!
大致上的情况就像这样,所以呢,当你要登入你的 Linux [...]
Mar 11, 2010
在面试过程中,我时常会问一道简单的题目:
请找出如下程序不妥之处:
void s_c(const char *s, const char *p)
{
while (*s) {
*p = *s;
}
}
首先,这道简单的题目考察的是找错能力,比如结束符和const的应用。
其次,考察的是接口设计能力,这也是重点。
没有返回值,因此对于一些异常现象不好对外表现,const是否应用正确,
函数名使用是否见其名知其意,函数参数是否见其名知其意,有没有对接
口的简述,指针,引用,就量传递使用是否正确等等。
比如改成如下:
/**
* brief: 拷贝字符串,从源串到目的串
* param[in]: src 源串地址
* param[out]: dest 目的串地址
* return: 成功 0
* 失败 错误码
[...]
Mar 11, 2010
一次偶然的机会,发现发一段程序感觉诡异,于是详细查了一把文档。
原程序如下:
class os_cart {
public function pay() {
//do something
}
….
}
os_cart::pay();
即然成员函数声明的不是static的,为什么可以使用静态模式来调用呢?这样
为什么不会报错呢?查了一下文档,原来和error_reporting函数相关。如果
error_reporting的设置包含了E_STRICT的话,那么程序会进行严格的检查,
对于非静态函数进行静态方式调用,就会报错。如果将E_STRICT错误过滤掉
的话,就不会报错了。
error_reporting的设置方式:
1 在php.ini配置文件中进行配置,相关值如下列表:
value
constant
1
E_ERROR
2
E_WARNING
4
E_PARSE
8
E_NOTICE
16
E_CORE_ERROR
32
E_CORE_WARNING
64
E_COMPILE_ERROR
128
E_COMPILE_WARNING
256
E_USER_ERROR
512
E_USER_WARNING
1024
E_USER_NOTICE
2047
E_ALL
2048
E_STRICT
2 在程序中进行设置,在程序入口处使用error_reporting函数进行设置
如 error_reporting(E_ALL | E_STRICT);这里需要说明的是,E_ALL并
不包含E_STRICT。
多谢
张久安
If you enjoyed this post, make sure you subscribe to my RSS feed!
Feb 24, 2010
我们今天要向大家介绍的是PHP magic_quotes_gpc的具体使用方法。大家都知道在PHP中一个特殊的函数魔术函数,它在引用的过程中只有在传递$_GET,$_POST,$_COOKIE时才会发生作用。
1.
条件: PHP magic_quotes_gpc=off
写入数据库的字符串未经过任何过滤处理。从数据库读出的字符串也未作任何处理。
数据: $data=”snow”’’sun” ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:”snow”’’sun” 写入数据库,
结果: 出现sql语句错误,mysql不能顺利完成sql语句,写入数据库失败。
数据库保存格式:无数据。
输出数据格式:无数据。
说明: 对于未经处理的单引号在写入数据库时会使sql语句发生错误。
2.
条件: PHP magic_quotes_gpc=off
写入数据库的字符串经过函数addlashes()处理。从数据库读出的字符串未作任何处理。
数据: $data=”snow”’’sun” ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:”snow”’’sun” 写入数据库,
结果: sql语句顺利执行,数据成功写入数据库
数据库保存格式:snow”’’sun (和输入一样)
输出数据格式:snow”’’sun (和输入一样)
说明: addslashes()函数将单引号转换为\’的转义字符使sql语句成功执行,
但\’并未作为数据存入数据库,数据库保存的是snow”’’sun 而并不是我们想象的snow\’\’\’\’sun
3.
条件: PHP magic_quotes_gpc=on
写入数据库的字符串未经过任何处理。从数据库读出的字符串未作任何处理。
数据: $data=”snow”’’sun” ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:”snow”’’sun” 写入数据库,
结果: sql语句顺利执行,数据成功写入数据库
数据库保存格式:snow”’’sun (和输入一样)
输出数据格式:snow”’’sun (和输入一样)
说明: PHP magic_quotes_gpc=on 将单引号转换为\’的转义字符使sql语句成功执行,
但\’并未作为数据入数据库,数据库保存的是snow”’’sun而并不是我们想象的snow\’\’\’\’sun。
4.
条件: PHP magic_quotes_gpc=on
写入数据库的字符串经过函数addlashes()处理。从数据库读出的字符串未作任何处理。
数据: $data=”snow”’’sun” ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:”snow”’’sun” 写入数据库,
结果: sql语句顺利执行,数据成功写入数据库
数据库保存格式:snow\’\’\’\’sun (添加了转义字符)
输出数据格式:snow\’\’\’\’sun (添加了转义字符)
说明: PHP magic_quotes_gpc=on 将单引号转换为\’的转义字符使sql语句成功执行,
addslashes又将即将写入数据库的单引号转换为\’,后者的转换被作为数据写入
数据库,数据库保存的是snow\’\’\’\’sun
总结如下:
1. 对于PHP magic_quotes_gpc=on的情况,
我们可以不对输入和输出数据库的字符串数据作
addslashes()和stripslashes()的操作,数据也会正常显示。
如果此时你对输入的数据作了addslashes()处理,
那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。
2. 对于PHP magic_quotes_gpc=off 的情况
必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出
因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。
补充:
PHP magic_quotes_gpc作用范围是:WEB客户服务端;作用时间:请求开始时,例如当脚本运行时.
magic_quotes_runtime [...]
Jan 29, 2010
实这时最好用日志轮询,之前这个WEB服务器没有做这个配置,本应该配置WEB服务器时就应该做的。现在配置下也不晚。
1.首先得要软件http://cronolog.org/download/index.html
Version 1.6.2 released 2002-01-24 (gzip’ed tar file)
Version 1.6.1 released 1999-12-20 (gzip’ed tar file)
Win 32 version (ZIP file)
Version 1.6 released 1999-12-16 (gzip’ed tar file)
Version 1.5b9 released on 4 June 1998 (gzip’ed tar file)
Version 1.4 released 20 December 1996 (gzip’ed tar file)
如果有Windows的要下Win_32_version(ZIP file) Linux习惯用哪种包就用哪种.
2. 在Linux 下安装cronolog
tar zxvf cronolog-1.6.2.tar.gz
cd cronolog-1.6.2
./configure (注意:默认是安装在/usr/local下 cronolog的命令在/usr/local/sbin下,这个要清楚)
make ; make install
3.在Windows下安装cronolog
在Windows下很简单,直接把cronolog.exe解压Copy到apache目录下的bin目录中.
4.配置都是一样的格式,不过要注意Linux和Windows下斜杠的方向.
Linux下
例:cronolog命令在/usr/local/sbin 下 日志文件在 /usr/local/apache2/logs/下
在FormatLog附近加入两句:
CustomLog [...]
Jan 26, 2010
有时候经常使用sort来排序,需要预处理把需要排序的field语言在最前面。实际上这是
完全没有必要的,利用-k参数就足够了。
比如sort all
1 4
2 3
3 2
4 1
5 0
如果sort -k 2的话,那么执行结果就是
5 0
4 1
3 2
2 3
1 4
它按照第二个域进行排序。
如下为man sort:
Usage: sort [OPTION]… [FILE]…
Write sorted concatenation of all FILE(s) to standard output.
Ordering options:
Mandatory arguments to long options are mandatory for short options too.
-b, –ignore-leading-blanks ignore leading blanks
-d, –dictionary-order consider only blanks and alphanumeric characters
-f, –ignore-case fold lower case [...]
Jan 26, 2010
不知觉间,php使了两年多了,中间踩过不知多少坑,当然,也从中体悟到
很多东西,也做了不少东西,多多少少有些感想,慢慢总结下来吧。
1 php语方层面很随意:
这也主要是由它的功能及所属的层面决定的吧。php弱类型,在变量比较的
时候可以选择使用==或===,前者表示变量转换成同类型后的值是不是相等,
而后者则是要求首先是类型相同,然后值也相同。
php变量可以动态定议,它不需要提前定意一个变量,也不必要定义的时候
指定该变量的类型。比如var $variable;则一个$variable变量便产生了,
它的类型实际是由赋于它的值决定的。因此这一方面,使用都可以少了许多
束缚。
2 php有很好的正则支持:
php提供了较为丰富的正则支持,如preg_match, preg_match_all等。
如果想从一个字符串或文件中提取出来一些片段,那是十分方便的。比如
有如下文本:
192.168.1.1 xxx user:zja601 url:http://blog.niukey.com
如果我们想提取出user和url的话,如简单语句就可搞定:
if (preg_math(’/^.*user:([^\s]*)\surl:(.*)$/’, $string, $arr_result)) {
printf(”user is:%s url is:%s”, $arr_result[1], $arr_result[2]);
}
简单吧,当然,shell脚本可能会有更简单的办法,比如:sed -n ’s/^.*user:\([\s]*\)\burl:\(.*\)$/\1 \2/p’
但php可以结合其它的一些场合,而不像shell那么孤立的功能,使得整体功能更加
灵活。
3 php有强大的函数库:
比如数组$_GET参数到字符串形式的来回转换,有explode和build_string_query就很轻
松的搞定了。比如数组的array_merge,push, pop等等,可能帮助你事半功位。比如php数
组的强大功能,给你在c/c++花很大力气才能达到的效果。比如操作pdf,文件等函数,在
需要的时候文档一下即可搞定。
4 php对面向对象的思想支持的也相对不错:
从php4之后,php对面象对象支持的越来越好。特别是interface的抽象,可能使设计的
时候更加关注接口间的合理性考量。php的继承关系也达到了一个很好的复用效果,如果你
是一位C++爱好者,那么也试一下php的C++版本吧,一定会有不错的效果。php的对象的
执行也是动态的,就是在c++或java里讲的后期绑定吧。
5 php语言的动态性:
php语言具有动态性,它在动态执行的时候,解析代码。源代码写好即可执行,不必要
经历一个繁琐的编译过程。动态性也表现为程序运行时解析,因此它只解析运行到的代码
而不去解析未执行的代码。(尽管有人说这一点并不太好)动态性的另外一个层面就是上
面讲的对象的动态性了。
其实php也有其内在的陷阱
比如函数参数的引用传递,比如函数返回值的引用返
回,这些都有可能造成php的fatal的出现。另外,正是由于php的弱类型,往往有
时候,我们不能很精确的把握程序进行时的值或状态。如果真的想得到当时的值或
状态,可能花费的力气并不值得(并不是做不到)。php的@符号用来抑制一些错误
的报出,有时候不做一些额外的判断,就有可能有意想不到的问题产生。php函数名
的长度会影响其执行的效率,这可能许多程序员不会注意到(当然很多场合不必要去
注意这些事),尽管我们选择php语言,不是选择它的效率。php动态执行,因此一
些有基本语法错误的地方,如果程序运行时走不到,那么有可能就不会被发现。诸如
此类的还有很多。。。
多谢
张久安
If you enjoyed this post, make sure you subscribe to my RSS feed!