平台:PHP 和 MySQL
出于实验目的,我自己在自己的网站上尝试了一些 XSS 注入。考虑这种情况,我有表单文本区域输入。由于这是一个文本区域,我可以输入文本和各种(英语)字符。以下是我的观察:
A)。如果我在将数据插入数据库之前仅应用 strip_tags 和 mysql_real_escape_string 并且不在输入中使用 htmlentities,查询正在中断由于异常终止,我遇到了显示我的表结构的错误。
B)。如果我在将数据插入数据库之前在输入上应用 strip_tags、mysql_real_escape_string 和 htmlentities,查询没有中断我能够成功地将数据从文本区域插入到我的数据库中。
所以我确实明白必须不惜一切代价使用 htmentities,但不确定何时应该使用它。考虑到上述情况,我想知道:
到底什么时候应该使用 htmlentities?是否应该在将数据插入数据库之前使用它,或者以某种方式将数据放入数据库,然后在我尝试显示数据库中的数据时应用 htmlentities?
如果我遵循上面 B) 点中描述的方法(我认为在我的情况下这是最明显和最有效的解决方案),当我尝试显示来自数据库的数据时,我是否仍然需要应用 htmlentities?如果是这样,为什么?如果没有,为什么不呢?我问这个问题是因为在我看完这篇文章后,这对我来说真的很困惑:http://shiflett.org/blog/2005/dec/google-xss-example http://shiflett.org/blog/2005/dec/google-xss-example
然后还有一个 PHP 函数,名为:html_entity_decode。当 htmlentities 应用于我的输入时,我可以使用它来显示来自数据库的数据(在按照 B 点所示的程序进行操作之后)吗?我应该选择哪一个:html_entity_decode 和 htmlentities?何时?
预览页面:
我认为在这里添加一些特定情况的更具体细节可能会有所帮助。考虑有一个“预览”页面。现在,当我从文本区域提交输入时,预览页面会接收输入并显示 html,同时隐藏的输入会收集该输入。当点击预览按钮上的提交按钮时,来自隐藏输入的数据将被 POST 到新页面,并且该页面将隐藏输入中包含的数据插入到数据库中。如果我在最初提交表单时不应用 htmlentities(但仅应用 strip_tags 和 mysql_real_escape_string)并且文本区域中存在恶意输入,则隐藏输入将被破坏,并且隐藏输入的最后几个字符明显被视为" />
在页面上,这是不可取的。因此,请记住这一点,我需要采取一些措施来在预览页面上正确保留隐藏输入的完整性,同时收集隐藏输入中的数据,以免破坏它。我该怎么办?对于延迟发布此信息表示歉意。
先感谢您。
这是一般的经验法则。
转义变量最后可能的时刻.
您希望变量能够清晰地表示数据。也就是说,如果您尝试存储名为“O'Brien”的人的姓氏,那么您肯定会这样做don't想要这些:
O'Brien
O\'Brien
.. 因为,好吧,那不是他的名字:里面没有&符号或斜杠。当您获取该变量并将其输出到特定上下文中时(例如:插入 SQL 查询或打印到 HTML 页面),that就是当你修改它的时候。
$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 或任何其他内容时会发生什么isn't HTML?
保持数据干净,并且只针对当前的特定上下文进行转义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)