有多种方法可以删除/处理代码,以便将其保存在您的数据库中。
正则表达式
一种方法(但可能很难且不可靠)是使用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 净化器
您可以查看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。
此外,我想向您提出的另一个简短但重要的观点是,从用户不能收到的任何数据都是可信的。
SQL 注入攻击
定义(来自here)
SQL 注入攻击包括 SQL 的插入或“注入”
通过从客户端到应用程序的输入数据进行查询。一个
成功的 SQL 注入漏洞利用可以从
数据库,修改数据库数据(插入/更新/删除),执行
对数据库的管理操作(例如关闭 DBMS),
恢复存在于 DBMS 文件系统上的给定文件的内容
并且在某些情况下向操作系统发出命令。
对于 SQL 注入攻击:在将信息存储到数据库时使用准备好的语句和参数化查询。 (问答找到here)可以找到使用PDO准备语句的教程here。
跨站脚本 (XSS)
定义(来自here):
跨站点脚本攻击是一种注入问题,其中
恶意脚本被注入到其他良性且受信任的环境中
网站。当攻击者发生跨站点脚本 (XSS) 攻击时
使用 Web 应用程序发送恶意代码,一般形式为
浏览器端脚本,发送给不同的最终用户。
我个人喜欢这张图片以便更好地理解。
XSS 攻击:你应该参考这个著名的page,它逐条描述了需要做什么。