Php 安全措施——何时和如何采取

Php 安全措施——何时和如何采取,php,mysql,security,web-applications,Php,Mysql,Security,Web Applications,目前,我正在升级一个web应用程序,在该应用程序中,我将从登录的用户那里获得大部分输入。输入将包含有效的html、图像、音频、视频和上传工具,并上传到用户定义的路径。然后应用程序将其格式化为漂亮的ui并显示给最终用户。这些特权用户可以使用基于web的界面添加/修改/删除内容 根据基本经验法则:我应该在进入数据库之前转义我的数据,而不是从用户那里接收数据。为了实现这一目标,我计划采取以下安全措施。这也包括我的问题 我使用准备好的语句将所有用户输入存储到数据库中。我希望这可以消除DB注入的威胁。

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

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

  • 我使用准备好的语句将所有用户输入存储到数据库中。我希望这可以消除DB注入的威胁。
    • 这措施够吗?或者我需要为mysql
      之类的查询检查%和uu符号吗
  • 用户输入(让我们调用输入A),在我不需要任何HTML/css的地方,我在插入DB之前使用
    strip_标记
    &
    htmlentities
    • 这是否足够?我应该用更多吗
  • 用户输入(让我们调用input B),其中用户可以有html/css标记,I user
    htmlentities
    在文本上,然后插入到DB中。
    • 据我所知,在插入数据库之前,我不应该使用
      htmlentities
      ,但必须使用,因为以前的程序员正在使用它。这有什么负面影响吗
  • 从数据库中获取数据后,在显示输入A/B之前,我没有做任何预处理,假设添加到数据库中的数据应该是干净的。
    • 我应该在显示之前处理/清理数据吗?如果是,那怎么办
  • 我想通过浏览器解析用户输入的html标记,而不是显示给用户。e、 g.如果用户输入了

    你好

    世界

    ,我希望用户只看到两个单词,而不是实际的文本。
    • 为了实现这一点,我如何确保用户不添加恶意脚本,同时浏览器正确地存储、获取和解析html标记

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

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

    • 在哪一点应用哪一种确切的安全措施?(例如,插入数据库前的转义字符串)
    • 在每一点上,php中可用的函数是什么?(例如,要转义字符串,请使用准备好的语句)
  • 是的,预先准备好的语句可以很好地防止SQL注入问题。是的,您必须处理
    %
    类似的
    查询中,准备好的语句无法逃避它们,因为它无法知道您是否需要这些值

  • 到5.:将数据转义到数据库中,以其在输出时指定的格式保存,这始终是一个坏主意。为什么?首先,为什么您总是在HTML上下文中使用数据?也许将来您将以不同的格式使用它,然后您将拥有垃圾数据。(在您的例子中,这是更假设的,因为您显式地存储HTML。)

    第二,您的输出代码必须依赖于您的输入代码来正确地预先转义数据,可能在输入和输出之间有很长的时间。您的输出代码可能对输入代码是否正确完成了输出代码所需的任务没有信心。因此,输出转义必须在输出时发生。不早不晚

    第三(这是一个词吗?),
    strip_标记
    绝对不足以接受某些HTML,但不能接受其他“不安全”的HTML。您需要一个比
    strip\u tags
    更复杂的库,该库具有更复杂的白名单规则。据推测,唯一能做到这一点的图书馆是。我会通过它运行所有用户HTML

  • 总结如下:

  • 准备好的发言
  • 输出时不应包含文本HTML的HTML转义数据
  • 通过HTML净化器运行任何应该包含文本HTML的数据。在插入数据库之前还是之后执行此操作取决于您自己,这取决于您是否要存储用户发送给您的文字输入,或者您是否介意立即丢弃原始数据,而只存储经过清理的数据。但是,关于对输出代码有信心的警告同样适用

  • 请注意,预处理语句的第一个目标不是阻止SQL注入,而是非常有用的。@Debflav。是的,我完全同意。它有助于创建与数据库无关的应用程序。但我一直使用mysql,它也帮助我转义数据。对于“5”,您可以使用。谢谢您快速详细的回答。用html标签(选项3)安全地显示用户给定的输入的最佳方法是什么(是否清理一个合适的单词?)?我想我用html净化器回答了这个问题。。。?如果数据不应该包含HTML,则对其进行转义(
    htmlspecialchars
    ),这将删除任何特殊的HTML含义。如果它应该包含HTML,那么请清理该HTML以确保它不包含任何恶意代码(HTML净化器)。。。我还不够清楚。我应该问一下,在没有额外库的情况下,保护数据的方法是什么?我的意思是如何使用纯php函数(我能确定它以前一定做过吗)?据我所知,没有安全的方法来清理php中内置的HTML。