我是否应该允许将包含脚本标签的内容(来自wordpress数据库)动态插入我的应用程序中的html?

时间:2016-12-01 01:28:14

标签: javascript php wordpress security xss

我正在为当地的在线报纸公司构建应用程序。

他们有一个现有的网站,这是一个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>

我有一些主要问题:

  1. 该公司的wordpress网站上有反垃圾邮件。做这个 在显示此内容时减轻了我的安全问题 应用程序?

  2. 此外,我是否应该允许脚本标记?

  3. 总的来说,您能否就如何以最安全的方式显示此数据给出一些建议。我调查了html purifier。这是 一个很好的选择?

1 个答案:

答案 0 :(得分:3)

  

该公司的wordpress网站上有反垃圾邮件。在应用程序中显示此内容时,这是否会减轻我的安全性?

甚至没有一点点。 WordPress反垃圾邮件插件只有屏幕评论。

  

另外,我应该允许脚本标签吗?

这取决于您的使用案例。您的示例帖子似乎包含有意插入帖子一部分的<script>个标签,因此您可能需要将其保留。

  

总的来说,您能否就如何显示此数据的最安全方式给出一些建议。我已经研究过html净化器了。这是一个不错的选择吗?

总的来说,是的。 HTML Purifier是处理不受信任的HTML的好方法。

在这种特定情况下,可能不是。根据您的描述,HTML内容全部由具有特殊访问权限的用户(记者)编写 - 它是可信输入,可能不需要过滤。