php基础语法入门教程

Ihipop 学校的 Discuz X1.5 论坛被黑,在那里吵了一个下午。Google
一下“Discuz! X1-1.5 notify_credit.php Blind SQL injection
exploit”,你就知道。

php教程基础语法入门教程

Discuz
是国内很流行的论坛系统,被黑的网站应该会很多吧。不过我对入侵别人的网站不感兴趣,同时也鄙视那些代码都不会写只会使用别人放出的工具攻击的所谓的“黑客”。

输出语句:

粗略看了一下代码,这个 SQL 注入漏洞是 urldecode 函数造成的。在 PHP
手册中,urldecode 函数下面有一个警告:

      echo()、print().

The superglobals $_GET and $_REQUEST are already decoded. Using
urldecode() on an element in $_GET or $_REQUEST could have unexpected
and dangerous results.

     eg:

而 Discuz 的开发人员(估计是新手)画蛇添足,多加了一个 urldecode:
复制代码 代码如下:
foreach($_POST as $k => $v) {
$value = urldecode($v);
$this->setParameter($k, $value);
}

          echo ‘hello’,’world’;

单引号被 urlencode 两次以后是 %2527,然后 POST,PHP 内部在生成全局变量
$_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes
的设置,但是无论是否开启 Magic Quotes,%27 都不会被
addslashes,因为这时根本没有单引号。但是这时如果你在 PHP
代码中画蛇添足的加上 urldecode,%27就变成单引号了,然后……你懂的。

注释:

在我初学 PHP 的时候,看的是学校图书馆的一本烂书,里面根本就没写 PHP
在处理表单的时候会自动 urldecode,所以自己用 urldecode
函数来解码(依稀记得书上好像也是这么写的,真是误人子弟啊)。

     #、//、/* */

总结一下,就是:1、选择一本好书非常重要;2、慎用 urldecode 函数。3、注意
PHP 手册中的警告。
原文来自

变量:

    必须以$开头,区分大小写,第一个字符必须是字母或下划线。

 

链接字符串:

     两个字符串之间用点(.)连接

常量:

     全部使用大写字母来命名常量,常量不会像变量那样使用美元符号。

     define(‘name’,’value’);

 

PHP运行时利用了几个预定义的常量,包括PHP_VERSION和PHP_OS(服务器的操作系统)

   创建一个新的日期常量:

           define(‘TODAY’,’February 3,2005′);

           echo ‘Today is’.TODAY;

 

单引号和双引号的区别:

        
在单引号的字符按照字面意义进行处理,而在双引号中的值则将被解释。

处理HTML表单

<form action=”” method=””>

        action后指示将其页面提交到指定的页面。

       
接受表单数据的PHP页面将把用户输入到这个表单的中的内容赋予一个称谓&_REQUEST[‘name’]的特殊变量。其中要使用全拼大写,因为PHP对变量名区分大小写。name用于表示要提交的表单中指定的变量名。

 

   1.php

<body>

  <form action=”2.php” method=”get”>

    <fieldset><legend>Enter your information in the form
below:</legend>

<p><b>name:</b><input type=”text” name=”name”
size=”20″ maxlength=”40″/></p>

<p><b>E-mail:</b><input type=”text” name=”email”
size=”40″ maxlength=”60″/></p>

<p><b>Gender:</b><input type=”radio” name=”gender”
value=”M”/>Male<input type=”radio” name=”gender”
value=”F”/>Female</p>

<p><b>Age:</b>

<select name=”age”>

  <option value=”0-29″>Under 30</option>

  <option value=”30-60″>Between 30 and 60</option>

  <option value=”60+”Over 60></option>

</select></p>

 

<p><b>Comments:</b><textarea
name=”comments” rows=”3″ cols=”40″></textarea></p>

    </fieldset>

 

<div align=”center”><input type=”submit” name=”submit”
value=”Submit My Information”/></div>

  </form>

</body>

运行如下:

 

  2.php

                当输入一些数据点submit时,会调用2.php:

<body>

  <?php

    $name=$_REQUEST[‘name’];

$email=$_REQUEST[’email’];

$comments=$_REQUEST[‘comments’];

 

echo “<p>Thank you.<b>$name</b>.for the following
comments:<br/><tt>$comments</tt></p>n”;

  ?>

</body>

    运行如下:

 

管理Magic Quotes(魔术引用):

         对变量的值中的单引号和双引号进行转义。

       

         如在上例中的comments中输入‘,则会显示’。     

 

        PHP中,有两类主要的Magic
Quotes:magic_quotes_gpc,它适用于表单、URL和cookie数据(gpc代表get、post、cookie);magic_quotes_rentime,它适用于外部文件和数据库教程检索的数据。

       如果在服务器上启用了Magic
