Wil*_*son 2 php mysql forms escaping
我很想知道如果用户提交表单时正在检索的数据已经被过滤,是否有必要从 MySQL 服务器转义输出。
示例:
1. 用户提交一个包含博客文章评论的表单。
2. 在表单提交时,在将数据发送到 MySQL 服务器之前,他们的输入被过滤FILTER_SANITIZE_SPECIAL_CHARS以防止注入攻击。
3. 一旦数据被发布到服务器,用户将被重新路由到另一个屏幕,在那里他们可以查看他们的评论。
4. 当从服务器(已存储过滤的输入)检索他们的评论时,是否也需要转义此输出?
这是我的主要问题。我正在从表单(对于博客文章)获取用户输入,使用 对其进行清理FILTER_SANITIZE_SPECIAL_CHARS,然后将其发布到 MySQL 服务器。如果我从服务器检索此信息并将其显示在 html 中,则没有问题。但是,我一直在读到您也应该始终从服务器转义输出。所以我用htmlspecialchars(). 现在,我遇到的问题是所有特殊字符(包括括号,以及用户在其帖子中使用的任何引号)都以其转义的 html 格式返回。不是用户友好的。
什么是最好的解决方法,或者如果输出来自服务器并且已经根据用户输入进行了清理,甚至有必要转义它吗?
消毒是不一样的逃避,你应该确保不将两者混为一谈。
消毒正在删除不需要的输入。也就是说,如果用户<script>在他们的输入中添加了一个标签,而您不希望他们的输入包含<script>标签,那么删除该<script>标签就是清理。清理不是为输出上下文转义数据。
转义是为输出上下文正确编码数据。例如,为了防止 HTML 注入,您可以调用 htmlspecialchars()以正确编码&为&. 为防止 SQL 注入,您可能会使用mysqli::real_escape_string()转换'为\'. (虽然这将是高度优选的是使用准备的语句/参数化查询防止具有至约SQL注入或在所有逸出担心。)
重要的是,转义是特定于上下文的。您对 HTML 使用的转义对 SQL 不一定有效或足够(反之亦然,或任何其他输出上下文)。
问题FILTER_SANITIZE_SPECIAL_CHARS在于它的命名很糟糕:它在一个步骤中同时完成,这对您的数据库来说是令人困惑的(因为您的数据库现在具有 html 编码的数据),并且对输出来说是令人困惑的(因为现在您已经有转义的数据容易被多次转义)。
相反,您应该明确地将清理和逃避工作分开。仅清理您不想保留的输入数据。仅转义输出数据,并根据其正确的输出上下文。
您想在数据库中存储原始(输出前转义)数据的原因是,如果您需要输出到不同的上下文(例如,现在您是 dong JSON 输出,或者您需要将其写入文件,或者实际查看原始数据是什么),您无需先对其进行转义。(如果你真的需要,你可以合理地将一个预先转义的副本存储在一个单独的列中,但你应该始终拥有可用的原始数据。)它还使规则变得简单:始终清理输入;总是逃避输出。