- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
平台:PHP & MySQL
出于实验目的,我在自己的网站上亲自尝试了一些 XSS 注入(inject)。考虑这种情况,我有我的表单文本区域输入。由于这是一个文本区域,我可以输入文本和各种(英文)字符。以下是我的观察:
一个)。如果我只应用 strip_tags 和 mysql_real_escape_string 并且在将数据插入数据库之前不在我的输入上使用 htmlentities,查询中断并且我遇到显示我的表结构的错误,由于异常终止。
B).如果我在将数据插入数据库之前在我的输入上应用 strip_tags、mysql_real_escape_string 和 htmlentities,查询不会中断,并且我能够成功地将数据从 textarea 插入到我的数据库中。
所以我明白 htmentities 必须不惜一切代价使用,但不确定什么时候应该使用它。考虑到上述情况,我想知道:
什么时候应该使用 htmlentities?它应该在将数据插入数据库之前使用,还是以某种方式将数据放入数据库,然后在我尝试显示来自数据库的数据时应用 htmlentities?
如果我按照上面 B) 点中描述的方法(我认为这是我的案例中最明显和最有效的解决方案),当我尝试显示来自D B?如果是这样,为什么?如果不是,为什么不呢?我问这个是因为在我浏览了以下位置的帖子后,它真的让我感到困惑:http://shiflett.org/blog/2005/dec/google-xss-example
还有一个 PHP 函数叫做:html_entity_decode。当 htmlentities 应用于我的输入时,我可以使用它来显示来自 DB 的数据(按照 B 点中指示的程序进行操作后)吗?我应该从 html_entity_decode 和 htmlentities 中选择哪一个?
预览页面:
我认为在此处添加特定情况的一些更具体的细节可能会有所帮助。考虑到有一个“预览”页面。现在,当我从文本区域提交输入时,预览页面会接收输入并将其显示为 html,同时,隐藏的输入会收集此输入。当点击预览按钮上的提交按钮时,来自隐藏输入的数据被发布到一个新页面,并且该页面将隐藏输入中包含的数据插入到数据库中。如果我在最初提交表单时没有应用 htmlentities(但仅应用 strip_tags 和 mysql_real_escape_string)并且在文本区域中存在恶意输入,则隐藏输入被破坏并且隐藏输入的最后几个字符可见为 “/>
在页面上,这是不可取的。所以记住这一点,我需要做一些事情来在预览页面上正确地保留隐藏输入的完整性,同时收集隐藏输入中的数据,以便它不会破坏它。我该怎么做?对于延迟发布此信息,我们深表歉意。
提前谢谢你。
最佳答案
这是一般的经验法则。
Escape variables at the last possible moment.
您希望您的变量是数据的清晰表示。也就是说,如果您尝试存储名为“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 & mySQL : When exactly to use htmlentities?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2077576/
我在优化 JOIN 以使用复合索引时遇到问题。我的查询是: SELECT p1.id, p1.category_id, p1.tag_id, i.rating FROM products p1
我有一个简单的 SQL 查询,我正在尝试对其进行优化以删除“使用位置;使用临时;使用文件排序”。 这是表格: CREATE TABLE `special_offers` ( `so_id` int
我有一个具有以下结构的应用程序表 app_id VARCHAR(32) NOT NULL, dormant VARCHAR(6) NOT NULL, user_id INT(10) NOT NULL
此查询的正确索引是什么。 我尝试为此查询提供不同的索引组合,但它仍在使用临时文件、文件排序等。 总表数据 - 7,60,346 产品= '连衣裙' - 总行数 = 122 554 CREATE TAB
为什么额外的是“使用where;使用索引”而不是“使用索引”。 CREATE TABLE `pre_count` ( `count_id`
我有一个包含大量记录的数据库,当我使用以下 SQL 加载页面时,速度非常慢。 SELECT goal.title, max(updates.date_updated) as update_sort F
我想知道 Using index condition 和 Using where 之间的区别;使用索引。我认为这两种方法都使用索引来获取第一个结果记录集,并使用 WHERE 条件进行过滤。 Q1。有什
I am using TypeScript 5.2 version, I have following setup:我使用的是TypeScript 5.2版本,我有以下设置: { "
I am using TypeScript 5.2 version, I have following setup:我使用的是TypeScript 5.2版本,我有以下设置: { "
I am using TypeScript 5.2 version, I have following setup:我使用的是TypeScript 5.2版本,我有以下设置: { "
mysql Ver 14.14 Distrib 5.1.58,用于使用 readline 5.1 的 redhat-linux-gnu (x86_64) 我正在接手一个旧项目。我被要求加快速度。我通过
在过去 10 多年左右的时间里,我一直打开数据库 (mysql) 的连接并保持打开状态,直到应用程序关闭。所有查询都在连接上执行。 现在,当我在 Servicestack 网页上看到示例时,我总是看到
我使用 MySQL 为我的站点构建了一个自定义论坛。列表页面本质上是一个包含以下列的表格:主题、上次更新和# Replies。 数据库表有以下列: id name body date topic_id
在mysql中解释的额外字段中你可以得到: 使用索引 使用where;使用索引 两者有什么区别? 为了更好地解释我的问题,我将使用下表: CREATE TABLE `test` ( `id` bi
我经常看到人们在其Haxe代码中使用关键字using。它似乎在import语句之后。 例如,我发现这是一个代码片段: import haxe.macro.Context; import haxe.ma
这个问题在这里已经有了答案: "reduce" or "apply" using logical functions in Clojure (2 个答案) 关闭 8 年前。 “and”似乎是一个宏,
这个问题在这里已经有了答案: "reduce" or "apply" using logical functions in Clojure (2 个答案) 关闭 8 年前。 “and”似乎是一个宏,
我正在考虑在我的应用程序中使用注册表模式来存储指向某些应用程序窗口和 Pane 的弱指针。应用程序的一般结构如下所示。 该应用程序有一个 MainFrame 顶层窗口,其中有几个子 Pane 。可以有
奇怪的是:。似乎a是b或多或少被定义为id(A)==id(B)。用这种方式制造错误很容易:。有些名字出人意料地出现在Else块中。解决方法很简单,我们应该使用ext==‘.mp3’,但是如果ext表面
我遇到了一个我似乎无法解决的 MySQL 问题。为了能够快速执行用于报告目的的 GROUP BY 查询,我已经将几个表非规范化为以下内容(该表由其他表上的触发器维护,我已经同意了与此): DROP T
我是一名优秀的程序员,十分优秀!