音乐推荐,知识点积累
assert这个函数在php语言中是用来判断一个表达式是否成立。返回true or false;
例如

<?php
$s = 123;
assert("is_int($s)");
?>


从这个例子可以看到字符串参数会被执行,这跟eval()类似。不过eval($code_str)只是执行符合php编码规范的$code_str。assert的
用法却更详细一点。assert_option()可以用来对assert()的进行一些约束和控制;

默认值
ASSERT_ACTIVE=1 //Assert函数的开关
ASSERT_WARNING =1 //当表达式为false时,是否要输出警告性的错误提示,issue a PHP warning for each failed assertion
ASSERT_BAIL= 0 //是否要中止运行;terminate execution on failed assertions
ASSERT_QUIET_EVAL= 0 //是否关闭错误提示,在执行表达式时;disable error_reporting during assertion expression evaluation  
ASSERT_CALLBACK= (NULL) // 是否启动回调函数 user function to call on failed assertions

如果按照默认值来,在程序的运行过程中调用assert()来进行判断表达式,遇到false时程序也是会继续执行的,这在生产环境中这样使用是不好的,而在开发调试环境中,却是一种debug的不错的方式。特别是用上callback的方法,可以知道具体的出错信息。例如


<?php
// Active assert and make it quiet
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 0);
assert_options(ASSERT_QUIET_EVAL, 1);

// Create a handler function
function my_assert_handler($file, $line, $code)
{
    echo "<hr>Assertion Failed:
        File '$file'<br />
        Line '$line'<br />
        Code '$code'<br /><hr />";
}

// Set up the callback
assert_options(ASSERT_CALLBACK, 'my_assert_handler');

// Make an assertion that should fail
assert('mysql_query("")');
?>



所以,php的官方文档里头是建议将assert用来进行debug,我们可以发现还有一个开关ASSERT_ACTIVE可以用来控制是否开启debug。

现在问题就产生了,如果程序员在开发的时候在代码中留下了很多assert(),然后在程序发布的时候关闭执行,设置assert_options(ASSERT_ACTIVE,0);这样做是否可行?有没有安全问题?

我的建议是,既然assert主要作用是debug,就不要在程序发布的时候还留着它。在程序中用assert来对表达进行判断是不明智的,原因上文说了,一个是在生产环境中assert可能被disabled,所以assert不能被完全信任;二是assert()可以被继续执行;而如果在生产环境让ASSERT_ACTIVE=1,那这个表达式字符串可以被执行本身就存在安全隐患。例如


<?php
function fo(){
  $fp = fopen("c:/test.php",'w');
  fwrite($fp,"123");
  fclose($fp);
  return true;
}
assert("fo()");
?>







kakapo_lightblue
Posted in 网海拾贝 on 2009/06/30 / 评论(0) »
点击在新窗口中浏览此图片


点击在新窗口中浏览此图片
survey software
都是国外开源的免费调查软件

LimeSurvey  http://www.limesurvey.org

phpQuestionnaire http://www.chumpsoft.com/products/phpq/
透明的gif动画效果如下

$new_im = new Imagick();
$new_im->setFormat('gif');
$pics = glob("nv01/*.png");
foreach($pics as $k => $v)
{
  $im = new Imagick($v);
  $im->trimImage(0);
  $new_im->addImage($im);
  $new_im->setImageDelay(15);
                //设置每一帧图片是独立的,屏蔽上一帧(关键)
  $new_im->setImageDispose(imagick::DISPOSE_PREVIOUS);
}
$new_im->coalesceImages();
$new_im->writeImages('ani.gif',1);
?>
写点什么呢
Posted in 网海拾贝 on 2008/07/06 / 评论(1) »
      连续两个月没有记下点东西了。并不是没东西可些,这段时间实在是太忙了。

      从5月份开始项目的准备,到6月份疯狂的代码开发,目标很明确在7月1日完成项目的正式上线。当一切都顺利进行到6月24日的时候,投资人初看了我们的产品,发现设计风格和发展方向跟他们的想法不一致,结果令人非常痛苦,一个字“改”。最后当7月1日到来的时候,虽然我们准备好了产品,但是我们的产品需求策划组却在进行第二轮的设计。无赖之下,我们的开发人员选择了休息一周,重新准备开发二次升级版本。过去一周就是在debug中度过的。

      回顾一下这两个月,从技术角度来讲,我有很多东西可以记录下来。比如模拟登陆采用的curl技术。等项目完成上线之后,我再一一记录下来,积累技术沉淀。
        本文分两个段落介绍如何加强 PHP SOAP 的安全性。第一,通过安全的https(即HTTP over SSL)协议,加密http信息,防止在网络传输层的数据包被明文获取。php方面只要支持OpenSSL模块,就可以访问https服务器。第二,为了验证soap client,在soap server端加上一个标准的HTTP认证,防止任何soap客户端都可以连上服务端。那么代码如何实现呢?
