平台:
PHP和MySQL

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

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

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

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

  • 什么时候应该确切使用htmlentities?当我试图显示数据库中的数据时,是否应该在将数据插入数据库中之前使用它,或者以某种方式将数据获取到数据库中,然后应用htmlentities?
  • 如果我遵循上述B点中所述的方法(我认为这是我看来是最明显,最有效的解决方案),那么当我尝试显示数据库中的数据时,我仍然需要应用htmlentities吗?如果是这样,为什么?如果没有,为什么不呢?我问这个问题是因为在我浏览了http://shiflett.org/blog/2005/dec/google-xss-example
  • 中的帖子后,这真的让我感到困惑
  • 然后还有另一个名为PHP的函数: html_entity_decode 。当在输入上应用了htmlentities时,是否可以使用它来显示来自DB的数据(按照B点所示的步骤进行操作)?我应该从哪一个中选择html_entity_decode和htmlentities以及何时使用?

  • 预览页:

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

    先感谢您。

    最佳答案

    这是一般的经验法则。



    您希望变量是数据的清晰表示。也就是说,如果您要存储名为“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格式的内容时会发生什么?

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

    关于php - PHP和MySQL : When exactly to use htmlentities?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2077576/

    10-16 14:53