PHP和mySQL:什么时候使用htmlentities?

2022-08-30 18:51:19

平台:PHP & mySQL

出于我的实验目的,我自己在自己的网站上尝试了一些XSS注射。考虑这种情况,其中我有我的表单文本区域输入。由于这是一个文本区域,因此我能够输入文本和各种(英语)字符。以下是我的观察:

如果我只应用strip_tags和mysql_real_escape_string,并且在将数据插入数据库之前没有在我的输入中使用 htmlentities,则查询将中断,并且由于异常终止,我会遇到显示表结构的错误。

如果我在将数据插入数据库之前对输入应用strip_tags,mysql_real_escape_string和htmlentities,则查询不会中断,并且我能够成功地将数据从文本区域插入到我的数据库中。

因此,我确实理解必须不惜一切代价使用 htmentities,但不确定何时应该使用它。考虑到上述情况,我想知道:

  1. 什么时候应该使用htmlentities?它应该在将数据插入数据库之前使用,还是以某种方式将数据放入数据库,然后在我试图显示数据库中的数据时应用htmlentities?

  2. 如果我遵循上述B点中描述的方法(我认为这是在我的情况下最明显和最有效的解决方案),那么当我尝试显示数据库中的数据时,我是否仍然需要应用htmlentities?如果是,为什么?如果没有,为什么不呢?我问这个是因为在我浏览了帖子之后,这对我来说真的很困惑:http://shiflett.org/blog/2005/dec/google-xss-example

  3. 然后还有一个PHP函数叫做:html_entity_decode。我可以使用它来显示我的数据库数据(按照B点中指示的过程进行操作后)当我的输入应用了htmlentities时吗?我应该从哪一个中选择:html_entity_decode和htmlentities以及何时?

预览页面:

我认为在这里添加一些特定情况的更具体的细节可能会有所帮助。考虑有一个“预览”页面。现在,当我从文本区域提交输入时,预览页面接收输入并显示 html,同时,隐藏的输入会收集此输入。当点击“预览”按钮上的提交按钮时,隐藏输入中的数据将 POST 到新页面,该页面将隐藏输入中包含的数据插入到数据库中。如果我在表单最初提交时不应用 htmlentities(但只应用strip_tags和mysql_real_escape_string),并且文本区域中存在恶意输入,则隐藏输入将被破坏,隐藏输入的最后几个字符在页面上明显可见,这是不希望的。因此,牢记这一点,我需要采取一些措施来在“预览”页面上正确保存隐藏输入的完整性,同时收集隐藏输入中的数据,以免破坏它。我该怎么做?对于延迟发布此信息,我们深表歉意。" />

提前感谢您。


答案 1

这是一般的经验法则。

在最后可能的时刻转义变量。

您希望变量是数据的干净表示形式。也就是说,如果您尝试存储名为“O'Brien”的人的姓氏,那么您绝对想要这些:

O'Brien
O\'Brien

..因为,嗯,这不是他的名字:里面没有&符号或斜杠。当您获取该变量并将其输出到特定上下文中时(例如:插入到SQL查询中,或打印到HTML页面),那就是您修改它的时候。

$name = "O'Brien";

$sql = "SELECT * FROM people "
     . "WHERE lastname = '" . mysql_real_escape_string($name) . "'";

$html = "<div>Last Name: " . htmlentities($name, ENT_QUOTES) . "</div>";

您永远不希望在数据库中存储 -编码的字符串。当您想要生成CSV或PDF或任何HTML时会发生什么?htmlentities

保持数据整洁,并且仅针对当前的特定上下文进行转义。


答案 2
  1. 仅在您将值(无论是从DB还是从$ _GET / $ _POST)打印到HTML之前。htmlentities与数据库无关。
  2. B是矫枉过正。在插入到 DB 之前,您应该mysql_real_escape_string,在打印到 HTML 之前,应先mysql_real_escape_string。您不需要剥离标签,在htmlentities标签之后,标签将在屏幕上显示为<b r / > e.t.c

从理论上讲,您可以在插入到DB之前进行htmlentities,但是如果您需要原始文本,这可能会使进一步的数据处理变得更加困难。

3. See above

推荐