首页 > 后端开发 > 正文

PHP中什么是依赖注入

2024-09-12 05:46:48 | 我爱编程网

今天我爱编程网小编整理了PHP中什么是依赖注入相关内容,希望能帮助到大家,一起来看下吧。

本文目录一览:

PHP中什么是依赖注入

PHP中什么是依赖注入

依赖注入可能是我所知道的最简单设计模式之一,很多情况下可能你无意识中已经使用了依赖注入。不过它也是最难解释的一个。我认为有一部分原因是由于大多数介绍依赖注入的例子缺乏实际意义,让人难理解。因为PHP主要用于Web开发,那就先来看一个简单的web开发实例。
HTTP本身是一个无状态的连接协议,为了支持客户在发起WEB请求时应用程序能存储用户信息,我们就需要通过一种技术来实现存储状态交互。理所当然最简单的是使用cookie,更好的方式是PHP内置的Session机制。
$_SESSION['language'] = 'fr';
上面代码将用户语言存储在了名为language的Session变量中,因此在该用户随后的请求中,可以通过全局数组$_SESSION来获取language:
$user_language = $_SESSION['language'];
依赖注入主要用于面向对像开发,现在让我们假设我们有一个SessionStorage类,该类封装了PHP Session机制:
class SessionStorage
{
function __construct($cookieName = 'PHP_SESS_ID')
{
session_name($cookieName);
session_start();
}
function set($key, $value)
{
$_SESSION[$key] = $value;
}
function get($key)
{
return $_SESSION[$key];
}
// ...
}
同时还有一个User类提供了更高级的封装:
class User
{
protected $storage;
function __construct()
{
$this->storage = new SessionStorage();
}
function setLanguage($language)
{
$this->storage->set('language', $language);
}
function getLanguage()
{
return $this->storage->get('language');
}
// ...
}
代码很简单,同样使用User类也很简单:
$user = new User();
$user->setLanguage('fr');
$user_language = $user->getLanguage();
一切都很美好,除非你的程序需要更好的扩展性。假设现在你想要更改保存session_id的COOKIE键值,以下有一些可供选择的方法:
User类中创建SessionStorage实例时,在SessionStorage构造方法中使用字符串’SESSION_ID’硬编码:
class User
{
function __construct()
{
$this->storage = new SessionStorage('SESSION_ID');
}
// ...
}
在User类外部设置一个常量(名为STORAGE_SESSION_NAME)
class User
{
function __construct()
{
$this->storage = new SessionStorage(STORAGE_SESSION_NAME);
}
// ...
}
define('STORAGE_SESSION_NAME', 'SESSION_ID');
通过User类构造函数中的参数传递Session name
class User
{
function __construct($sessionName)
{
$this->storage = new SessionStorage($sessionName);
}
// ...
}
$user = new User('SESSION_ID');
还是通过User类构造函数中的参数传递Session name,不过这次参数采用数组的方式
class User
{
function __construct($storageOptions)
{
$this->storage = new SessionStorage($storageOptions['session_name']);
}
// ...
}
$user = new User(array('session_name' => 'SESSION_ID'));
上面的方式都很糟糕。
在user类中硬编码设置session name的做法没有真正解决问题,如果以后你还需要更改保存session_id的COOKIE键值,你不得不再一次修改user类(User类不应该关心COOKIE键值)。
使用常量的方式同样很糟,造成User类依赖于一个常量设置。
通过User类构造函数的参数或数组来传递session name相对来说好一些,不过也不完美,这样做干扰了User类构造函数的参数,因为如何存储Session并不是User类需要关心的,User类不应该和它们扯上关联。
另外,还有一个问题不太好解决:我们如何改变SessionStorage类。这种应用场景很多,比如你要用一个Session模拟类来做测试,或者你要将Session存储在数据库或者内存中。目前这种实现方式,在不改变User类的情况下,很难做到这点。
现在,让我们来使用依赖注入。回忆一下,之前我们是在User类内部创建SessionStorage对像的,现在我们修改一下,让SessionStorage对像通过User类的构造函数传递进去。
class User
{
function __construct($storage)
{
$this->storage = $storage;
}
// ...
这就是依赖注入最经典的案例,没有之一。现在使用User类有一些小小的改变,首先你需要创建SessionStorage对像。
$storage = new SessionStorage('SESSION_ID');
$user = new User($storage);
现在,配置session存储对像很简单了,同样如果改变session存储对像也很简单,所有这一切并不需要去更新User类,降低了业务类之间的耦合。
Pico Container 的网站上是这样描述依赖注入:
依赖注入是通过类的构造函数、方法、或者直接写入的方式,将所依赖的组件传递给类的方式。
所以依赖注入并不只限于通过构造函数注入。下面来看看几种注入方式:
构造函数注入
class User
{
function __construct($storage)
{
$this->storage = $storage;
}
// ...
}
setter方法注入
class User
{
function setSessionStorage($storage)
{
$this->storage = $storage;
}
// ...
}
属性直接注入
class User
{
public $sessionStorage;
}
$user->sessionStorage = $storage;
根据经验,一般通过构造函数注入的是强依赖关系的组件,setter方式用来注入可选的依赖组件。
现在,大多数流行的PHP框架都采用了依赖注入的模式实现业务组件间的高内聚低耦合。
// symfony: 构造函数注入的例子
$dispatcher = new sfEventDispatcher();
$storage = new sfMySQLSessionStorage(array('database' => 'session', 'db_table' => 'session'));
$user = new sfUser($dispatcher, $storage, array('default_culture' => 'en'));
// Zend Framework: setter方式注入的例子
$transport = new Zend_Mail_Transport_Smtp('smtp.gmail.com', array(
'auth' => 'login',
'username' => 'foo',
'password' => 'bar',
'ssl' => 'ssl',
'port' => 465,
));
$mailer = new Zend_Mail();
$mailer->setDefaultTransport($transport);

PHP中什么是依赖注入

php防sql注入漏洞可以用什么函数

1.函数的构建
function inject_check($sql_str) {
return eregi('select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile', $sql_str); // 进行过滤
}
function verify_id($id=null) {
if (!$id) { exit('没有提交参数!'); } // 是否为空判断
elseif (inject_check($id)) { exit('提交的参数非法!'); } // 注射判断
elseif (!is_numeric($id)) { exit('提交的参数非法!'); } // 数字判断
$id = intval($id); // 整型化
return $id;
}?
function str_check( $str ) {
if (!get_magic_quotes_gpc()) { // 判断magic_quotes_gpc是否打开
$str = addslashes($str); // 进行过滤
}
$str = str_replace("_", "\_", $str); // 把 '_'过滤掉
$str = str_replace("%", "\%", $str); // 把 '%'过滤掉
return $str;
}
function post_check($post) {
if (!get_magic_quotes_gpc()) { // 判断magic_quotes_gpc是否为打开
$post = addslashes($post); // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤
}
$post = str_replace("_", "\_", $post); // 把 '_'过滤掉
$post = str_replace("%", "\%", $post); // 把 '%'过滤掉
$post = nl2br($post); // 回车转换
$post = htmlspecialchars($post); // html标记转换
return $post;
}
2.函数的使用实例
<?php
if (inject_check($_GET['id']))
{
exit('你提交的数据非法,请检查后重新提交!');
}
else
{
$id = $_GET['id'];
//处理数据………………
}
?>

PHP中什么是依赖注入

php网站怎么注入php注入

我爱编程网(https://www.52biancheng.com)小编还为大家带来php网站怎么注入php注入的相关内容。

如何将sql注入PHP网站?有办法破解防御吗?

网站的运行安全是每个站长必须考虑的问题。众所周知,黑客攻击网站大多采用sql注入的方式,这也是为什么我们常说最原始、最静态的网站是最安全的。今天我们来谈谈PHP注入的安全规范,防止你的网站被sql注入。

当今主流的网站开发语言是php,那么我们先从php网站如何防范sql注入说起:

php注入的安全注意事项通过以上过程,我们可以学习Php注入的原理和技巧,当然也可以制定出相应的注意事项:

首先是服务器的安全设置,这里有phpmysql的安全设置和linux主机的安全设置。为了防止phpmysql注入,首先将magic_quotes_gpc设置为on,display_errors设置为Off。如果是id类型,我们用intval()将其转换成整数类型,比如代码:

$id=intval($id);

MySQL_query="select*fromexamplewherearticleid='$id'";或者这样写:MySQL_query("select*fromarticlewherearticleleid="。intval($id)。"")

如果是字符型,用addslashes()过滤,再过滤“%”和“_”,比如:

$search=addslashes($search);

$search=str_replace("_","_",$search);

$search=str_replace("%","%",$search);

当然,你也可以添加php通用反注入代码:

/*************************

通用PHP反注入安全代码

描述:

确定传递的变量是否包含非法字符。

比如$_POST,$_GET

功能:

反注射

**************************/

//要过滤的非法字符

$ArrFiltrate=array(“”,“;”,“工会”);

//出错后要跳转的url。如果留空,则默认为上一页。

$StrGoUrl="

//数组中是否有值

函数FunStringExist($strfilter,$ArrFiltrate

foreach($arrfilteras$key=$value){

if(eregi($value,$StrFiltrate)){

返回true

}

}

返回false

}

//合并$_POST和$_GET

if(function_exists(array_merge)){

$ArrPostAndGet=array_merge($HTTP_POST_VARS,$HTTP_GET_VARS);

}否则{

foreach($HTTP_POST_VARSas$key=$value){

$ArrPostAndGet[]=$value;

}

foreach($HTTP_GET_VARSas$key=$value){

$ArrPostAndGet[]=$value;

}

}

//身份验证开始。

foreach($ArrPostAndGetas$key=$value){

if(FunStringExist($value,$ArrFiltrate

Echo"alert(/"Neeao提示,非法字符/");

if(empty($StrGoUrl)){

echo"history.go(-1);";

}否则{

echo“window.location=/”quot;.$StrGoUrl。"/";";

}

退出;

}

}

马鞭你可以。

**************************/

另外,管理员用户名和密码采用md5加密,可以有效防止php的注入。

还有一些服务器和mysql的安全防范措施。

linux服务器的安全设置:

加密密码,使用“/usr/sbin/authconfig”工具打开密码的影子功能,加密密码。

禁止访问重要文件,进入linux命令界面,输入:

#chmod600/etc/inetd.conf//将文件属性更改为600

#chattrI/etc/inetd.conf//确保文件的所有者是root

##chattr-I/etc/inetd.conf////限制对此文件的更改

禁止任何用户通过su命令更改为root用户。

在su配置文件的开头添加以下两行,即/etc/pam.d/directory:

authsufficient/lib/security/PAM_rootok.sodebug

需要授权/lib/security/PAM_whell.sogroup=wheel

删除所有特殊账户。

#userdellp等。删除用户

#groupdellp等。删除该组

禁止的suid/sgid程序

#find/-键入f)-execls_LG{};

如何判断PHP源码是否存在SQL注入漏洞?

判断是否存在SQL注入首先找到可能的注入点;比如常见的get,post,甚至cookie,传递参数到PHP,然后参数被拼接到SQL中,如果后端接收参数后没有进行验证过滤,就很可能会出现注入。比如xxx.com?id=321,id就很可能是注入点。

说白了就是不要相信用户输入,对用户可控的参数进行严格校验。注意是严格校验!简单的去空格,或者是特殊字符替换很容易绕过。 我爱编程网

如果已经有原码,可以进行代码审计,进行逐一排查。也可以搭建本地环境使用类似于sqlmap这样的自动化工具进行可以链接的检测。

个人理解仅供参考,如有偏颇望批评指正!

以上就是PHP中什么是依赖注入全部内容,更多相关信息,敬请关注我爱编程网。更多相关文章关注我爱编程网:www.52biancheng.com

免责声明:文章内容来自网络,如有侵权请及时联系删除。
与“PHP中什么是依赖注入”相关推荐
怎么能通俗易通的了解php中的反射和依赖注入这两个概念
怎么能通俗易通的了解php中的反射和依赖注入这两个概念

怎么能通俗易通的了解php中的反射和依赖注入这两个概念除非你去开发类似ZendFramework,ThinkPHP,CakePHP之类的框架,几乎没有机会用到这个。这是很底层的东西,尤其是依赖注入这种东西的应用场景就是辅助开发,选型的框架支持依赖注入就行了,没必要自己实现。而反射这个东西也差不多,在业务逻辑中我从来没遇到过必须要靠反射解决的问题,同样也是框架才用到。php反射在哪些场

2024-08-20 16:11:47
php函数实现反转 【PHP】依赖注入(DI)和控制反转(IOC)详解
php函数实现反转 【PHP】依赖注入(DI)和控制反转(IOC)详解

php删除数组重复的值$arr=array(1,2,4,2,0,9,8,5);//定义一个数组。$arr1=$arr;//定义另一个数组和上一个数组一样。//循环第一个数组让后循环第二个数组用第一个数组的每个值和第二个数组比较如果相同就删除,最后输出第二个数组就行了。for($i=0;$i&lt;count($arr);$i++){for($j=$i+1;$j&lt

2025-01-25 05:36:40
什么是sql 注入,如何实现注入?
什么是sql 注入,如何实现注入?

什么是sql注入,如何实现注入?找了一个,希望能帮助你随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQLInjec

2024-10-18 17:12:40
thinkphp怎么做才是安全的sql防注入
thinkphp怎么做才是安全的sql防注入

thinkphp怎么做才是安全的sql防注入注入的产生一般都是对用户输入的参数未做任何处理直接对条件和语句进行拼装.代码举例://不安全的写法举例1$_GET['id']=8;//希望得到的是正整数$data=M('Member')-&gt;where('id='.$_GET['id'])-&gt;find();$_GET['id']='8orstat

2024-11-11 09:18:11
php如何防止sql注入
php如何防止sql注入

php如何防止sql注入PHP防止sql注入是一个比较低级的问题了,这个问题其实在我大一上学期做第一个个人博客的时候就已经关注过了,不过简单的说一下关于PHP防注入的方式吧。使用PDO防注入。这是最简单直接的一种方式,当然低版本的PHP一般不支持PDO方式去操作,那么就只能采用其它方式。采用escape函数过滤非法字符。escape可以将非法字符比如斜杠等非

2025-01-14 09:45:27
php如何防止sql注入攻击?
php如何防止sql注入攻击?

php如何防止sql注入攻击?注入式攻击的类型可能存在许多不同类型的攻击动机,但是乍看上去,似乎存在更多的类型。这是非常真实的-如果恶意用户发现了一个能够执行多个查询的办法的话。本文后面,我们会对此作详细讨论。如果你的脚本正在执行一个SELECT指令,那么,攻击者可以强迫显示一个表格中的每一行记录-通过把一个例如=1这样的条件注入到WHERE子句中,如下所示(其中,注入部

2024-07-19 23:28:44
Thinkphp框架 < 5.0.16 sql注入漏洞分析(Thinkphp框架 3.2.x sql注入漏洞分析)
Thinkphp框架 < 5.0.16 sql注入漏洞分析(Thinkphp框架 3.2.x sql注入漏洞分析)

Thinkphp框架<5.0.16sql注入漏洞分析本文讨论的是ThinkPHP框架版本&lt;5.0.16的SQL注入漏洞分析。文章首先介绍了环境搭建和漏洞复现的流程。在分析过程中,重点讲解了助手函数input()的使用以及数据库操作的基本框架,强调了使用框架的便捷性和安全性。接着,文章深入分析了漏洞发生的具体步骤。通过访问特定payload,程序跳转到入口文件,接着分析了sql执行

2025-02-11 06:14:11
主类是什么意思,为什么main方法是程序的入口,他是什么逻辑运行的?
主类是什么意思,为什么main方法是程序的入口,他是什么逻辑运行的?

java程序一般应当含有main方法,因为它是所有java程序执行的入口。是对还是错?错误java程序分为java应用程序+小应用程序applet如果是java应用程序,一般应当含有main方法,因为它是所有java程序执行的入口如果是applet,不用main方法。。。由init初始化,start启用主类是什么意思,为什么main方法是程序的入口,他是什么逻辑运行的

2024-04-10 01:35:24