整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Twig, 灵活、快速、安全的PHP模板语言

wig是一款灵活、快速、安全的PHP模板引擎。

  • 快速:Twig将模板编译为纯粹的,最优化的PHP代码。它的开销与常规的PHP代码相比,已经降到了极低。
  • 安全:Twig拥有沙盒模式,用于评估未受信任的模板代码。这使得Twig可以用于允许用户自行修改模板设计的应用程序中。
  • 灵活:Twig由一个灵活的词法分析器和解析器驱动。这使得开发者可以自定义标签和过滤器,并创建自己的DSL。

##为何会有这款模板引擎?

在为PHP带来模板引擎时,许多人会告诉你PHP本身就是一款模板引擎啊。虽说一开始PHP是作为一门模版语言使用,但它并不像近年来的任何模板引擎一样发展。事实上,他不支持现代模板引擎的许多特性:

  • 简洁:PHP语言在涉及到输出转义时冗长而可笑。
<?php echo $var ?>
<?php echo htmlspecialchars($var, ENT_QUOTES, 'UTF-8') ?>

相比之下,Twig拥有非常简洁的语法,它使得模版更具可读性:

{{ var }}
{{ var|escape }}
{{ var|e }}         {# shortcut to escape a variable #}
  • 模版导向语法:Twig为通用的模式提供了快捷方式,例如在遍历一个空数组时,会显示一个默认文本:
{% for user in users %}
    * {{ user.name }}
{% else %}
    No users have been found.
{% endfor %}

  • 全功能:Twig为你提供了轻松构建强大模版的一切:多重继承,块,自动化输出转义,以及其他许多特性:
{% extends "layout.html" %}

{% block content %}
    页面内容...
{% endblock %}
  • 易学:Twig的语法非常易学,即使是网页设计师也能毫无阻碍地快速完成工作:

当然,PHP也是许多模板引擎项目中用到的语言。但它们中的大多数仍是使用PHP 4开发的,并且不支持最佳的web开发实践:

  • 可扩展性:即使是在最复杂的情况下,Twig也足够灵活满足你的需求。得益于开放的体系,你可以实现你自己的语言结构(标签、过滤器、函数、甚至运算符等)来创建你自己的DSL。
  • 已被单元测试:Twig经历过完整的单元测试,它是稳定的,能用于大型项目的。
  • 文档:Twig拥有完整的文档,以及专用的在线手册,当然还有完善的API文档。
  • 安全:说到安全,Twig拥有一些独特的特性:自动输出转义:为安全考虑,你可以全局启用自动输出转义,或者只对某个块启用:{% autoescape true %} {{ var }} {{ var|raw }} {# var won't be escaped #} {{ var|escape }} {# var won't be doubled-escaped #} {% endautoescape %}
  • 沙盒:Twig可以在沙盒环境下评估任意模版,用户只能访问一组有限的标签,过滤器,以及由开发者定义的对象方法。沙盒可以全局地或者单独对某些模版启用:{{ include('page.html', sandboxed = true) }}
  • 清晰的错误信息:无论何时你在模版中遇到了语法错误,Twig都会输出带有出错的文件名和行号的帮助信息。它非常有助于调试。
  • 快速:Twig的目标之一就是尽可能地快。为了尽可能实现最佳的速度,Twig将模版编译成极致优化的PHP代码。它的开销与常规的PHP代码相比,已经降到了极低。

提供互联网服务,当你在开发代码的时候必须时刻保持安全意识。可能大部分 PHP 脚本都对安全问题都不在意,这很大程度上是因为有大量的无经验程序员在使用这门语言。但是,没有理由让你因为对你的代码的不确定性而导致不一致的安全策略。当你在服务器上放任何涉及到钱的东西时,就有可能会有人尝试破解它。创建一个论坛程序或者任何形式的购物车,被攻击的可能性就上升到了无穷大。

背景

为了确保你的 web 内容安全,这里有一些常规的安全准则:

别相信表单

攻击表单很简单。通过使用一个简单的 JavaScript 技巧,你可以限制你的表单只允许在评分域中填写 1 到 5 的数字。如果有人关闭了他们浏览器的 JavaScript 功能或者提交自定义的表单数据,你客户端的验证就失败了。

用户主要通过表单参数和你的脚本交互,因此他们是最大的安全风险。你应该学到什么呢?在 PHP 脚本中,总是要验证 传递给任何 PHP 脚本的数据。在本文中,我们向你演示了如何分析和防范跨站脚本(XSS)攻击,它可能会劫持用户凭据(甚至更严重)。你也会看到如何防止会玷污或毁坏你数据的 MySQL 注入攻击。

别相信用户

假定你网站获取的每一份数据都充满了有害的代码。清理每一部分,即便你相信没有人会尝试攻击你的站点。

关闭全局变量

你可能会有的最大安全漏洞是启用了 register_globals 配置参数。幸运的是,PHP 4.2 及以后版本默认关闭了这个配置。如果打开了register_globals,你可以在你的 php.ini 文件中通过改变 register_globals 变量为 Off 关闭该功能:

register_globals = Off

新手程序员觉得注册全局变量很方便,但他们不会意识到这个设置有多么危险。一个启用了全局变量的服务器会自动为全局变量赋任何形式的参数。为了了解它如何工作以及为什么有危险,让我们来看一个例子。

假设你有一个称为 process.php 的脚本,它会向你的数据库插入表单数据。初始的表单像下面这样:

name="username" type="text" size="15" maxlength="64">

运行 process.php 的时候,启用了注册全局变量的 PHP 会将该参数赋值到 $username 变量。这会比通过 $_POST['username'] 或$_GET['username'] 访问它节省击键次数。不幸的是,这也会给你留下安全问题,因为 PHP 会设置该变量的值为通过 GET 或 POST 的参数发送到脚本的任何值,如果你没有显示地初始化该变量并且你不希望任何人去操作它,这就会有一个大问题。

看下面的脚本,假如 $authorized 变量的值为 true,它会给用户显示通过验证的数据。正常情况下,只有当用户正确通过了这个假想的 authenticated_user() 函数验证,$authorized 变量的值才会被设置为真。但是如果你启用了 register_globals,任何人都可以发送一个 GET 参数,例如 authorized=1 去覆盖它:

php

// Define $authorized = true only if user is authenticated

if (authenticated_user()) {

$authorized = true;

}

?>

这个故事的寓意是,你应该从预定义的服务器变量中获取表单数据。所有通过 post 表单传递到你 web 页面的数据都会自动保存到一个称为 $_POST 的大数组中,所有的 GET 数据都保存在 $_GET 大数组中。文件上传信息保存在一个称为 $_FILES 的特殊数据中。另外,还有一个称为 $_REQUEST 的复合变量。

除此之外,

PHP 转义实现

把输出渲染成网页或API响应时,一定要转义输出,这也是一种防护措施,能避免渲染恶意代码,造成XSS攻击,还能防止应用的用户无意中执行恶意代码。

我们可以使用前面提到的htmlentities函数转移输出,该函数的第二个参数一定要使用ENT_QUOTES,让这个函数转义单引号和双引号,而且,还要在第三个参数中指定合适的字符编码(通常是UTF-8),下面的例子演示了如何在渲染前转义HTML输出:

';echo htmlentities($output, ENT_QUOTES, ‘UTF-8');

如果不转义直接输出,会弹出提示框:

转义之后输出变成:

现代PHP支持许多模板引擎,这些模板引擎在底层已经为了做好了转义处理,比如现在流行的twig/twig和smarty/smarty都会自动转义输出。这种默认处理方式很赞,为PHP Web应用提供了有力的安全保障。

Blade 模板引擎避免XSS攻击原理

Laravel使用的模板引擎是Blade,关于Blade的使用可以参考其官方文档,这里我们简单探讨下Laravel底层如何对输出进行转义处理。

一般我们在Laravel中返回视图内容会这么做:

return view(’test’, [‘data’=>$data]);

这是一个很简单的例子,意味着我们会在resources/views目录下找到test.blade.php视图文件,然后将$data变量传入其中,并将最终渲染结果作为响应的内容返回给用户。那么这一过程经历了哪些底层源码的处理,如果$data变量中包含脚本代码(如JavaScript脚本),又该怎么去处理呢?接下来我们让来一窥究竟。

首先我们从辅助函数view入手,当然这里我们也可以使用View:make,但是简单起见,我们一般用view函数,该函数定义在Illuminate\Foundation\helpers.php文件中:

function view($view = null, $data = [], $mergeData = []){ $factory = app(ViewFactory::class); if (func_num_args() === 0) { return $factory; } return $factory->make($view, $data, $mergeData);}

一.在web页面嵌入PHP代码的几种风格

推荐使用标准风格或简短风格

.代码如下:

<?php

//标准风格

echo 'Hello World!';

?>

hinkphp5是否有漏洞

就像其他开源框架一样,ThinkPHP5也可能存在一些漏洞。虽然开发者和安全研究人员会尽力测试和修补这些漏洞,但是总会有一些新的漏洞被发现。因此,在使用任何开源框架或软件时,都需要小心谨慎并定期更新以获取最新的漏洞修复和安全更新。

对于 ThinkPHP5 ,它已经发布了多个版本来修复一些已知的安全问题。如果您使用这个框架,请保持最新版本,并且遵循最佳实践来保护您的应用程序,例如:

- 配置文件等敏感信息不应该直接暴露在代码中,而是应该使用安全的方式进行存储和读取。

- 对于用户输入数据需要进行必要的过滤和验证,以免受到 SQL 注入、XSS 攻击等漏洞的影响。

- 使用强密码并定期更换。

- 禁止访问敏感文件等资源,使用适当的访问控制策略来保护您的应用程序的安全。

总之,只有保持警觉并遵循最佳实践,才能最大限度地减少应用程序受到安全攻击的风险。

thinkPhp5如何对于用户输入数据需要进行必要的过滤和验证,以免受到 SQL 注入、XSS 攻击等漏洞的影响。

ThinkPHP 5 提供了多种方式来对用户输入数据进行过滤和验证,包括如下几种:

  1. 参数绑定(Payload Binding)

ThinkPHP 5 支持使用参数绑定的方式来过滤、验证、转换用户输入数据,从而减少对于不安全请求的处理。

示例:

public function index(Request $request, $id)
{
    // 通过参数绑定自动过滤和验证参数
    $userInfo = $request->route('user/info');
    // 另一种参数绑定方式
    $name = $request->input('name/s');
}
  1. 参数校验

ThinkPHP 5 提供了多种验证规则、场景验证和自定义验证器来过滤和验证用户输入数据,开发者可以根据需求自定义自己的验证规则。验证器和 Rule 常用于表单验证和接口参数验证。

示例:

use think\Validate;

// 定义验证规则
class UserValidate extends Validate
{
    protected $rule = [
        'username|用户名'  => 'require|min:5',
        'password|密码' => 'require|alphaNum',
    ];
}

// 使用验证规则判断输入数据
if (!$this->validate($param, UserValidate::class)) {
    return json(['code' => 1, 'message' => $this->getError()]);
}
  1. 数据库操作

ThinkPHP5在进行数据库操作时,默认会使用 PDO Prepared Statement 来防止 SQL 注入攻击。

示例:

use think\Db;

// 查询用户信息
Db::name('user')
    ->where('username', $username)
    ->where('password', md5($password))
    ->find();
  1. 模板变量输出

ThinkPHP 5 使用 Twig 模板引擎,在默认情况下会自动使用 Twig 的自动转义功能,从而防止 XSS 攻击。

示例:<p>{{ user.name|raw }}</p>  

建议在模板中总是使用 raw 过滤器以防止 XSS 攻击。

总之,对于用户输入数据需要进行必要的过滤和验证,以免受到 SQL 注入、XSS 攻击等漏洞的影响,ThinkPHP 5 提供了多种方式来实现安全输入,开发者可以根据需求选择适当的方式。