手工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手工注入怎么查询字段长度

暴字段长度命令如下

Order by num/*

另完整的手工注入过程如下:

首先要做的是在判断好字段数后,爆破用户信息,注入的过程中如果当前数据库连接用户为root或者具有root权限就可以尝试使用loadfile()这个函数来读取文件。

一、在linux下我们可以读取/etc/passwd和/etc/shadow来暴力破解linux密码

二、在windows下我们可以读取一些常见的文件以及敏感的地方比如serv-u的配置文件my.ini等等,然后就是一一破解字段和字段内容即可。

第二种情况通过version()函数得知mysql版本在5.0以上,那么可以使用mysql自带的information_schema这个数据库来查询所有的表,然后也是一一破解字段和字段内容即可。

最不好的情况(目前很少了)就是权限不是root,数据库版本过低,那么所有的表,字段都是要自己猜解的,没有工具的情况下,会让工作量加大几十倍,还不一定能猜到,让人汗颜。

所以有工具还是很方便的。

如何注入 php

去后盾人找视频,上面视频都是牛人老师录制,含金量高,可以解答你问题

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/298164.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-28 12:17
下一篇 2024-12-28 12:17

相关推荐

  • PHP和Python哪个好找工作?

    PHP和Python都是非常流行的编程语言,它们被广泛应用于不同领域的开发中。但是,在考虑择业方向的时候,很多人都会有一个问题:PHP和Python哪个好找工作?这篇文章将从多个方…

    编程 2025-04-29
  • PHP怎么接币

    想要在自己的网站或应用中接受比特币等加密货币的支付,就需要对该加密货币拥有一定的了解,并使用对应的API进行开发。本文将从多个方面详细阐述如何使用PHP接受加密货币的支付。 一、环…

    编程 2025-04-29
  • 使用PHP foreach遍历有相同属性的值

    本篇文章将介绍如何使用PHP foreach遍历具有相同属性的值,并给出相应的代码示例。 一、基础概念 在讲解如何使用PHP foreach遍历有相同属性的值之前,我们需要先了解几…

    编程 2025-04-28
  • PHP获取301跳转后的地址

    本文将为大家介绍如何使用PHP获取301跳转后的地址。301重定向是什么呢?当我们访问一个网页A,但是它已经被迁移到了另一个地址B,此时若服务器端做了301重定向,那么你的浏览器在…

    编程 2025-04-27
  • PHP登录页面代码实现

    本文将从多个方面详细阐述如何使用PHP编写一个简单的登录页面。 1. PHP登录页面基本架构 在PHP登录页面中,需要包含HTML表单,用户在表单中输入账号密码等信息,提交表单后服…

    编程 2025-04-27
  • PHP与Python的比较

    本文将会对PHP与Python进行比较和对比分析,包括语法特性、优缺点等方面。帮助读者更好地理解和使用这两种语言。 一、语法特性 PHP语法特性: <?php // 简单的P…

    编程 2025-04-27
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • MPU6050工作原理详解

    一、什么是MPU6050 MPU6050是一种六轴惯性传感器,能够同时测量加速度和角速度。它由三个传感器组成:一个三轴加速度计和一个三轴陀螺仪。这个组合提供了非常精细的姿态解算,其…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25

发表回复

登录后才能评论