php - 安全措施 - 何时以及如何

标签 php mysql security web-applications

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

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

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


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

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

  • 在哪个具体点应用哪个具体安全措施? (例如,在插入数据库之前转义字符串)
  • 在每一点上,php 中可用的函数是什么? (例如,要转义字符串,请使用准备好的语句)

最佳答案

  1. 是的,准备好的语句非常适合防止 SQL 注入(inject)问题。是的,你必须在 LIKE 查询中处理 %_,准备好的语句无法逃脱它们,因为它无法知道无论您是否想要这些值。

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

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

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

总结一下:

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

关于php - 安全措施 - 何时以及如何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22808301/

相关文章:

javascript - 如何通过codemirror为页面制作php预览功能

php - 从子查询进行查询

php - Lumen Illuminate Http 客户端请求无法解析的依赖关系

java - 确保微服务 Spring Cloud 安全 Oauth2

python - 保护 google app engine 数据存储区中的数据

php - 空值 MySQL

php - PHP 脚本中的 Select 语句

php - cpanel升级到mariadb后我无法连接到数据库

php - 如果在 sql 排序后显示的项目可以限制数量?或者不显示 INT 小于给定数量的项目?

java - 随着美国国家安全局数据窥探的曝光,应用程序开发人员可以做些什么来防止这种情况发生?