我正在为当地的在线报纸公司构建应用程序。
他们有一个现有的网站,这是一个wordpress网站,他们上传新闻报道(wordpress帖子)。
唯一上传新闻报道的人是公司内的记者。
在应用程序构建的一个主要部分中,我连接到此wordpress数据库(在同一服务器上使用php文件)并检索要显示的新闻故事内容 在应用程序内。 我自己用php构建了这个服务,并使用javascript插入客户端的html。
我一直在阅读安全性(包括OWASP cheat sheet for XSS prevention)并且已经采取必要的步骤来实现应用程序的最大安全性,包括在插入html之前对数据进行编码。然而,来自数据库的一些内容包含html,这是我关心/问题的地方(有关此问题的详细信息)
以下是该应用的流程:
建立与wordpress数据库的PDO连接(也将charset设置为utf-8。和setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
),如同here所述,以防止SQL注入。
<?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;
}
在客户端,我在插入html之前一直使用OWASP ESAPI javascript library来编码内容。 我正在使用encodeForHTML()函数来编码post_title,post_excerpt,post_date等(在插入我的html之前) 因为这些不包含任何需要渲染的html。
以下是用于生成和插入html的Javascript / Jquery代码示例:
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网站上有反垃圾邮件。做这个 在显示此内容时减轻了我的安全问题 应用程序?
此外,我是否应该允许脚本标记?
答案 0 :(得分:3)
该公司的wordpress网站上有反垃圾邮件。在应用程序中显示此内容时,这是否会减轻我的安全性?
甚至没有一点点。 WordPress反垃圾邮件插件只有屏幕评论。
另外,我应该允许脚本标签吗?
这取决于您的使用案例。您的示例帖子似乎包含有意插入帖子一部分的<script>
个标签,因此您可能需要将其保留。
总的来说,您能否就如何显示此数据的最安全方式给出一些建议。我已经研究过html净化器了。这是一个不错的选择吗?
总的来说,是的。 HTML Purifier是处理不受信任的HTML的好方法。
在这种特定情况下,可能不是。根据您的描述,HTML内容全部由具有特殊访问权限的用户(记者)编写 - 它是可信输入,可能不需要过滤。