- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为本地一家在线报纸公司构建一个应用程序。
他们有一个现有的网站,该网站是一个 WordPress 网站,他们在其中上传新闻报道(WordPress 帖子)。
唯一上传新闻报道的人是公司内部的记者。
在我正在构建的应用程序的主要部分之一中,我连接到此 WordPress 数据库(在同一服务器上有一个 php 文件)并检索要显示的新闻报道内容在应用程序内。我自己用 php 构建了这个服务,并使用 javascript 插入到客户端的 html 中。
我一直在阅读有关安全性的内容(包括 OWASP cheat sheet for XSS prevention ),并采取必要的步骤在应用程序中实现最大的安全性,包括在插入 html 之前对数据进行编码。然而,来自数据库的一些内容包含 html,这就是我关心/问题所在(更多详细信息即将到来)
这是应用程序的流程:
与 wordpress 数据库建立 PDO 连接(同时将字符集设置为 utf-8。并 setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
),如所述 here用于防止 SQL 注入(inject)。
<?php
include_once 'wp_psl_config.php';
//initiate a PDO connection
$pdoConnection = new PDO(HOSTDBNAME, USER, PASSWORD);
$pdoConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdoConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdoConnection->exec("SET CHARACTER SET utf8");
?>
我正在使用参数化查询和准备好的语句来检索新闻报道,如下所示:
function getStoryData($story_id, $pdoConnection){
$data = array();
$query ='SELECT * FROM wp_posts WHERE ID=:story_id';
$statement = $pdoConnection->prepare($query);
$statement->bindValue(':story_id', $story_id, PDO::PARAM_INT);
$statement->execute();
$statement->setFetchMode(PDO::FETCH_ASSOC);
//store content into $data array
return $data;
}
在客户端我一直在使用OWASP ESAPI javascript library用于在插入 html 之前对内容进行编码。我正在使用encodeForHTML()函数对post_title、post_excerpt、post_date等进行编码(在插入到我的html之前)因为它们不包含任何需要渲染的 html。
这是我的 Javascript/Jquery 代码示例,用于生成和插入 html:
var safe_post_title = $ESAPI.encoder().encodeForHTML(post_title);
var safe_story_html = '<h3 class="story_headline">' + safe_post_title + '</h3>';
$('#story_area').html(safe_story_html);
然而,wordpress post_content 字段(包含主要故事内容)包含许多不同的 html 元素和脚本标签,所以这就是我关心的地方。
以下是 wordpress post_content 字段中的数据示例:
Line of text... more text... more text.
more text...
If you're not sure who represents you, you can find out
<a href="http://example.com/">here</a>.
<h5>Search here:</h5>
<div id="ragic_webview"></div>
<script type="text/javascript">// <![CDATA[
var ragic_url = 'www.ragic.com/companyname/sheets/3';
var ragic_feature= 'fts';
var exactMatch = true;
/* * * DON'T EDIT BELOW THIS LINE * * */
(function() {
var rq = document.createElement('script');
rq.type = 'text/javascript';
rq.async = true;
rq.src = window.location.protocol == "https:" ? "https://www.ragic.com/intl/common/loadfts.js" : "http://www.ragic.com/intl/common/loadfts.js";
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(rq);
})();
// ]]>
</script>
<noscript>Please enable JavaScript to view the <a href="http://www.ragic.com/?ref_noscript">Online database form by Ragic.</a></noscript>
<a id="ragic-link" href="http://www.ragic.com">online database form by <span class="logo-ragic">Ragic</span></a>
post_content 数据的另一个示例:
Line of text... more text... more text.
more text...
<script id="infogram_0_housing_list_by_area" src="//e.infogr.am/js/embed.js?c5h" type="text/javascript"></script>
<div style="width: 100%; padding: 8px 0; font-family: Arial; font-size: 13px; line-height: 15px; text-align: center;">
<a style="color: #989898; text-decoration: none;" href="https://infogr.am/housing_list_by_area" target="_blank">Housing List, by Area</a> <span class="break_between_paragraphs"></span>
<a style="color: #989898; text-decoration: none;" href="https://infogr.am" target="_blank">
Create your own infographics</a>
</div>
我有一些主要问题:
该公司在其 WordPress 网站上设有反垃圾邮件功能。做这个减少我在以下位置显示此内容时的安全担忧该应用程序?
另外,我应该允许脚本标签吗?
最佳答案
The company have an anti spam on their wordpress site. Does this lessen the security concern for me when displaying this content in the app?
一点也没有。 WordPress 反垃圾邮件插件仅屏蔽评论。
Also, Should I allow the script tags at all?
这取决于您的用例。您的示例帖子似乎包括 <script>
作为帖子的一部分有意插入的标签,因此您可能需要将它们保留在其中。
Overall, can you give me some advice on what is the most secure way to display this data. I have looked into html purifier. Is this a good option?
总的来说,是的。 HTML Purifier 是处理不受信任的 HTML 的好方法。
在这个具体情况下,可能不会。根据您的描述,HTML 内容都是由对应用程序具有特殊访问权限的用户(记者)编写的 - 它是受信任的输入,可能不需要过滤。
关于javascript - 我是否应该允许包含脚本标签(来自 WordPress 数据库)的内容动态插入到我的应用程序中的 html 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40901161/
我有一个类似于以下的结构。 class A { string title; List bItem; } class B { int pric
本地流 和 远程流 两者都是“媒体流列表 ”。 本地流 包含“本地媒体流 ” 对象 但是,远程流 包含“媒体流 ” 对象 为什么差别这么大? 当我使用“本地流 “- 这个对我有用: localVide
我正在尝试将 8 列虚拟变量转换为 8 级排名的一列。 我试图用这个公式来做到这一点: =IF(OR(A1="1");"1";IF(OR(B1="1");"2";IF(OR(C1="1");"3";I
我正在使用面向对象编程在 Python 中创建一个有点复杂的棋盘游戏的实现。 我的问题是,许多这些对象应该能够与其他对象交互,即使它们不包含在其中。 例如Game是一个对象,其中包含PointTrac
有没有办法获取与 contains 语句匹配的最深元素? 基本上,如果我有嵌套的 div,我想要最后一个元素而不是父元素: Needle $("div:contains('Needle')")
出于某种原因,我无法在 Google 上找到答案!但是使用 SQL contains 函数我怎么能告诉它从字符串的开头开始,即我正在寻找等同于的全文 喜欢 'some_term%'。 我知道我可以使用
我正在尝试创建一个正则表达式来匹配具有 3 个或更多元音的字符串。 我试过这个: [aeiou]{3,} 但它仅在元音按顺序排列时才有效。有什么建议吗? 例如: 塞缪尔 -> 有效 琼 -> 无效 S
嘿所以我遇到了这样的情况,我从数据库中拉回一个客户,并通过包含的方式包含所有案例研究 return (from c in db.Clients.Include("CaseStudies")
如果关键字是子字符串,我无法弄清楚为什么这个函数不返回结果。 const string = 'cake'; const substring = 'cak'; console.log(string.in
我正在尝试将包含特定文本字符串的任何元素更改为红色。在我的示例中,我可以将子元素变为蓝色,但是我编写“替换我”行的方式有些不正确;红色不会发生变化。我注意到“contains”方法通常写为 :cont
我想问一下我是否可以要求/包含一个语法错误的文件,如果不能,则require/include返回一个值,这样我就知道所需/包含的文件存在语法错误并且不能被要求/包含? file.php语法错误 inc
我想为所有包含youtube链接的链接添加一个rel。 这就是我正在使用的东西-但它没有用。有任何想法吗? $('a [href:contains(“youtube.com”)]')。attr('re
我正在尝试在 Elasticsearch 中查询。除搜索中出现“/”外,此功能均正常运行。查询如下所示 GET styling_rules/product_line_filters/_search {
我正在开发名为eBookRepository的ASP.NET MVC应用程序,其中包含在线图书。 电子书具有自己的标题,作者等。因此,现在我正在尝试实现搜索机制。我必须使用Elasticsearch作
我已阅读Firebase Documentation并且不明白什么是 .contains()。 以下是文档中 Firebase 数据库的示例规则: { "rules": { "rooms"
我的问题是我可以给出条件[ 'BookTitleMaster.id' => $xtitid, ] 如下所示 $bbookinfs = $this->BookStockin->BookIssue->fi
我需要能够使用 | 检查模式在他们中。例如,对于像“dtest|test”这样的字符串,像 d*|*t 这样的表达式应该返回 true。 我不是正则表达式英雄,所以我只是尝试了一些事情,例如: Reg
我想创建一个正则表达式来不匹配某些单词... 我的字符:var test = "é123rr;and;ià456;or;456543" 我的正则表达式:test.match(\((?!and)(?!o
我在 XSLT 中有一个名为 variable_name 的变量,如果相关产品具有名称为 A 或 B 或两者均为 A & 的属性,我将尝试将其设置为 1 B.
您好,我想让接待员和经理能够查看工作类型和费率并随后进行更新。但是技术人员只能查看不能更新。该图是否有效? 我读到扩展用例是由发起基本用例的参与者发起的。我应该如何区分技术人员只能启动基本案例而不能启
我是一名优秀的程序员,十分优秀!