当前位置:  编程技术>php
本页文章导读:
    ▪PHP SOAP调用.net的WebService数据的实例代码      本节内容: SOAP调用.net的WebService数据 与.net系统进行数据交换,对方提供了一个WebService接口,在php中考虑使用SOAP调用对方的WebService数据。 与一般的PHP POST或GET传值再查库拿数据的思路不同.........
    ▪PHP spl_autoload_register 自动加载方法浅析      本节内容: PHP spl_autoload_register 自动加载 说明: spl_autoload_register()函数是主流框架使用最多的函数,也是非常核心的函数之一,可实现自动注册函数和类,实现类似__autoload() 函数功能,简.........
    ▪php防止SQL注入的方法分享      sql注入产生的原因,一般如下: 一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义(转义输出)。 这两个重要的步骤缺一不可,需要同时加.........

[1]PHP SOAP调用.net的WebService数据的实例代码
    来源: 互联网  发布时间: 2013-12-24

本节内容:
SOAP调用.net的WebService数据

与.net系统进行数据交换,对方提供了一个WebService接口,在php中考虑使用SOAP调用对方的WebService数据。

与一般的PHP POST或GET传值再查库拿数据的思路不同,需要用到SOAP模块。
首先,确认PHP.ini开启了.SOAP,即extension=php_soap.dll 去掉前的分号。


例子:
 

代码示例:
<?php
/**
* SOAP调用.net的WebService数据
* edit: www.
*/
$client = new SoapClient('http://www.aa.net/SearchService.asmx?WSDL');//这个SOAP地址要换成你自己的
$client->soap_defencoding = 'utf-8'; 
$client->decode_utf8 = false;  
$client->xml_encoding = 'utf-8';
$param = array('param1'=>'01', 'param2'=>'02');
//$param["param1"]="01";
//$param["param2"]="02";
//$result = $client->__soapCall("GetArticle", array( $param ));
$result = $client->__Call("GetArticle", array( $param ));
if (is_soap_fault($result))
{
    trigger_error("SOAP Fault: (faultcode: {$result->faultcode}, faultstring: {$result->faultstring})", E_USER_ERROR);
}
else
{
    $data = $result->GetArticleResult; //这里返回的是类,必须使用->得到元素的值
    print_r($data);
}
?>

注意:参数是数组外再包一层数组,就是 array( array() )

附,SOAP接口的一些参数:
以下是 SOAP 1.2 请求和响应示例。所显示的占位符需替换为实际值。
 

代码示例:
POST /SearchService.asmx HTTP/1.1
Host: 202.105.183.61
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/GetTrafficViolationInfo"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetArticle xmlns="http://tempuri.org/">
      <param1>string</param1>
      <param2>string</param2>
    </GetArticle>
  </soap:Body>
</soap:Envelope>

    
[2]PHP spl_autoload_register 自动加载方法浅析
    来源: 互联网  发布时间: 2013-12-24

本节内容:
PHP spl_autoload_register 自动加载

