音乐推荐,知识点积累
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()");
?>
例如
<?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()");
?>
survey software
都是国外开源的免费调查软件
LimeSurvey http://www.limesurvey.org
phpQuestionnaire http://www.chumpsoft.com/products/phpq/
都是国外开源的免费调查软件
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);
?>
$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);
?>
连续两个月没有记下点东西了。并不是没东西可些,这段时间实在是太忙了。
从5月份开始项目的准备,到6月份疯狂的代码开发,目标很明确在7月1日完成项目的正式上线。当一切都顺利进行到6月24日的时候,投资人初看了我们的产品,发现设计风格和发展方向跟他们的想法不一致,结果令人非常痛苦,一个字“改”。最后当7月1日到来的时候,虽然我们准备好了产品,但是我们的产品需求策划组却在进行第二轮的设计。无赖之下,我们的开发人员选择了休息一周,重新准备开发二次升级版本。过去一周就是在debug中度过的。
回顾一下这两个月,从技术角度来讲,我有很多东西可以记录下来。比如模拟登陆采用的curl技术。等项目完成上线之后,我再一一记录下来,积累技术沉淀。
从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>
如何快读,简单的搭建 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>




