
正文
php数据绑定注入 php对象注入
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
php如何防止sql注入
PHP防止sql注入是一个比较低级的问题了,这个问题其实在我大一上学期做第一个个人博客的时候就已经关注过了,不过简单的说一下关于PHP防注入的方式吧。
使用PDO防注入。
这是最简单直接的一种方式,当然低版本的PHP一般不支持PDO方式去操作,那么就只能采用其它方式。
采用escape函数过滤非法字符。
escape可以将非法字符比如 斜杠等非法字符转义,防止sql注入,这种方式简单粗暴,但是不太建议这么用。
自己手写过滤函数,手写一个php sql非法参数过滤函数来说还是比较简单的,但是你的函数需要非常的健壮,不让仍然有可能被非法黑客攻击;你的Coding水平直接决定了你的函数的健壮性。
各种框架里面其实都有对于非法字符过滤的支持,最简单的比如ThinkPHP,你可以直接防止注入。
写一个PHP扩展对于进入参数进行有选择的过滤。 开发一个PHP扩展是对于一个PHP高级程序员必备的技能,将你需要的功能打包在PHP扩展里面,就像黑词过滤一样进行检查,是非常方便的。一般都是用在自己写框架路由器转发的时候,如果你用扩展实现框架的路由器转发的话,可以顺便将参数过滤加入到PHP扩展里面,通过C去实现。
对于现在的防注入技术其实已经成熟了,对于一个站点该关心的不是防注入了,而是大规模高并发如何处理的问题,或者关于各种其他漏洞,比如现在世界上仍然有百分之80使用redis的站点存在redis漏洞,通过redis漏洞可以直接拿到机器的访问权限,一般来说都是直接给你种一个挖矿机器人来。
相关问答
Q1: PHP中什么是依赖注入
依赖注入可能是我所知道的最简单设计模式之一php数据绑定注入,很多情况下可能php数据绑定注入你无意识中已经使用php数据绑定注入了依赖注入。不过它也是最难解释的一个。我认为有一部分原因是由于大多数介绍依赖注入的例子缺乏实际意义,让人难理解。因为PHP主要用于Web开发,那就先来看一个简单的web开发实例。
HTTP本身是一个无状态的连接协议,为php数据绑定注入了支持客户在发起WEB请求时应用程序能存储用户信息,我们就需要通过一种技术来实现存储状态交互。理所当然最简单的是使用cookie,更好的方式是PHP内置的Session机制。
$_SESSION['language'] = 'fr';
上面代码将用户语言存储在了名为language的Session变量中,因此在该用户随后的请求中,可以通过全局数组$_SESSION来获取languagephp数据绑定注入:
$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);
Q2: php如何将数据库的中的数据绑定到li标签上
$sql="";
$query=mysql_query($sql);
echo mysql_num_rows($query);
while($top = mysql_fetch_array($query)){
echo 'li'.$top['catid'].'/li';
}
百度w3c看里面php 教程 更详细些
关于php数据绑定注入和php对象注入的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。







