理解推理只是一个基本的新手问题。为什么要使用Yii2中提供的HTML帮助程序,或者如果我们的HTML技能很强,我们就不能只键入标记。
实施例: 从基本观点看......
<h1><?= Html::encode($this->title) ?></h1>
为什么我不能只输入...
<h1>My Title</h1>
答案 0 :(得分:4)
这真的取决于你。
但是使用框架帮助程序,窗口小部件和编码样式,您可以保持代码一致性,减少错误,错误甚至降低安全风险。
使用你的例子。
想象一下,$this->title
设置为主布局文件中用户的名称:
<?php $this->title = $user->name; ?>
<h1><?= $this->title ?></h1>
现在,让我们想象用户设法在注册表单中将用户名设置为<script>console.log('I can steal your cookies now!');</script>NotAHacker
(也是因为您决定直接保存到数据库而不是使用框架)。
这将呈现以下内容:
<h1><script>console.log('I can steal your cookies now!');</script>NotAHacker</h1>
你会看到这个:
在javascript控制台中会出现I can steal your cookies now!
这是一个重大的安全风险!那里的坏人可以窃取你的cookies信息,记录活动,窃取密码等。
但是,使用框架方式可以很容易地解决这个问题。
<?php $this->title = $user->name; ?>
<h1><?= Html::encode($this->title) ?></h1>
这将呈现:
<h1><script>console.log('I can steal your cookies now!');</script>NotAHacker</h1>
你会看到:
但什么都不会被执行!
那么,重点是什么?像Yii2这样的框架会开发他们的帮助器和小部件,这样你就可以相信他们在使用他们的方法时不会发生任何不好的事情(因为如果遇到编码问题,你会喜欢这个助手类)。这在生产环境中是至关重要的,当你有很多变量并且你不能让任何东西从手指中滑落时。
TL; DR: 如果您信任您的框架,请尽可能使用他们的可用方法。
答案 1 :(得分:0)
首先,您不会使用动态title
属性,而是硬编码字符串。
其次,如果您在视图中使用变量或属性输出,那么使用Html::encode()
帮助程序将防止跨边脚本(XSS)攻击,因为变量中的任何HTML都将在输出之前进行转义。
答案 2 :(得分:0)
这是为了防止XSS攻击。
如果数据不适合用户客户端,则可以控制它。例如date
或<?php
echo $title;
?>
,...您可以安全地回应它:
<?php
$title = "<h1><script>alert(1);</script>Hi!</h1>";
echo \yii\helpers\Html::encode($title);
?>
如果用户输入数据并且是任何内容,则必须对其进行编码:
<h1><script>alert(1);</script>Hi!</h1>
输出:“<h1><script>alert(1);</script>Hi!</h1>
”
并在浏览器中显示:“<?php
$title = "<h1><script>alert(1);</script>Hi!</h1>";
echo \yii\helpers\HtmlPurifier::process($title);
?>
”(不执行且安全)
但是,如果您想从用户那里获取HTML数据并希望确保它是安全的,请使用以下代码:
<h1>Hi!</h1>
输出:“Hi!
”
并在浏览器中显示:“script
”(执行此代码但您可以看到删除{{1}}标记以及其他存在安全风险的内容。因此它是安全的。)