平台:
PHP和MySQL
出于实验目的,我在自己的网站上尝试了很少的XSS注入(inject)。考虑这种情况,我可以输入表单textarea。由于这是一个文本区域,因此我可以输入文本和各种(英文)字符。这是我的观察结果:
一种)。如果仅在将数据插入数据库之前仅应用strip_tags和mysql_real_escape_string并且不对输入使用htmlentities,则查询将破坏,由于异常终止,我会遇到显示我的表结构的错误。
B)。如果在将数据插入数据库之前刚在输入上应用strip_tags,mysql_real_escape_string和htmlentities,则的查询不会破坏,并且我能够成功地将文本区域中的数据插入到我的数据库中。
因此,我的理解是,必须不惜一切代价使用htmentity,但不确定何时确切使用它。考虑到以上几点,我想知道:
预览页:
我认为在此处添加一些特定情况的更多详细信息可能会有所帮助。考虑有一个“预览”页面。现在,当我从文本区域提交输入时,“预览”页面将接收输入并将其显示为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/