PHP 中由于数组和字符串这两种变量类型是如此常用,以至于 PHP 具有两个函数,可以在字符串和数组之间互相进行转换。
  $array=explode(separator,$string);
  $string=implode(glue,$array);
  使用和理解这两个函数的关键之处是分隔符(separator)和胶合符(glue)关系。当把一个数组转换成一个字符串时,将会设置胶合符——将被插入到生成字符串中的数组值之间的字符或代码。相反,当把字符串转换成数组时,要指定分隔符,它用于标记什么应该变成独立数组元素。例如,以字符串开始:
  $s1=’Mon-Tue-Wed-Thu-Fri’;
  $days_array=explode(’-',$s1);
  $days_array 变量现在是一个有5个元素的数组,其元素 Mon 的索引为0,Tue 的索引为1,等等。
  $s2=implode(’,',$days_array);
  $s2 变量现在是一个用逗号分隔的一个星期中各天的列表:Mon,Tue,Wed,Thu,Fri

PHP编程的一种失误

嘎嘎,在群里看到xi4oyu发的一个后台的登陆验证部分,当登陆不成功是通过javascript来转向的,但他没有控制后面的输出是否停止,这就引起,当用户浏览器禁用JAVASCRIPT的时候,登陆验证失效,可以直接登陆。

1
2
3
4
5
6
7
8
9
10
11
12
<?php
include("functions.inc.php");
 
if(!logged_in()) {
	echo<<<EOD
	<script language="JavaScript">
	alert("登陆失败!");
	location.href="index.php";
	</script>
EOD;
}
?>

其中logged_in()应该是检测是否登陆的函数,不管结果是正确的还是错误的,只要调过去后面的JAVASCRIPT转向,这个都等于虚设。
在ASP中,我们碰到上面的问题,其实只需要在输出错误信息后,直接一个Response.End就搞定了。但PHP中没有,我们就可以在上面加一个Exit;即可

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
include("functions.inc.php");
 
if(!logged_in()) {
	echo<<<EOD
	<script language="JavaScript">
	alert("登陆失败!");
	location.href="index.php";
	</script>
EOD;
Exit;
}
?>

  TinyURL是一个缩短网址的Web服务,可以把很长的网址变成简单的地址,通常创建TinyURL的方法是去其主页创建,有时候会有用户在客户端自动生成TinyURL的情况,这里介绍一个通过PHP调用TinyURL生成缩短地址的方法。

  TinyURL API的PHP函数如下

<?php
function TinyURL($u){
return file_get_contents('http://tinyurl.com/api-create.php?url='.$u);
}
?>

  调用的例子是

<?php
$url = 'http://www.williamlong.info/';
$tiny = TinyURL($url);
echo('The TinyURL of "'.$url.'" is "'.$tiny.'"');
die();
?>
转自:http://www.williamlong.info/archives/1797.html

-[ 作者信息 ]-----------------------------------------------------------------------

标题: "PHP Undergroud Security"
作者: Omnipresent
邮箱: omnipresent@email.it - omni@playhack.net
主页: http://omni.playhack.net - http://www.playhack.net
日期: 2007-04-12

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

-[ 译者信息 ]-----------------------------------------------------------------------

译者:riusksk(泉哥)

邮箱:riusksk@qq.com

主页: http://riusksk.blogbus.com

日期:2008-11-15

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

-[ 摘要 ]---------------------------------------------------------------------

0x00: 前言

0x01: 关注全局变量
# 修补

0x02: 文件包含

# 修补

0x03: 跨站脚本
0x04: SQL注入

_ 0x04a: 绕过登陆验证
_ 0x04b: 1 Query? No.. 2 one!(译注:不好翻译,还是保留原文吧!)

# 修补

0x05: 文件遍历

# 修补
0x05: 结论

---[ 0x00: 前言]

大家好!首先对我糟糕的英语表示抱歉,因为它不是我的母语.

在本教程中,我将会向大家介绍一些主要的php漏洞,以及如何发现、利用并修补它!

-----------------------------------------------------------------------------[/]

---[ 0x01: 关注全局变量]

在php中,你并不一定需要声明变量(这对程序员来说确实是件好事),当你必须使用它时它会“自动”创建的。你可能认为这是件不错的事,确实如此,但这只是偶而发生的事情。

众所周之,PHP经常要获取用户的输入值,并对其进行处理。假如我们在使用一个未声明过的变量时,就可能会引发web程序的安全问题。例如下面一段代码:

[...]
 
     if ($is_admin == 1) {
          //Yes, I'm the admin so call the Administration Pannel
          [...]
     } else {
          //No, I'm not the admin
          [...]
     }

上面的变量$is_admin ,我们在使用前并未声明过,那么我们是否可以绕过该变量(在bugged.php文件中)而访问未经授权的管理面板呢?答案是肯定,但我们该如何添加管理认证权限呢?其实很简单,比如:

http://remote_host/bugged.php?is_admin=1

---[ 修补 ]---
如何修补该漏洞呢?这很容易:在if语句前声明变量$is_admin 即可,代码如下:

$is_admin = 0;
 
[...]
 
     if ($is_admin == 1) {
          //Yes, I'm the admin so call the Administration Pannel(为真,则说明是管理员,因此被重定向管理界面)
          [...]
     } else {
          //No, I'm not the admin(为假,则不是管理员)
          [...]
     }

-----------------------------------------------------------------------------[/]

---[ 0x02: 文件包含]

-----[本地文件包含]

PHP是种杰出的语言,强大而简单;但是如果你不想在你的代码中出现安全问题,那么你就必须注意一下你的代码了。

在一些情况下,使用动态包含文件(部分路径名存在某个变量中)确实是件好事。让我们看一下下面的代码:

<!--p
 
     include "/users/".$include_path.".php";
     [...]
-->

变量$include_path 在使用前并未进行任何声明,因此攻击者可以在该变量中输入恶意数据,使其包含其它文件(比如/etc/passwd..)。

用户通过修改URL中的$include_path 变量值可以很容易浏览其它文件。例如:

http://remote_host/bugged.php?include_path=../../../../etc/passwd%00

包含后的结果如下:

<!--p
 
     include "/users/../../../../etc/passwd%00.php"
     [...]
-->

因此攻击者可以窃取到存在服务器上的所有密码。

- [ 注意 ] -

%00是一个NULL字符,用于“删除”PHP文件扩展名。如果省略掉NULL,将只会显示PHP文件的内容,因为包含文件的扩展名是PHP(include "/users/".$include_path.".PHP")

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

-----[ 远程文件包含] Read the rest of this entry

第一个目的是谈论得最多的目的,它设想的情形是:一组程序员编写用于生成页面内容的PHP脚本,同时另一组设计人员设计HTML和图形以控制页面的最终外观。分离功能和布局的基本思想就是使得这两组人能够各自编写和使用独立的一组文件:程序员只需关心那些只包含PHP代码的文件,无需关心页面的外观;而页面设计人员可以用自己最熟悉的可视化编辑器设计页面布局,无需担心破坏任何嵌入到页面的PHP代码。

如果你曾经看过几个关于PHP模板的教程,那么你应该已经明白模板的工作机制。考虑一个简单的页面局部:页面的上方是页头,左边是导航条,其余部分是内容区域。

可以看出页面如何由这些模板构造而成:main模板控制着整个页面的布局;header模板和leftnav模板控制着页面的公共元素。花括号"{}"里面的标识符是内容占位符。使用模板最主要的好处在于界面设计者能够按照自己的意愿编辑这些文件,比如设置字体、修改颜色和图形,或者完全地改变页面的布局。界面设计者可以用任何普通HTML编辑器或者可视化工具编辑这些页面,因为这些文件都只包含HTML代码,没有任何PHP代码。

PHP代码全部保存到单独的文件中,这个文件也就是由页面URL实际调用的文件。Web服务器通过PHP引擎解析该文件,然后把结果返回给浏览器。一般地,PHP代码总是动态地生成页面内容,比如查询数据库或者执行某种计算等。下面是一个例子:

// 此处的PHP代码设置
$content使其包含合适的页面内容
 
$tpl->assign('CONTENT', $content); 
 
$tpl->parse('HEADER', 'header'); 
 
$tpl->parse('LEFTNAV', 'leftnav'); 
 
$tpl->parse('MAIN', 'main'); 
 
$tpl->FastPrint('MAIN'); 
 
?>

这里我们使用的是流行的FastTemplate模板类,但其基本思路对于其他许多模板类来说都一样。首先你实例化一个类,告诉它到哪里去寻找模板文件以及哪一个模板文件与页面的哪部分对应;接下来是生成页面内容,把结果赋予内容的标识符;然后,依次解析各个模板文件,模板类将执行必要的替换操作;最后把解析结果输出到浏览器。 Read the rest of this entry

php.ini中文翻译

对于php.ini里的内容,很多新手很迷惑所以本人找了个中文翻译也就是中文版的

相信这样大家对于php.ini能够更加了解,也能更熟悉的知道php.ini的关键

[PHP]
; PHP还是一个不断发展的工具,其功能还在不断地删减
; 而php.ini的设置更改可以反映出相当的变化,
; 在使用新的PHP版本前,研究一下php.ini会有好处的

;;;;;;;;;;;;;;;;;;;
; 关于这个文件 ;
;;;;;;;;;;;;;;;;;;;

; 这个文件控制了PHP许多方面的观点。为了让PHP读取这个文件,它必须被命名为
; 'php.ini'。PHP 将在这些地方依次查找该文件:当前工作目录;环境变量PHPRC
; 指明的路径;编译时指定的路径。
; 在windows下,编译时的路径是Windows安装目录。
; 在命令行模式下,php.ini的查找路径可以用 -c 参数替代。

; 该文件的语法非常简单。空白字符和用分号';'开始的行被简单地忽略(就象你可能
; 猜到的一样)。 章节标题(例如 : [Foo])也被简单地忽略,即使将来它们可能
; 有某种的意义。
;
; 指示被指定使用如下语法:
; 指示标识符 = 值
; directive = value
; 指示标识符 是 *大小写敏感的* - foo=bar 不同于 FOO = bar。
;
; 值可以是一个字符串,一个数字,一个 PHP 常量 (如: E_ALL or M_PI), INI 常量中的
; 一个 (On, Off, True, False, Yes, No and None) ,或是一个表达式
; (如: E_ALL & ~E_NOTICE), 或是用引号括起来的字符串("foo").
;
; INI 文件的表达式被限制于位运算符和括号。
; | bitwise OR
; & bitwise AND
; ~ bitwise NOT
; ! boolean NOT
;
; 布尔标志可用 1, On, True or Yes 这些值置于开的状态。
; 它们可用 0, Off, False or No 这些值置于关的状态。
;
; 一个空字符串可以用在等号后不写任何东西表示,或者用 None 关键字:
;
; foo = ; 将foo置为空字符串
; foo = none ; 将foo置为空字符串
; foo = "none" ; 将foo置为字符串'none'
;
; 如果你值设置中使用常量,而这些常量属于动态调入的扩展库(不是 PHP 的扩展,就是
; Zend 的扩展),你仅可以调入这些扩展的行*之后*使用这些常量。
;
; 所有在 php.ini-dist 文件里设定的值与内建的默认值相同(这是说,如果 php.ini
; 没被使用或者你删掉了这些行,默认值与之相同)。
;;;;;;;;;;;;;;;;;;;;
; 语言选项 ;
;;;;;;;;;;;;;;;;;;;;

engine = On
; 使 PHP scripting language engine(PHP 脚本语言引擎)在 Apache下有效。
short_open_tag = On
; 允许 tags 将被识别。
asp_tags = Off
; 允许ASP-style tags
precision = 14
; 浮点类型数显示时的有效位数

y2k_compliance = Off
; 是否打开 2000年适应 (可能在非Y2K适应的浏览器中导致问题)

output_buffering = Off
; 输出缓存允许你甚至在输出正文内容之后发送 header(标头,包括cookies)行
; 其代价是输出层减慢一点点速度。你可以使用输出缓存在运行时打开输出缓存,
; 或者在这里将指示设为 On 而使得所有文件的输出缓存打开。
output_handler = ; 你可以重定向你的脚本的所有输出到一个函数,
; 那样做可能对处理或以日志记录它有用。
; 例如若你将这个output_handler 设为"ob_gzhandler",
; 则输出会被透明地为支持gzip或deflate编码的浏览器压缩。
; 设一个输出处理器自动地打开输出缓冲。

implicit_flush = Off
; 强制flush(刷新)让PHP 告诉输出层在每个输出块之后自动刷新自身数据。
; 这等效于在每个 print() 或 echo() 调用和每个 HTML 块后调用flush()函数。
; 打开这项设置会导致严重的运行时冲突,建议仅在debug过程中打开。

allow_call_time_pass_reference = On
; 是否让强迫函数调用时按引用传递参数。这一方法遭到抗议,
; 并可能在将来版本的PHP/Zend里不再支持。
; 受到鼓励的指定哪些参数按引用传递的方法是在函数声明里。
; 你被鼓励尝试关闭这一选项并确认你的脚本仍能正常工作,以保证在将来版本的语言里
; 它们仍能工作。(你将在每次使用该特点时得到一个警告,而参数将按值而不是按引用
; 传递)。 Read the rest of this entry

以下是在Linux下通过Apache+PHP对Mysql数据库的备份的文件代码:

文件一、Listtable.php (文件列出数据库中的所有表格,供选择备份)

请选择要备份的表格:

< ?
$con=mysql_connect('localhost','root','xswlily');
$lists=mysql_list_tables("embed",$con);
//数据库连接代码
$i=0;
while($i$tb_name=mysql_tablename($lists,$i);
echo "".$tb_name."
";
//列出所有的表格
$i++;}
 
?>

Read the rest of this entry

PHP程序增加系统用户

PHP程序增加系统用户
很多人在参透的时候
对于webshell的 php shell里Eval PHP Code »
很多不知道干什么用的
其实用php也可以增加一个系统用户
怎么实现php增加系统用户呢
下面是一段例程,增加一个名字为123的用户,ro
ot密码是 1234。仅供参考

$sucommand = "su --login root --command";
$useradd = "useradd ";
$rootpasswd = "1234";
$user = "123";
$user_add = sprintf("%s "%s %s"",$sucommand,$useradd,$user);
$fp = @popen($user_add,"w");
@fputs($fp,$rootpasswd);
@pclose($fp);

晓鹏提示,此法适用于有ROOT权限的LINUX用户。。
转自:http://www.54rk.cn//blogview.asp?id=315

php导出oracle库的php代码

作者:lcx
PHP代码

<?php    
$conn=OCILogon("用户名","密码","(DESCRIPTION=(ADDRESS=(PROTOCOL =TCP)(HOST=IP)(PORT = 1521))(CONNECT_DATA =(SID=lcx)))");    
 
//$sql="select * from all_tab_columns where table_name='MEMBER'";//Table Structure    
$sql="select USER_ID,PASSWORD from MEMBER where IDX < 100"; //sql语句    
 
$stmt = OCIParse($conn, $sql);    
OCIExecute($stmt);    
$rows = OCIFetchstatement($stmt,$results);    
 
$keys = array_keys($results);    
$table = "<table>\n <TR>\n";    
foreach($keys as $key)    
{    
$table .= " <TH>$key</TH>\n";    
}    
$table .= " </TR>\n";    
for($i=0;$i<$rows;$i++)    
{    
$table .= " <TR>";    
foreach($results as $spalte)    
{    
$data = $spalte[$i];    
$table .= " <TD>$data</TD>";    
}    
$table .=" </TR>";    
}    
echo $table;    
$sStr="/home/lcx.htm";    
fputs(fopen($sStr,'a+'),$table);    
?>

把PHP加入环境变量

把PHP加入环境变量
解压php,本例是解压到"D:\php"...
右击"我的电脑"->"属性"->选择"高级"标签页->点击"环境变量"->点击下面"系统变量"列表内的"Path"->点击下面的"编辑"->在"变量值"最后处加上";D:\php"(php的解压路径,不要忘记先加上";" 号)->确定->点击"编辑"按钮前面的"新建"按钮->在"变量名"后输入"PHPRC"->"变量值"输入"D:\PHP" (PHP的解压路径)->点击"确定"完成...