说明:
spl_autoload_register()函数是主流框架使用最多的函数,也是非常核心的函数之一,可实现自动注册函数和类,实现类似__autoload() 函数功能,简化了类的调用与加载,提高了工作的效率。

 
函数原型
bool spl_autoload_register ([ callback $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )

版本兼容
PHP 5 >= 5.1.2

实验过程
第一步,使用spl_autoload_register()函数注册load()方法
 

代码示例:
<?php
function load(){
require_once 'lib.php';
}
spl_autoload_register('load');
?>

lib.php文件,内容:
 

代码示例:

<?php
class className{
function method(){
echo 'a method in class';
}
}

function onlyMethod(){
echo 'method only';
}
?>

说明:lib.php文件为一个className类和一个onlyMethod函数

第二步,调用自动加载类
 

代码示例:
<?php
$class = new className();
$class->method();
onlyMethod();

输出:
a method in class
method only

说明:实例化className类,并调用类method()函数,同时调用onlyMethod()方法,输出正常,没有出现错误

第三步,直接调用函数
onlyMethod();

说明:没有实例化类,直接调用lib.php文件中的onlyMethod()函数
输出:
Fatal error: Call to undefined function onlyMethod() in '...(省略路径)'

第四步,实例化className类,再直接调用
 

代码示例:
<?php
$class = new className();
onlyMethod();

输出:method only

代码说明:
如果加载的文件包含函数,使用则一定需要实例化里面的类,否则就产生异常情况 Call to undefined function错误。


    
[3]php防止SQL注入的方法分享
    来源: 互联网  发布时间: 2013-12-24

sql注入产生的原因,一般如下:
一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义(转义输出)。
这两个重要的步骤缺一不可,需要同时加以特别关注以减少程序错误。
对于攻击者来说,进行SQL注入攻击需要思考和试验,对数据库方案进行有根有据的推理非常有必要(当然假设攻击者看不到你的源程序和数据库方案)。

例子, 一个简单的登录表单:
 

代码示例:
<form action="/login.html" method="POST">
<p>Username: <input type="text" name="username" /></p>
<p>Password: <input type="password" name="password" /></p>
<p><input type="submit" value="Log In" /></p>
</form>

攻击者会从推测验证用户名和密码的查询语句开始。通过查看源文件,他就能开始猜测你的习惯。
比如命名习惯。通常会假设你表单中的字段名为与数据表中的字段名相同。当然,确保它们不同未必是一个可靠的安全措施。

第一次猜测,一般会使用下面例子中的查询:
 

代码示例:

<?php
 $password_hash = md5($_POST['password']);

$sql = "SELECT count(*)
      FROM   users
      WHERE  username = '{$_POST['username']}'
      AND    password = '$password_hash'";
 ?>

使用用户密码的MD5值原来是一个通行的做法,但现在并不是特别安全了。

最近的研究表明MD5算法有缺陷,而且大量MD5数据库降低了MD5反向破解的难度。

请访问http://md5.rednoize.com/ 查看演示。
最好的保护方法:
在密码上附加一个自定义的字符串,例如:
 

代码示例:
<?php
 $salt = 'SHIFLETT';
$password_hash = md5($salt . md5($_POST['password'] . $salt));
 ?>

当然,攻击者未必在第一次就能猜中,他们常常还需要做一些试验。有一个比较好的试验方式是把单引号作为用户名录入,原因是这样可能会暴露一些重要信息。有很多开发人员在Mysql语句执行出错时会调用函数mysql_error()来报告错误。见下面的例子:
 

代码示例:
<?php
 mysql_query()($sql) or exit(mysql_error());
 ?>

该方法能向攻击者暴露重要信息。如果攻击者把单引号做为用户名,mypass做为密码,查询语句就会变成:
 

代码示例:
<?php
 $sql = "SELECT *
      FROM   users
      WHERE  username = '''
      AND    password = 'a029d0df84eb5549c641e04a9ef389e5'";
 ?>

当该语句发送到MySQL后,系统就会显示如下错误信息:
You have an error in your SQL syntax. Check the manual that corresponds to your
MySQL server version for the right syntax to use near 'WHERE username = ''' AND
password = 'a029d0df84eb55

不费吹灰之力,攻击者已经知道了两个字段名(username和password)以及他们出现在查询中的顺序。除此以外,攻击者还知道了数据没有正确进行过滤(程序没有提示非法用户名)和转义(出现了数据库错误),同时整个WHERE条件的格式也暴露了,这样,攻击者就可以尝试操纵符合查询的记录了。
在这一点上,攻击者有很多选择。一是尝试填入一个特殊的用户名,以使查询无论用户名密码是否符合,都能得到匹配:
myuser' or 'foo' = 'foo' --

假定将mypass作为密码,整个查询就会变成:
 

代码示例:

<?php

$sql = "SELECT *
      FROM   users
      WHERE  username = 'myuser' or 'foo' = 'foo' --
      AND    password = 'a029d0df84eb5549c641e04a9ef389e5'";

?>

幸运的是,SQL注入是很容易避免的。正如前面所提及的,你必须坚持过滤输入和转义输出。

虽然两个步骤都不能省略,但只要实现其中的一个就能消除大多数的SQL注入风险。如果你只是过滤输入而没有转义输出,你很可能会遇到数据库错误(合法的数据也可能影响SQL查询的正确格式),但这也不可靠,合法的数据还可能改变SQL语句的行为。另一方面,如果你转义了输出,而没有过滤输入,就能保证数据不会影响SQL语句的格式,同时也防止了多种常见SQL注入攻击的方法。

当然,还是要坚持同时使用这两个步骤。过滤输入的方式完全取决于输入数据的类型(见第一章的示例),但转义用于向数据库发送的输出数据只要使用同一个函数即可。对于MySQL用户,可以使用函数mysql_real_escape_string( ):
 

代码示例:

<?php
 $clean = array();
$mysql = array();

$clean['last_name'] = "O'Reilly";
$mysql['last_name'] = mysql_real_escape_string($clean['last_name']);

$sql = "INSERT
      INTO   user (last_name)
      VALUES ('{$mysql['last_name']}')";
 ?>

尽量使用为你的数据库设计的转义函数。如果没有,使用函数addslashes()()是最终的比较好的方法。
当所有用于建立一个SQL语句的数据被正确过滤和转义时,实际上也就避免了SQL注入的风险。如果你正在使用支持参数化查询语句和占位符的数据库操作类(如PEAR::DB, PDO等),你就会多得到一层保护。见下面的使用PEAR::DB的例子:
 

代码示例:
<?php
$sql = 'INSERT
      INTO   user (last_name)
      VALUES (?)';
$dbh->query($sql, array($clean['last_name']));
?>

由于在上例中数据不能直接影响查询语句的格式,SQL注入的风险就降低了。PEAR::DB会自动根据你的数据库的要求进行转义,所以你只需要过滤输出即可。

如果正在使用参数化查询语句,输入的内容就只会作为数据来处理。这样就没有必要进行转义了,尽管你可能认为这是必要的一步(如果你希望坚持转义输出习惯的话)。实际上,这时是否转义基本上不会产生影响,因为这时没有特殊字符需要转换。在防止SQL注入这一点上,参数化查询语句为你的程序提供了强大的保护。

注:关于SQL注入,不得不说的是现在大多虚拟主机都会把magic_quotes_gpc选项打开,在这种情况下所有的客户端GET和POST的数据都会自动进行addslashes处理,所以此时对字符串值的SQL注入是不可行的,但要防止对数字值的SQL注入,如用intval()等函数进行处理。但如果你编写的是通用软件,则需要读取服务器的magic_quotes_gpc后进行相应处理。


    
最新技术文章:
▪PHP函数microtime()时间戳的定义与用法
▪PHP单一入口之apache配置内容
▪PHP数组排序方法总结(收藏)
▪php数组排序方法大全(脚本学堂整理奉献)
▪php数组排序的几个函数(附实例)
▪php二维数组排序(实例)
▪php根据键值对二维数组排序的小例子
▪php验证码(附截图)
▪php数组长度的获取方法(三个实例)
▪php获取数组长度的方法举例
▪判断php数组维度(php数组长度)的方法
▪php获取图片的exif信息的示例代码
▪PHP 数组key长度对性能的影响实例分析
▪php函数指定默认值的方法示例
▪php提交表单到当前页面、提交表单后页面重定...
▪php四舍五入的三种实现方法
▪php获得数组长度(元素个数)的方法
▪php日期函数的简单示例代码
▪php数学函数的简单示例代码
▪php字符串函数的简单示例代码
▪php文件下载代码(多浏览器兼容、支持中文文...
▪php实现文件下载、支持中文文件名的示例代码...
▪php文件下载(防止中文文件名乱码)的示例代码
▪php数组排序的几个函数(附实例) iis7站长之家
▪php数组去重(一维、二维数组去重)的简单示例
▪php小数点后取两位的三种实现方法
▪php Redis 队列服务的简单示例
▪PHP导出excel时数字变为科学计数的解决方法
▪PHP数组根据值获取Key的简单示例
▪php数组去重的函数代码示例
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3