如何限制使用 PHP 将 JavaScript 脚本插入数据库?

Posted

技术标签:

【中文标题】如何限制使用 PHP 将 JavaScript 脚本插入数据库?【英文标题】:How to rescrict a JavaScript script being inserted in the database with PHP? 【发布时间】:2011-01-01 06:17:08 【问题描述】:

我有一个关于 php 中的数据插入的问题。

在我的网站上有一个消息系统。

因此,当我的收件箱加载时,它会发出一个 javascript 警报。

我在我的网站上搜索了很多,最后我发现有人给我发了一条带有以下文字的消息。

<script>
  alert(5)
</script>

那么如何限制插入到我的数据库中的脚本代码呢?

我在 PHP 上运行。

【问题讨论】:

【参考方案1】:

将 JavaScript 代码存储在数据库中没有问题。实际问题是从数据库中获取非 html 内容并像 HTML 一样显示给用户。正确的方法是确保您的渲染代码将文本视为文本,而不是 HTML。

在 PHP 中,这将通过在显示收件箱时在收件箱内容上调用 htmlspecialchars 来完成(可能连同 nl2br 并可能将链接转到 &lt;a&gt; 标签)。

避免将striptags 用于文本内容:作为用户,我可能想输入如下消息:

... and to create a link, use <a href="your-url-here">your-text-here</a> ...

striptags 将消除标记,htmlspecialchars 将使文本显示为键入时。

【讨论】:

是的,但我使用第二个参数将一些 HTML 标记列入白名单。所以,它会允许一些标签,如

和 ,它会删除

【参考方案2】:

你不应该限制它被插入到数据库中(如果 *** 会限制它,我们将无法在这里发布代码示例!)

您应该更好地控制如何显示它。例如,将htmlentities()htmlspecialchars() 添加到您的echo 呼叫中。

【讨论】:

【参考方案3】:

这称为 XSS。 SO上有很多关于它的主题。

How to prevent XSS with HTML/PHP? What are the best practices for avoid xss attacks in a PHP site? XSS Attacks Prevention Is preventing XSS and SQL Injection as easy as does this…?

【讨论】:

这里只是迂腐,但这不是必要 XSS。这只是脚本注入,可以用于 XSS 和许多其他讨厌的事情。【参考方案4】:

您应该使用strip_tags如果你还想允许一些 HTML,那么在第二个参数中添加一个白名单。

我应该在这里添加一个非常重要的警告。如果您在 strip_tags 白名单中留下任何标签,您仍然容易受到 javascript 注入的影响。假设您允许使用看似无害的标签 &lt;strong&gt;&lt;em&gt;

Strip tags will still allow all attributes, including event handlers
like <strong onmouseover="window.href=http://mydodgysite.com">this</strong>.

你有几个严肃的选择:

strip_tags 没有白名单。安全,但不允许任何格式,并且可能会导致字符串出现问题,如下所示:"x&lt;y, but y&gt;4" --&gt; "x4" htmlentities。在屏幕上显示数据时使用它(而不是在将数据放入数据库之前)。它是安全的,但不允许格式化。 与 HTML 不同的标记系统,例如:Markdown、Wiki markup、BB Code。需要渲染才能转换回 HTML,但它大多是安全的,而且非常灵活。

【讨论】:

是的,这是防止脚本注入的好信息......非常感谢,我会记住的......【参考方案5】:

用户输入在输出之前应该被转义。

每当您显示用户提交的内容时,首先通过htmlspecialchars() 运行它。这会将 HTML 代码转换为安全输出。

【讨论】:

【参考方案6】:

看看htmlspecialchars() 函数。它将 ' " 和 & 转换为它们的 html 实体等效项,这意味着 &amp;lt;script&amp;gt; 将变为 &amp;lt;script&amp;gt;

【讨论】:

【参考方案7】:

您可以使用strip_tags()。此函数的第二个参数将允许您列出允许的标签的明确列表:

// Allow <p> and <a>, <script> will be stripped
echo strip_tags($text, '<p><a>');

你也可以考虑htmlspecialchars(),它将&amp;lt;之类的字符转换为&amp;lt;,导致浏览器将它们解释为文本,而不是代码:

$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
echo $new; // &lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;

【讨论】:

【参考方案8】:

如果我没听错的话,您只是在寻找两个简单的命令:

$message = str_replace($message, "<", "&lt;");
$message = str_replace($message, ">", "&gt;");

【讨论】:

所以之后我会回显脚本代码,它会再次发出警报,所以最好从 db 值中删除脚本标签......你对这种情况的看法...... ?

以上是关于如何限制使用 PHP 将 JavaScript 脚本插入数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 wordpress 博客与网站页眉和页脚设计集成到 php 网站博客页面?

将 JavaScript 值传递给 PHP 变量(有限制)

如何将页脚固定在页面底部

如何使用 JavaScript 限制最小值/最大值之间的数字?

页脚总是在底部不显示:固定

如何使用jQuery / javascript将事件处理限制为每X秒一次?