一尘不染

PHP和mySQL:何时确切使用htmlentities?

mysql

平台: PHP和mySQL

出于实验目的,我在自己的网站上尝试了很少的XSS注入。考虑这种情况,我可以输入表单textarea。由于这是一个文本区域,因此我可以输入文本和各种(英文)字符。这是我的观察结果:

一个)。如果仅在将数据插入数据库之前才应用strip_tags和mysql_real_escape_string并且不对输入使用htmlentities,
则查询将中断 ,由于异常终止,我会遇到一个错误,该错误显示了我的表结构。

B)。如果我在将数据插入数据库之前就在输入上应用strip_tags,mysql_real_escape_string和htmlentities,
则查询不会中断, 并且能够将textarea的数据成功插入数据库。

因此,我的理解是,必须不惜一切代价使用htmentity,但不确定何时确切使用它。考虑到以上几点,我想知道:

  1. 何时确切使用htmlentities?当我试图从数据库中显示数据时,是否应该在将数据插入数据库之前使用它,或者以某种方式将数据获取到数据库中,然后应用htmlentities?

  2. 如果我遵循上面B点中所述的方法(我认为这是我看来最明显,最有效的解决方案),当我试图显示数据库中的数据时,是否仍需要应用htmlentities?如果是这样,为什么?如果没有,为什么不呢?我问这个问题是因为在我浏览了以下文章后,这真的使我感到困惑:http : //shiflett.org/blog/2005/dec/google-xss-example

  3. 然后是另一个名为PHP的函数: html_entity_decode 。当在输入上应用htmlentities时,是否可以使用它来显示来自DB的数据(按照B点所示的步骤进行操作)?我应该从哪一个中选择html_entity_decode和htmlentities以及何时使用?

预览页:

我认为在此处添加一些特定情况的更多详细信息可能会有所帮助。考虑有一个“预览”页面。现在,当我从文本区域提交输入时,“预览”页面将接收输入并将其显示为html,同时,隐藏的输入将收集此输入。当单击“预览”按钮上的“提交”按钮时,隐藏输入中的数据将POST到新页面,并且该页面将隐藏输入中包含的数据插入到数据库中。如果在初次提交表单时不应用htmlentities(但仅应用strip_tags和mysql_real_escape_string),并且在文本区域中存在恶意输入,则隐藏的输入将被破坏,并且隐藏输入的最后几个字符将被视为
" />在页面上,这是不可取的。因此,请记住这一点,我需要做一些事情以在“预览”页面上适当地保留隐藏输入的完整性,并在隐藏输入中收集数据,以免破坏数据。我该怎么办?抱歉延迟发布此信息。

先感谢您。


阅读 211

收藏
2020-05-17

共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>";

您永远不需要htmlentities在数据库中存储编码字符串。当你想生成CSV或PDF,或任何其会发生什么事 是不是 HTML?

保持数据整洁,仅在当前特定情况下转义。

2020-05-17