当前位置: 首页 > 面试题库 >

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

赵兴朝
2023-03-14
问题内容

平台: 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),并且在文本区域中存在恶意输入,则隐藏的输入将被破坏,并且隐藏输入的最后几个字符将被视为
" />在页面上,这是不可取的。因此,请记住这一点,我需要做一些事情以在“预览”页面上适当地保留隐藏输入的完整性,并在隐藏输入中收集数据,以免破坏数据。我该怎么办?抱歉延迟发布此信息。

先感谢您。


问题答案:

这是一般的经验法则。

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

您希望变量是数据的干净表示。也就是说,如果您要存储名为“ 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?

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



 类似资料:
  • 问题内容: 我正在尝试将时区系统集成到我的应用程序中,直到现在为止,我一直在努力避免制作时区感知的应用程序- 但是它是一项强制性要求,因此别无选择。TimeZones只是在我头上。我已经在PHP.net和其他站点(包括但不限于SO)上阅读了多个主题。但是我永远也无法掌握。 因此,我想知道是否有人可以在这里帮助我:(我想要做的是在我的应用程序中使用偏好选项,以允许用户从选择菜单中选择自己的时区,但是

  • 作为一些背景: 我有一个连接到一个服务器的SocketChannel、SelectionKey...等等。在客户端,如果我想向服务器发送一些东西,我只需将我的数据写入一个ByteBuffer中,并通过套接字通道发送。如果全部都写好了,我就完成了,可以返回到op_read。如果没有写完,我就取剩下的字节,将它们存储在某个地方的“发送”缓冲区中,并在密钥上标记OP_WRITE(替换OP_READ,使其

  • 问题内容: 我对此并不陌生,我真的对如何下载已经成功上传到本地服务器上的文件一无所知。 我上传的脚本是- 问题答案: SomePage.php download.php

  • 问题内容: 我试图遍历一个MySQL对象,并在另一个页面上使用ajax调用来追加数据,但是我无法获取php将有效的JSON返回给回调。 这显然不起作用… 还是这个… 问题答案: 这应该做。另外,您可以使用http://jsonlint.com/查看JSON输出有什么问题。 更新: 使用可能也是一个好主意

  • 问题内容: 对于我的新项目,我想要一种现代的方法,不需要在每个数据库请求上重新加载页面。:)我希望脚本查询数据库并使用查询信息创建表。 我尝试了在互联网上找到的不同脚本。下面的一个最接近我的需求。 index.php getdata.php 但是我只得到一个表,里面有一堆{$ value}。我尝试只用$ value,但是得到了一堆零。 我尝试了一个简单的脚本 然后我得到了som结果,但是使用此脚本

  • 问题内容: 按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 MySQL还是MySQLi哪个更好?又为什么呢 我应该使用哪个? 我的意思是不仅在性能方面,而且在其他任何相关功能方面也更好。 问题答案: 如果您查看MySQL