1

我正在开发一个应用程序,并且正在阅读有关实施安全措施的信息。我设置了一个类来自动生成表单元素,并且该类在 html 中嵌入了 php 字符串变量来创建字段。但是,我注意到 htmlspecialchars() 在我去实现它时并不是必需的。所以我试图伪恶意地把它变成:

<input type="text" name="email">... rest of html

进入:

<input type="text" name="email"><br><br>

但是,在使用 htmlspecialchars() 之前和之后,当我尝试编辑前端 html 时,我的浏览器都会给我这个:

<input type="text&quot; name=&quot;email&quot;&gt;&lt;br&gt;&lt;br&gt;

这只是自动实现的东西吗?如果是这样,这是来自 PHP 更新(我想我发现它是 PHP 5.4 中的更新)?

此外,我可以放弃使用 htmlspecialchars() 吗?

谢谢!

编辑:要求提供更多信息

$this->type = 'text' //what I would normally use
$this->type = 'text" name="name"><br><br>' //my attempt to manipulate the html
$output = "<input type='$this->type' name='$this->name'";
$output .= ... close the tag, etc.
echo $output;
4

2 回答 2

4

每当您获取一些文本并将其作为字符串插入到某些 HTML 中时,都需要使用htmlspecialchars(除非您知道该文本不会包含任何在 HTML 中具有特殊含义的字符,但即便如此,使用htmlspecialchars也是一个好习惯) .

我无法解释为什么您的未指定输入在运行未指定代码然后运行浏览器解析器(具有错误恢复功能)时会为您提供该输出。


问题更新后:

$this->type = 'text" name="name"><br><br>' //my attempt to manipulate the html
$output = "<input type='$this->type' name='$this->name'";

您的属性值用'字符分隔。您的数据不包含任何'字符,因此它不会终止属性值并转义。

于 2013-07-12T06:01:35.320 回答
2

试试这个操作:

$this->type = 'text\' name="name"><br><br>' //my attempt to manipulate the html

它应该破坏您的 HTML,因为您的属性值的分隔符是单引号,现在它们也出现在您的属性文本中。

请确保不要使用任何复杂的 DOM 检查器,例如 firebug,而是查看服务器发出的纯源代码。

于 2013-07-12T07:32:41.630 回答