【问题标题】:Security measures - when and how安全措施 - 何时以及如何
【发布时间】:2014-05-13 13:12:23
【问题描述】:

目前我正在升级一个 Web 应用程序,我将从登录用户那里获得大部分输入。输入将包含有效的 html、图像、音频、视频和上传工具到用户定义的路径。然后应用程序将其格式化为漂亮的 ui 并显示给最终用户。这些特权用户可以使用基于 Web 的界面添加/修改/删除内容。

根据基本经验法则:我应该在进入数据库之前转义我的数据,而不是接收来自用户的数据。为此,我计划采取以下安全措施。其中也包括我的问题

  1. 我正在使用准备好的语句将所有用户输入存储到 DB。我希望这消除了数据库注入威胁。
    • 这个措施够吗?还是我需要检查 % 和 _ 符号以及 mysql LIKE 查询?
  2. 用户输入(让我们调用输入 A),我不期待任何 HTML/css,我在插入 DB 之前使用 strip_tagshtmlentities
    • 这是足够的措施吗?我应该使用更多
  3. 用户输入(让我们调用输入 B),其中用户可以有 html/css 标签,我在文本上使用 htmlentities 然后插入 DB。
    • 据我所知,在插入数据库之前我不应该使用htmlentities,但必须像以前的程序员那样使用它。这有什么负面影响吗?
  4. 在从 DB 获取之后,在显示输入 A / 输入 B 之前,我没有做任何预处理,假设添加到 DB 的数据应该是干净的。
    • 我应该在显示之前处理/清理数据吗?如果是,那么如何?
  5. 我想将用户输入的 html 标签由浏览器解析而不显示给用户。例如如果用户输入了<p style='color:red;'>hello</p><p class='noclass'>world</p>,我希望用户只看到 2 个单词而不是实际文本。
    • 要实现这一点,我如何确保用户不添加恶意脚本,同时浏览器正确存储、获取和解析 html 标签。


请指导当前的方法是否足够/不足够/更少/不正确。 我既不是 php 的 100% 新手,也不是专业人士。我知道有关 php(或者我们可以说是所有 Web 应用程序)安全性的基础知识。因此,如果我在安全方面犯了任何错误,或者不应该做某事,或者应该或多或少做某事,有人可以指导我。

我知道安全的基础知识,但我仍然对此感到困惑

  • 在哪个确切点应用哪个确切的安全措施? (例如,在插入数据库之前转义字符串)
  • php 中的每一点都有哪些可用的函数? (例如,转义字符串使用准备好的语句)

【问题讨论】:

  • 请注意,prepared statements 的第一个目标不是防止 SQL 注入,而是非常有用。
  • @Debflav。是的,我完全同意。它有助于创建独立于数据库的应用程序。但我一直使用 mysql,它也可以帮助我转义数据。

标签: php mysql security web-applications


【解决方案1】:
  1. 是的,准备好的语句非常适合防止 SQL 注入问题。是的,您必须在LIKE 查询中处理%_,准备好的语句无法逃避它们,因为它无法知道您是否想要这些值.

  2. 到 5.:将进入数据库的数据转义为输出时指定的格式总是一个坏主意。为什么?首先,为什么你如此确定你总是要在 HTML 上下文中使用数据?也许您将来会以不同的格式使用它,然后您将拥有看起来很垃圾的数据。 (这在您的情况下更具假设性,因为您明确存储 HTML。)

    不过,其次,您的输出代码必须依赖您的输入代码才能提前正确转义数据,输入和输出之间可能需要很长时间。您的输出代码无法确定输入代码是否正确完成了输出代码所需的工作。因此,输出的逃逸必须发生在输出的时候。不早不晚。

    第三(这是一个词吗?),strip_tags 绝对不足以接受某些 HTML,但不能接受其他“不安全”的 HTML。你需要一个更复杂的库,它的白名单规则比strip_tags 可以做的更复杂。据说唯一这样做的图书馆是HTML Purifier。我会通过它运行所有用户 HTML。

总结一下:

  1. 准备好的陈述。
  2. HTML 转义数据不应包含 输出中的文字 HTML
  3. 通过 HTML Purifier 运行任何应该包含文字 HTML 的数据。是否在插入数据库之前或之后执行此操作取决于您是否要存储用户发送给您的文字输入,或者您是否不介意立即丢弃原始数据并仅存储经过清理的数据。但是,关于对输出代码有信心的同样警告也适用。

【讨论】:

  • 感谢您快速详细的回答。安全的最佳方法是什么(清理一个合适的词来使用?)用 html 标签显示用户给定的输入(选项 3)?
  • 我以为我用 HTML Purifier 回答了这个问题...?如果数据不应该包含 HTML,则将其转义 (htmlspecialchars),这将删除任何特殊的 HTML 含义。如果它应该包含 HTML,则清理该 HTML 以确保它不包含恶意代码(HTML Purifier)。
  • 我很抱歉...我不够清楚。我应该问在没有额外库的情况下保护数据的方法是什么?我的意思是如何使用纯 php 函数来完成它(我可以确定它必须以前做过)吗?
  • 据我所知,没有安全的方法来清理 PHP 内置的 HTML。
猜你喜欢
  • 2018-02-24
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多