我需要在输入字段中转义 html 输出吗?

Do I need to escaping html output in input field?

在我的数据库中,我有数据,例如这样的代码:<script type="text/javascript">alert('Xss done');</script>

我从数据库中获取数据,我需要将它们填充到输入字段中。然后我的用户可以编辑代码。我混淆了我是否需要在我的输入字段中转义 javascript 代码,因为我知道如果你用 <label><p> 元素等显示它,你只需要转义它

但现在我收到了带有该代码的警告框。我应该逃避它吗?如果是,那么我如何正确地转义它,因为我使用此代码 htmlspecialchars($user_input, ENT_QUOTES) 并且输入字段中的 javascript 代码成功地变成了此 &lt;script type=&quot;text/javascript&quot;&gt;alert(&#039;Xss done&#039;);&lt;/script&gt; 但我仍然收到警告框? ?

请帮助我,谢谢。

您使用 htmlspecialchars() 的权利。这是一个有效的例子:

<input type="text" value="<?php
    echo htmlspecialchars('<script type="text/javascript">alert("Xss done");/script>')
?>"/>

哪个produces

<input type="text" value="&lt;script type=&quot;text/javascript&quot;&gt;alert(&quot;Xss done&quot;);&lt;/script&gt;"/>

这将按原样显示带有文本的 <input> 字段(包括 <scripts> 标记)并且不会触发任何警报。 default flags ENT_COMPAT | ENT_HTML401 for htmlspecialchars() 应该没问题。

Do I need to escaping html output in input field?

是的,每个输入都必须转义。特别是如果它来自用户。你永远不应该相信用户的输入。

htmlspecialchars 有一些错误,您不能在它的第二个和第三个参数中直接包含字符串。因此需要一种解决方法。 从 PHP 5.4+ 开始,默认字符集是 UTF-8 之前是 ISO-8859-1

ENT_IGNORE 只会丢弃所有无效代码。这很糟糕,原因有二:首先,您不会注意到无效编码,因为它会被简单地丢弃。其次,这会带来一定的安全风险

ENT_SUBSTITUTE 是一个新的替代选项,它在问题上有更明智的方法:不是仅仅删除代码单元,而是将它们替换为 Unicode 字符 (U+FFFD)。因此无效的代码单元序列将被替换为 � 个字符。

/**
 * htmlspecialchars fix|hack. Well done PHP, well done...
 */
define('CHARSET', 'UTF-8');
define('REPLACE_FLAGS', ENT_QUOTES | ENT_SUBSTITUTE);

function filter($string = null)
{
    return htmlspecialchars($string, REPLACE_FLAGS, CHARSET);
}

有关如何防止 XSS、SQL 注入的更多信息,请参阅以下链接: https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet How can I prevent SQL injection in PHP?