Quotes,则可以使用strips教程lashes()函数撤销它的作用。

      $var=stripslashes($var);

     
这个函数将删除在$var中发现的任何反斜杠。在表单示例中,这具有把转义的提交字符串转变回其原来的未转义值的作用。

条件语句

 

If(isset($_REQUEST[‘gender’]))

{

    $gender=$_REQUEST[‘gender’]

}

Else

{

  $gender=NULL;

}

If($gender==’M’)

{

  …

}

 

 

验证表单数据

 

Isset()用于测试一个变量是否具有值(包括0、FALSE,或则一个空字符串,但不能是NULL)

         
但是使用此方法,若空字符串测试为TRUE,所以他不是验证HTML表单的文本输  

          入和文本框的有效方式。

empty()方法:

           检查一个变量是否具有空值(empty):空字符串、0、NULL或FALSE。

          eg:

                if(!Empty(&_REQUEST[‘name’]))

    {

                   $name=stripslashes($_REQUEST[‘NAME’])

    }

           if($name)

          {

  …

}

 

 

要检测提交的值是否是数字,可使用is_numeric()函数。

可以使用strlen()函数来查看是否输入了0个以上的字符:

    if(strlen($var)>0)

    …

数组

      
数组可以构成一系列键-值对(key-value),其中每一对都是那个数组的一个项目或元素(element)。

       PHP支持两种数组:索引数组(indexed array) 和联合数组(associative
array),前者使用数字作为键,后者使用字符串作为键。索引数组的第一个索引开始于0,除非显示指定键。

       数组遵守与任何其他变量相同的命名规则。

       echo  $ar[2];

       echo  $ar[‘MD’];      –联合索引的键必须用单引号。

     当数组使用字符串作为它的键时,输出格式为:

         echo “{$array[‘IL’]}”;

     当使用数字作为它的键时,输出格式为:

        echo “$array[4]”;

 

超全局数组:

     $_GET、$_POST、$_SESSION、$_REQUEST、$_COOKIE等:

      php使用$_GET来存储通过get方法发送到php脚本的所有变量和值。

                     
$_POST存储使用post方法从HTML表单发送到php脚本的所有数据。

                      以及$_COOKIE,他们都是$_REQUEST的子集。

      eg:

          
在前面的例子中,我们使用post获取所有元素,则可以直接用$_POST[‘name’],如:

           $name=$_POST[‘name’];

 

创建数组:

         1.一次向数组中添加一个元素:

              $array[]=”d”;

              $array[‘son’]=”BUJ”;

        2.  使用array()函数:

              $arr=array(‘IA’ => ‘LH’,’MD’ => ‘MH’);

              不论是否显示地设置了键,都可以使用这个函数:

              $arr=array(‘dd’,’asd’);

         如果设置了第一个具有数字键的值,则此后添加的值将具有递增的键:

              $day=array(1=>’S’,’dd’,’ss’)     
//$day[2]=dd,$day[3]=ss;

         创建连续数字的数组,可以使用range()函数:

              $ten=range(1,10);

 

访问数组:

        foreach($array as $value)

        {…}

   
foreach()循环将会迭代$array中的每个元素,并把每个元素的值赋予给$value变量。要访问键和值,可以使用:

       foreach($array as $key=>value)

       {

           echo “The array value at $key is $value”;

       }

        

   eg:

       

<form action=”2.php” method=”post”>

<?php

  $months=array(1=>’January’,’February’,’March’);

  $days=range(1,12);

  $years=range(2000,2011);

  echo ‘<select name=”month”>’;

  foreach($months as $key=>$value)

  {

  echo “<option value=”$value”>$value</option>n”;

  }

  echo “</select>”;

  echo ‘<select name=”days”>’;

  foreach($days as $key=>$value)

  {

  echo “<option value=”$value”>$value</option>n”;

  }

  echo “</select>”;

  echo ‘<select name=”years”>’;

  foreach($years as $key=>$value)

  {

  echo “<option value=”$value”>$value</option>n”;

  }

  echo ‘</select>’;

?>

 

 

要确定数组中的元素个数,可以使用count()或sizeof()函数:

          $var =count($array);

从PHP4.1起,range()函数也可以创建连续字符的数组:

           $var=range(‘a’,’z’);

在foreach循环中不必使用名称$key和$value,但是,有些简写为$k和$v.

 

如果看到Invalid  argument  supplied for
foreach()(为foreach()提供了无效的参数)出错消息,这意味

           着你正尝试在不是数组的变量上使用foreach循环。

发表评论

电子邮件地址不会被公开。 必填项已用*标注