yii2-为什么使用yii\helpers\Html而不只是键入

yii2-为什么使用yii\helpers\Html而不只是键入,html,yii2,Html,Yii2,只是一个基本的新手问题来理解推理。为什么要使用Yii2中提供的HTML帮助程序,或者如果我们的HTML技能很强,我们就不能直接键入标记 例如: 从基本视图中可以看到 <h1><?= Html::encode($this->title) ?></h1> 为什么我不应该只是打字 <h1>My Title</h1> 我的标题 首先,您不会使用动态标题属性,而是硬编码字符串。 其次,如果您使用变量或属性在视图中输出,那么使用Htm

只是一个基本的新手问题来理解推理。为什么要使用Yii2中提供的HTML帮助程序,或者如果我们的HTML技能很强,我们就不能直接键入标记

例如: 从基本视图中可以看到

<h1><?= Html::encode($this->title) ?></h1>

为什么我不应该只是打字

<h1>My Title</h1>
我的标题

首先,您不会使用动态
标题
属性,而是硬编码字符串。
其次,如果您使用变量或属性在视图中输出,那么使用
Html::encode()
帮助程序将防止跨端脚本(XSS)攻击,因为变量中的任何Html都将在输出之前转义。

首先,您不会使用动态
title
属性,而是硬编码字符串。 其次,如果您使用变量或属性在视图中输出,那么使用
Html::encode()
帮助程序将防止跨端脚本(XSS)攻击,因为变量中的任何Html都将在输出之前转义。

这完全取决于您自己

但是使用框架助手、小部件和编码样式,您可以保持代码的一致性,减少错误、bug,甚至降低安全风险

用你的例子

假设
$this->title
设置为主布局文件中的用户名:

<?php $this->title = $user->name; ?>

<h1><?= $this->title ?></h1>
这将导致:

<h1>&lt;script&gt;console.log(&#39;I can steal your cookies now!&#39;);&lt;/script&gt;NotAHacker</h1>
scriptconsole.log(';我现在可以偷你的饼干了!';)/脚本黑客
你会看到:

log('我现在可以偷你的饼干!');黑客 但是什么都不会被执行

那么,重点是什么?像Yii2这样的框架开发了它们的helpers和widget,这样您就可以信任它们,在您使用它们的方法时不会发生任何不好的事情(因为如果您遇到编码问题,您会喜欢这个helpers类)。这在生产环境中是至关重要的,因为您有很多变量,不能让任何东西从手指间溜走

TL;DR:如果您信任您的框架,请随时使用他们可用的方法。

这完全取决于您自己

但是使用框架助手、小部件和编码样式,您可以保持代码的一致性,减少错误、bug,甚至降低安全风险

用你的例子

假设
$this->title
设置为主布局文件中的用户名:

<?php $this->title = $user->name; ?>

<h1><?= $this->title ?></h1>
这将导致:

<h1>&lt;script&gt;console.log(&#39;I can steal your cookies now!&#39;);&lt;/script&gt;NotAHacker</h1>
scriptconsole.log(';我现在可以偷你的饼干了!';)/脚本黑客
你会看到:

log('我现在可以偷你的饼干!');黑客 但是什么都不会被执行

那么,重点是什么?像Yii2这样的框架开发了它们的helpers和widget,这样您就可以信任它们,在您使用它们的方法时不会发生任何不好的事情(因为如果您遇到编码问题,您会喜欢这个helpers类)。这在生产环境中是至关重要的,因为您有很多变量,不能让任何东西从手指间溜走


TL;DR:如果您信任您的框架,请随时使用它们可用的方法。

这是为了防止XSS攻击

如果数据不是针对用户客户端的,并且您可以对其进行控制。例如
id
date
。。。您可以安全地回显:

<?php
echo $title;
?>
输出:“
Hi!


并在浏览器中显示它:“
Hi!
”(执行此代码,但您可以看到删除
脚本
标记和其他一些存在安全风险的内容。因此它是安全的。)

这是为了防止XSS攻击

如果数据不是针对用户客户端的,并且您可以对其进行控制。例如
id
date
。。。您可以安全地回显:

<?php
echo $title;
?>
输出:“
Hi!


并在浏览器中显示:“
Hi!
”(执行此代码,但您可以看到删除
script
tag和其他一些存在安全风险的内容。因此它是安全的。)

因此,无论我在何处看到此-Html::encode($this->title)(gii生成的所有视图),我是否应该用硬编码的标题替换?如果我没弄错的话,出于安全考虑,我应该使用助手,是吗?如果我在做一个常规的、没有变量的链接或其他什么,我只是硬编码?那么无论我在哪里看到这个-Html::encode($this->title)(所有由gii生成的视图),我都应该用硬编码的标题替换吗?如果我没弄错的话,出于安全考虑,我应该使用助手,是吗?如果我在做一个常规的、没有变量的链接或其他事情,我只需要硬编码?如果我知道链接或图像的路径,并且不使用变量,那么只编写一个链接或标记会更高效/更快吗?当然,不用php编写会更快。毫无疑问,这样简单的事情可以更快更好地直接编写。如果我知道链接或图像的路径,并且不使用变量,只编写一个或标记会更高效/更快吗?当然,不使用php编写会更快。毫无疑问,这样简单的事情直接写起来更快更好。
<?php
$title = "<h1><script>alert(1);</script>Hi!</h1>";
echo \yii\helpers\HtmlPurifier::process($title);
?>