我一直在寻找这个,但我找不到最重要的部分 - 使用什么领域。
我想在不允许任何类型的javascript,html或php的情况下保存textarea。
在将数据保存到数据库之前,我应该运行发布的textarea?我应该在数据库中使用哪种字段类型?这将是一个描述,最多1000个字符。
答案 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; // <a href='test'>Test</a>
?>
有关转义的详细信息以及与您的问题相关的非常好的解释,请查看此page。它向您展示了其他形式的输出转义。另外,有关转义的问题和答案,请点击here。
此外,我想向您抛出的另一个简短但 VITAL 点是从用户 CAN NOT 收到的 ANY 数据。
SQL注入攻击
定义(来自here)
SQL注入攻击包括插入或注入&#34;一个SQL 通过从客户端到应用程序的输入数据进行查询。一个 成功的SQL注入漏洞可以从中读取敏感数据 数据库,修改数据库数据(插入/更新/删除),执行 数据库上的管理操作(例如关闭DBMS), 恢复DBMS文件系统上存在的给定文件的内容 在某些情况下向操作系统发出命令。
对于SQL注入攻击:在将信息存储到数据库时使用预准备语句和参数化查询。 (问题和答案发现here)可以找到使用PDO准备好的语句教程here。
跨站点脚本(XSS)
定义(来自here):
跨站点脚本攻击是一种注入问题,其中 恶意脚本被注入其他良性和可信赖的 网站。攻击者发生跨站点脚本(XSS)攻击 使用Web应用程序通常以表单形式发送恶意代码 一个浏览器端脚本,给另一个最终用户。
我个人喜欢这张图片以便更好地理解。
对于XSS攻击:您应该参考这个着名的page,它按规则描述需要做什么。
答案 1 :(得分:1)
<强> TLDR:强>
通常使用htmlspecialchars()
对输出中的文本进行编码,而不是对输入中的文本进行过滤。 text
字段可以用于此目的。
您正试图保护自己免受XSS的侵害。当用户可以在您的网站上存储HTML控制字符时,就会发生XSS。其他用户将看到此HTML标记,因此恶意用户可以使用您的页面将人们重定向到其他网站或窃取cookie等。
您需要对所有输入都考虑这一点:这应该包括可以存储在数据库中的任何varchar
或text
字段;不只是你的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实体( <
,>
,&
,'
和"
)。这看起来像浏览器中的原始字符(即:普通用户),但它不会像实际的HTML标记那样。
结果是,用户的名字不是恶意JavaScript,而是字面上的&lt; script src =“http://example.com/malicious.js"></script>
2 - 如果您忘记保护输入字段,并且有人发现并添加恶意内容,您现在需要在数据库中找到恶意内容并修复您网站上的错误代码。
3 - 如果您忘记对输出字段进行编码,并且有人设法隐藏恶意输入,那么您只需要修复网站上的错误代码。
4 - 用户可以编写会破坏用于编辑用户名的HTML字段的用户名。如果您在之前对内容进行编码,则将其存储在数据库中,那么您需要在相应的输入字段中“按原样”显示它(让我们假设管理员或用户可以稍后更改其用户名) 。但是,让我们假设用户找到了将恶意代码注入数据库的方法。如果他们说他们的用户名是" style="display:none;" />
,该怎么办?现在让管理员更改此用户名的输入字段如下所示:
<input type="text" name="username" value="" style="display:none;" />" />
malicious content -> ^^^^^^^^^^^^^^^^^^^^^^^^^^
现在,管理员无法解决问题:输入字段已消失。但是,如果您对输出中的文本进行编码,那么所有输入字段都将具有针对恶意内容的保护。现在,您的输入将如下所示:
<input type="text" name="username" value="" style="display:none;" />" />
safe content -> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^