将textarea保存在数据库中

时间:2013-03-09 18:27:26

标签: php

我一直在寻找这个,但我找不到最重要的部分 - 使用什么领域。

我想在不允许任何类型的javascript,html或php的情况下保存textarea。

在将数据保存到数据库之前,我应该运行发布的textarea?我应该在数据库中使用哪种字段类型?这将是一个描述,最多1000个字符。

2 个答案:

答案 0 :(得分:5)

有许多方法可以删除/处理代码,以便将其保存在数据库中。

正则表达式

一种方法(但可能很难且不可靠)是使用regular expressions删除/检测代码。

例如,以下内容使用php代码删除所有脚本标记(取自here):

$mystring = preg_replace('/<script\b[^>]*>(.*?)<\/script>/is', "", $mystring)

stip_tags PHP函数

您还可以使用内置的stip_tags函数从字符串中删除HTML和PHP标记。本手册提供了几个示例,为方便起见,下面显示了一个示例:

<?php
$text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other text</a>';
echo strip_tags($text);
echo "\n";

// Allow <p> and <a>
echo strip_tags($text, '<p><a>');
?>

HTML Purifier

您可以查看HTML Purifier,这是一个用于检测和删除危险代码的常见HTML过滤器PHP库。

Getting Started部分找到简单代码:

require_once '/path/to/HTMLPurifier.auto.php';

$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);
$clean_html = $purifier->purify($dirty_html);

在实践中(安全输出)

如果您正在尝试避免XSS攻击或注入攻击,那么清理用户数据是错误的方法。删除标签并非100%保证您的服务免受这些攻击。因此,实际上,通常不会过滤/清除包含代码的用户数据,而是在输出期间转义。更具体地说,字符串中的特殊字符是转义的,其中这些字符基于语言的语法。这方面的一个例子是利用PHP的htmlspecialchars函数将特殊字符转换为各自的HTML实体。手册中的代码片段如下所示:

<?php
$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
echo $new; // &lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;
?>

有关转义的详细信息以及与您的问题相关的非常好的解释,请查看此page。它向您展示了其他形式的输出转义。另外,有关转义的问题和答案,请点击here

此外,我想向您抛出的另一个简短但 VITAL 点是从用户 CAN NOT 收到的 ANY 数据。

SQL注入攻击

定义(来自here

  

SQL注入攻击包括插入或注入&#34;一个SQL   通过从客户端到应用程序的输入数据进行查询。一个   成功的SQL注入漏洞可以从中读取敏感数据   数据库,修改数据库数据(插入/更新/删除),执行   数据库上的管理操作(例如关闭DBMS),   恢复DBMS文件系统上存在的给定文件的内容   在某些情况下向操作系统发出命令。

对于SQL注入攻击:在将信息存储到数据库时使用预准备语句和参数化查询。 (问题和答案发现here)可以找到使用PDO准备好的语句教程here

跨站点脚本(XSS)

定义(来自here):

  

跨站点脚本攻击是一种注入问题,其中   恶意脚本被注入其他良性和可信赖的   网站。攻击者发生跨站点脚本(XSS)攻击   使用Web应用程序通常以表单形式发送恶意代码   一个浏览器端脚本,给另一个最终用户。

我个人喜欢这张图片以便更好地理解。

enter image description here

对于XSS攻击:您应该参考这个着名的page,它按规则描述需要做什么。

答案 1 :(得分:1)

<强> TLDR:

通常使用htmlspecialchars()对输出中的文本进行编码,而不是对输入中的文本进行过滤。 text字段可以用于此目的。

你需要防范

您正试图保护自己免受XSS的侵害。当用户可以在您的网站上存储HTML控制字符时,就会发生XSS。其他用户将看到此HTML标记,因此恶意用户可以使用您的页面将人们重定向到其他网站或窃取cookie等。

您需要对所有输入都考虑这一点:这应该包括可以存储在数据库中的任何varchartext字段;不只是你的textarea。我可以像添加input一样轻松地将恶意内容添加到textarea字段。

我们如何防御这个?

假设用户声称其用户名为:

<script src="http://example.com/malicious.js"></script>

处理此问题的最简单方法是“按原样”将其保存到数据库中。但是,只要您在网站上echo,就应该通过PHP htmlspecialchars()函数对其进行过滤:

echo 'Hi, my name is ' . htmlspecialchars($user->username) . '!';

htmlspecialchars将HTML控件字符(<>&'")转换为HTML实体( &lt;&gt;&amp;&apos;&quot;)。这看起来像浏览器中的原始字符(即:普通用户),但它不会像实际的HTML标记那样。

结果是,用户的名字不是恶意JavaScript,而是字面上的&lt; script src =“http://example.com/malicious.js"></script>

为什么要过滤输出?为什么不输入?

1 - OWASP recommends this way

2 - 如果您忘记保护输入字段,并且有人发现并添加恶意内容,您现在需要在数据库中找到恶意内容并修复您网站上的错误代码。

3 - 如果您忘记对输出字段进行编码,并且有人设法隐藏恶意输入,那么您只需要修复网站上的错误代码。

4 - 用户可以编写会破坏用于编辑用户名的HTML字段的用户名。如果您在之前对内容进行编码,则将其存储在数据库中,那么您需要在相应的输入字段中“按原样”显示它(让我们假设管理员或用户可以稍后更改其用户名) 。但是,让我们假设用户找到了将恶意代码注入数据库的方法。如果他们说他们的用户名是" style="display:none;" />,该怎么办?现在让管理员更改此用户名的输入字段如下所示:

<input type="text" name="username" value="" style="display:none;" />" />
                malicious content ->      ^^^^^^^^^^^^^^^^^^^^^^^^^^ 

现在,管理员无法解决问题:输入字段已消失。但是,如果您对输出中的文本进行编码,那么所有输入字段都将具有针对恶意内容的保护。现在,您的输入将如下所示:

<input type="text" name="username" value="&quot; style=&quot;display:none;&quot; /&gt;" />
                     safe content ->      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^