使用本函式处理后的字串会沿续到PHP程式而转入eval函数

  html码放在数据库里,通过php文件调用,经过一系列处理后,用eval函数

  将希望的变量带入生成所需要的动态页.这样,我就没再看vbb源码,而转入eval函数了.

  星空浪子的php中文手册是这样介绍eval函数的:

  函式:eval()

  杂项函式库

  eval

  将值代入字串之中。

  语法:void eval(string code_str);

  传回值:无

  函式种类:资料处理

  内容说明

  本函式可将字串之中的变数值代入,通常用在处理资料库的资料上。参数code_str

  为欲处理的字串。值得注意的是待处理的字串要符合PHP的字串格式,同时在结尾

  处要有分号。使用本函式处理后的字串会沿续到PHP程式结束。

  使用范例

  <?php

  $string='杯子';

  $name='咖啡';

  $str='这个$string中装有$name.<br>';

  echo$str;

  eval("\$str=\"$str\";");

  echo$str;

  ?>

  本例的传回值为

  这个$string中装有$name.

  这个杯子中装有咖啡.

  例子测试没有任何问题.可是,当我测试如下代码时,却出现了错误:

  <?

  $aa='my name is yyy!';

  $str='<input type="text"name="textfield"value="$aa">';

  eval("\$str=\"$str\";");

  echo$str;

  ?>

  百思不得其解后,在chainasp上求救,在网友提出的一系列解决方案

  中,终于以这种方式运行成功:

  <?

  $aa='my name is yyy!';

  $str='<input type="text"name="textfield"value="\'$aa\'">';

  eval("\$str=\"$str\";");

  echo$str;

  ?>

  可是,当我把$str插入如下一个表中然后又提取出时,又出错了,简直恼火

  死了.

  数据库evaltest

  #表结构'envtest'

  CREATE TABLE envtest(

  id tinyint(4)NOT NULL auto_increment,

  sour mediumtext,

  PRIMARY KEY(id),

  UNIQUE id(id),

  KEY id_2(id)

  );

  #表内容'envtest'

  INSERT INTO envtest VALUES('1','<input type=\"text\"name=\"textfield\"value=\"$aa\">');

  php文件如下:

  <?

  $aa='my name is yyy!';

  $conn=mysql_connect('localhost','root','');

  $sele='select sour from envtest where ;

  $res=mysql_db_query('evaltest',$sele);

  $arra=mysql_fetch_array($res);

  $str=$arra['sour'];

  eval("echo\"$str\";");

  ?>

  再看看星空浪子的php中文手册,发现这么一句话:"待处理的字串要符合PHP的字串格式",什么叫

  "符合PHP的字串格式"(有谁知道,麻烦告诉一声)?我不知道,也无从查找,只好看看字串处理函数.

  发现htmlspecialchars()好像可用,于是试了一把:

  <?

  $aa='my name is yyy!';

  $conn=mysql_connect('localhost','root','');

  $sele='select sour from envtest where ;

  $res=mysql_db_query('evaltest',$sele);

  $arra=mysql_fetch_array($res);

  $str=htmlspecialchars($arra['sour']);

  eval("echo\"$str\";");

  ?>

  可是在页面上显示是这样的:

  <input type="text"name="textfield"value="my name is yyy!">

  变量带入成功,可显示不符合要求.察看文件源码,内容如下:

  <input type="text"name="textfield"value="my&bsp name&bsp is yyy!">

  再看看手册的htmlspecialchars()的用法,发现此函数对字串作了如下操作:

  &(和)转成&

  "(双引号)转成"

  <(小于)转成<

  >(大于)转成>

  再查找,没发现与此函数作用相反的函数,于是,自己加了几行代码,再作如下调试,终于成功.

  <?php

  function dehtml($str){

  $str=str_replace('"','"',$str);

  $str=str_replace('<','<',$str);

  $str=str_replace('>','>',$str);

  $str=str_replace('&','&',$str);

  return$str;

  }

  $aa='2881064151my name is yyy!';

  $conn=mysql_connect('localhost','root','');

  $sele='select sour from envtest where ;

  $res=mysql_db_query('evaltest',$sele);

  $arra=mysql_fetch_array($res);

  $str=HTMLSpecialChars($arra['sour']);

  eval("echo dehtml(\"$str\");");

  ?>

  在这个代码调试成功后,我又把一个内容复杂的html页面的源码加入一变量后插入到evaltest表中,

  再次测试,也成功了.

  有关eval函数用法里的"待处理的字串要符合PHP的字串格式",我想是经过

  HTMLSpecialChars()函数处理过的字串吧,不知正确与否