如何快读,简单的搭建 php soap webservice 可以先看我以前发表的文章。《实现 php webservice 之 SOAP Functions 介绍》。

以下是我实现的代码:

       1、服务端 soap_server.php 代码,关键是加了一段 basic http authentication.


<?php
if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) ||
!($_SERVER['PHP_AUTH_USER']=='admin' && $_SERVER['PHP_AUTH_PW']=='123456')) {
    header('WWW-Authenticate: Basic realm="WEBSERVICE"');                  
    header("HTTP/1.0 401 Unauthorized");
    echo "You must enter a valid login ID and password to access this resource\n";
  die;
}else{
  require './soap_functions.php';
  ini_set("soap.wsdl_cache_enabled", 0);
  $server = new SoapServer('pay.wsdl',array('encoding'=>'UTF-8'));
  $server->addFunction(array("get_user_info"));
  
  if(isset($HTTP_RAW_POST_DATA)) {
     $request = $HTTP_RAW_POST_DATA;
  } else {
      $request = file_get_contents('php://input');
  }
  
  if ($_SERVER["REQUEST_METHOD"] == "POST") {
      $server->handle($request);
  } else {
      echo "This SOAP server can handle following functions: ";
      $functions = $server->getFunctions();
      foreach($functions as $k=>$func){
        echo $k.". ".$func . "\n";
      }
  }
}
?>


     2、客户端soap_client.php代码, 注意要加上array('login' => "admin",  'password' => "123456")这个参数,否则会显示错误如下:Fatal error: SOAP Fault: (faultcode: HTTP, faultstring: Unauthorized) in ...

<?php
//define("SSL_PASSWD", "asdfghjkl");
//define("SSL_CERTFILE", "E:\tz\pay\admincp\webservice\server.pem");
try{
  ini_set("soap.wsdl_cache_enabled", 0);
  //array('local_cert'     => SSL_CERTFILE,'passphrase'=>SSL_PASSWD)
  $soap = new SoapClient('pay.wsdl',array('login' => "admin",  'password' => "123456"));
  $result = $soap->get_user_info(10001);
  print_r($result);

}catch (SoapFault  $fault){
  trigger_error("SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})", E_USER_ERROR);
}
?>


       3、 wsdl 文件

<?xml version='1.0' encoding='UTF-8'?>

<!-- WSDL file generated by Zend Studio. -->

<definitions name="Untitled" targetNamespace="urn:Untitled" xmlns:typens="urn:Untitled" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/">
  
  <message name="get_user_info">
    <part name="user_id" type="xsd:integer"/>
  </message>
  <message name="get_user_infoResponse">
    <part name="get_user_infoReturn" type="xsd:anyType"/>
  </message>
  <portType name="soap_functionsPortType">
    <operation name="get_user_info">
      <documentation>
        获取用户所有信息
      </documentation>
      <input message="typens:get_user_info"/>
      <output message="typens:get_user_infoResponse"/>
    </operation>
  </portType>
  <binding name="soap_functionsBinding" type="typens:soap_functionsPortType">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    
    <operation name="get_user_info">
      <soap:operation soapAction="urn:soap_functionsAction"/>
      <input>
        <soap:body namespace="urn:Untitled" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </input>
      <output>
        <soap:body namespace="urn:Untitled" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </output>
    </operation>
  </binding>
  <service name="UntitledService">
    <port name="soap_functionsPort" binding="typens:soap_functionsBinding">
    <soap:address location="https://www.xxx.com/webservice/soap_server.php"/>
    </port>
  </service>
</definitions>



关键主要的地方,location="https://...";告诉soap去访问https的服务端,如果php的OpenSSL没装,那么就会报错;
Fatal error: SOAP Fault: (faultcode: HTTP, faultstring: SSL support is not available in this build) in ...

<service name="UntitledService">
    <port name="soap_functionsPort" binding="typens:soap_functionsBinding">
    <soap:address location="https://www.xxx.com/webservice/soap_server.php"/>
    </port>
  </service>
分页: 1/4 第一页 1 2 3 4 下页 最后页 [ 显示模式: 摘要 | 列表 ]