安全措施 - 何时以及如何

时间:2014-04-02 10:17:47

标签: php mysql security web-applications

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

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

  1. 我正在使用预准备语句将所有用户输入存储到DB。我希望这可以消除数据库注入威胁。
    • 这个措施够吗?或者我是否需要检查%和_符号以及mysql LIKE查询?
  2. 用户输入(让我们调用输入A),我不期待任何HTML / CSS,我使用strip_tags&插入DB之前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标记。

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

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

    • 在哪个确切的位置应用哪种确切的安全措施? (例如,在插入DB之前转义字符串)
    • 在每一点上,php中可用的功能是什么? (例如,使用准备好的语句转义字符串)

1 个答案:

答案 0 :(得分:3)

  1. 是的,准备好的语句非常适合防止SQL注入问题。是的,您必须在%个查询中处理_LIKE,准备好的语句无法逃脱它们,因为它无法知道您是否想要那些价值观与否。

  2. 到5:将数据转移到数据库中以获取输出目的地的格式总是一个坏主意。为什么?首先,为什么你总是要确保在HTML上下文中使用数据?也许你将来会以不同的格式使用它,然后你会有垃圾查看数据。 (在您的情况下,这是更假设的,因为您明确存储HTML。)

    其次,您的输出代码必须依赖您的输入代码才能提前正确转发数据,可能需要在输入和输出之间保持较长时间。输出代码对输出代码所需的输入代码执行正确的工作无疑。因此,输出转发必须在输出时进行。不久,不迟。

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

  3. 总结:

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