不需要的<p> <span> </span> </p> <div>标签正在插入数据库</div>

时间:2012-09-30 21:52:35

标签: php mysql configuration ckeditor

我正在使用表单将文本插入MySQL数据库。

当用户手动将文本键入表单时,结果将完美地插入到数据库中。

但是,如果用户从另一个网页复制并粘贴文本,则会有隐藏的p标签,这些标签随文本一起发送到数据库。标签在表单本身中是不可见的,但是在提交时它们仍然被发送到数据库。

如果我然后使用MySQL SELECT语句在网页上显示结果,则会显示不需要的标签,它们会破坏我的网页布局!

因此,我只需要知道如何阻止不必要的&#39; p&#39; &#39;跨度&#39;和&#39; div&#39; div当我从另一个网页复制并粘贴文本时,标签被插入我的MySQL数据库。

有问题的网络表单是我正在构建的内容管理系统的一部分。从用户的角度来看,我需要将表单作为防弹。现实情况是,用户很可能会复制和粘贴来自其他网站的文本,也可能来自word文档,我需要确保不会出现任何不需要的问题。 &#39;跨度&#39;和&#39; div&#39; div从第三方来源复制和粘贴时,标签会插入到数据库中。

以下是表单的代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Untitled</title>
<script type="text/javascript" src="http://www.achcreative.net/ckeditor/ckeditor.js"></script>
<link href="../elite.css" rel="stylesheet" type="text/css" />
</head>
<body>

<!--Begin Main Menu -->
<?php include("includes/menu.inc.php"); ?>
<!--End Main Menu -->

<h2 class="subheaderh2">Insert New News Entry</h2>  

<form method="post" action="insert_news.php">
<input name="publish" type="hidden" id="publish" value="publish" />  
<table>
<tr><td><p>News Title:</p></td></tr>
<tr><td><input name="newstitle" type="text" size="43" id="newstitle"></td></tr>
<tr><td><p>News Article:</p></td></tr>
<tr><td><textarea name="newsarticle" cols="40" rows="10" id="newsarticle"></textarea>

<script type="text/javascript">
//<![CDATA[

// Replace the <textarea id="editor"> with an CKEditor
// instance, using default configurations.
CKEDITOR.replace( 'newsarticle', 
    {
        toolbar :
        [
            [ 'Bold', 'Italic', '-', 'NumberedList', 'BulletedList', '-', 'Link', 'Unlink' ],
        ]
    });
//]]>
</script>
</td></tr>
<tr><td height="30" colspan="2"><input type="submit" value="Submit"></td></tr>  
</table></form>
<p><a href="news_results.php">Return</a></p>
</body>
</html>

以下是表单处理脚本的代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Untitled</title>
</head>

<body>
<h2 class="subheaderh2">News Entry Results</h2>

<?php
// create short variable names
$newstitle=$_POST['newstitle'];
$newsarticle=$_POST['newsarticle'];
$publish=$_POST['publish'];

if (!$newstitle || !$newsarticle)
{
 echo '<p>You have not entered all the required details.<br />'
      .'Please go back and try again.</p>'
      .'<p><a href="javascript:history.go(-1)">Return</a></p>';
 exit;
}

if (!get_magic_quotes_gpc())
{
$newstitle = addslashes($newstitle);
$newsarticle = addslashes($newsarticle);
}

$time = date("l jS F Y - g:iA");

// connect to the database
include('../connect-db.php');

/* Create the prepared statement */
if ($stmt = $mysqli->prepare("INSERT INTO news (id, newstitle, newsarticle, date, archive) values (NULL, ?, ?, NOW(), ?)")) {

/* Bind our params */
$stmt->bind_param('sss', $newstitle, $newsarticle, $publish);

/* Set our params */
$newstitle=$_POST['newstitle'];
$newsarticle=$_POST['newsarticle'];
$publish=$_POST['publish'];

/* Execute the prepared Statement */
$stmt->execute();

/* Echo results */
echo "{$newstitle}";
echo "<br />{$newsarticle}";
echo "Inserted into database on: ";
echo "$time";
echo "<br />";
echo "<br />";
echo '<a href="news_results.php">view results</a>';

/* Close the statement */
$stmt->close(); 
}
else {
/* Error */
printf("Prepared Statement Error: %s\n", $mysqli->error);
}

/* close our connection */
$mysqli->close();

?>

</body>
</html>

非常感谢提前

此致

安德鲁

4 个答案:

答案 0 :(得分:1)

我想指出您的代码容易受到XSS的攻击。<​​/ p>

现在回到你的问题:

你可能使用的是html编辑器。尝试在使用javascript和onsubmit属性提交之前删除不需要的标记。您可以使用以下正则表达式剥离标记:

value_of_editor.replace(/<[^>]+>/g,'');

另外请确保在将html发送到客户端之前不输出原始html但转义html。

<强>更新 没有必要将转义的消息放到数据库中 - 我认为它只是浪费了数据的长度。而且你应该经常检查你输出给客户的内容。

答案 1 :(得分:1)

CKEditor提供了大量影响内容最终输出的配置选项。

如果您不希望在将某些内容粘贴到编辑器中时包含HTML标记,则可以强制粘贴操作仅为文本,这将删除HTML标记。

config.forcePasteAsPlainText = true;

如果您可以包含从其他网页复制并粘贴到编辑器中的有问题内容的示例,将会很有帮助。包括以下三个部分。

1)复制的网页部分。

2)该网页中正在复制的部分的源代码。

3)粘贴操作后CKEditor内容的源代码。

要在编辑器中查看源代码,您需要暂时将“源”按钮添加回工具栏:

CKEDITOR.replace( 'newsarticle', 
    {
        toolbar :
        [
            [ 'Source','Bold', 'Italic', '-', 'NumberedList', 'BulletedList', '-', 'Link', 'Unlink' ],
        ]
    });

粘贴操作后,单击源按钮并复制粘贴的内容。这样您就可以准确了解正在发生的事情。

配置选项列表可在此处获得:
CKEditor 3 JavaScript API Documentation Namespace CKEDITOR.config

答案 2 :(得分:0)

您可以在需要插入数据库的文本中使用strip_tags()函数。

Here's the reference

答案 3 :(得分:0)

您应该使用 strip_tags 功能,以便从字符串中删除(明显的)标记和可能有害的代码。 (是HTML或PHP代码)

$foo = strip_tags('<b>code with html</b>'); // $foo will be "code with html"