安全措施 - 何时以及如何


Security measures - when and how

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

根据基本的经验法则:我应该在进入数据库之前转义我的数据,而不是接收从用户接收的数据。为了实现这一目标,我计划遵循以下安全措施。其中还包括我的问题

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


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

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

  • 在哪个确切点应用哪种确切的安全措施?(例如,在插入数据库之前进行转义字符串)
  • 在每一点上,php中可用的功能是什么?(例如,使用预准备语句转义字符串)
  1. 是的,预准备语句非常适合防止 SQL 注入问题。是的,您必须在LIKE查询中处理%_,预准备语句无法转义它们,因为它无法知道您是否希望这些值在那里。

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

    其次,您的输出代码

    必须依靠输入代码来正确提前转义数据,输入和输出之间可能需要很长时间。您的输出代码无法确信输入代码是否完成了输出代码需要它执行的正确工作。因此,输出转义必须在输出时发生。不早不宜迟。

    第三(这是一个词吗?),strip_tags绝对不足以接受某些HTML,但不能接受其他"不安全"的HTML。您需要一个更复杂的库,该库具有比strip_tags更复杂的白名单规则。据说唯一这样做的库是HTML净化器。我会通过它运行所有用户 HTML。

总结一下:

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