消毒输入但输出不符合预期
Sanitizing input but output not as expected
这是我的一个表单(PHP+MySQL,textarea 被 TinyMCE 取代)。它记录了带有段落、项目符号、标题和文本对齐方式(右对齐、左对齐、居中对齐和对齐)的描述。
提交后,记录显示为
<p style="text-align: justify;"><strong>Introduction</strong></p>
<p style="text-align: justify;">The death of the pixel leaves you with a flowing, magazine-quality canvas to design for. A canvas where curves are curves, not ugly pixel approximations of curves. A canvas that begins to blur the line between what we consider to be real and what we consider to be virtual.</p>
<p style="text-align: justify;">It wasn't too long ago that there was one set of rules for use of type on print and use of type on screen. Now that we have screens that are essentially print quality, we have to reevaluate these conventions.</p>
<p style="text-align: justify;">Web sites are transforming from boring fields of Arial to embrace the gamut of typographical possibilities offered by web fonts. Web fonts, combined with the style and layout options presented by the creative use of CSS and JavaScript offer a new world of typographic oppor</p>
<ol>
<li style="text-align: justify;">point 1</li>
<li style="text-align: justify;">point 2</li>
<li style="text-align: justify;">point 3</li>
</ol>
我了解到您需要清理进入数据库的所有数据以避免 XSS 并开始寻找解决方案。
我找到的解决方案是使用 "htmlspecialchars()"(来源:Lynda.com - 创建安全 PHP 网站)。
所以,教程说我们需要在保存到数据库之前清理我们的输入并使用类似(示例代码)的东西
<?php
if($_SERVER['REQUEST_METHOD'] === 'POST') {
$category_description = $_POST['category_description'];
echo $category_description;
echo '<br><br>';
echo htmlspecialchars($category_description);
echo '<br><br>';
echo htmlentities($category_description);
echo '<br><br>';
echo strip_tags($category_description);
}
?>
避免XSS.
我到这里为止。 htmlspecialchars() 函数将一些预定义字符转换为 HTML 实体,htmlentities() 将字符转换为 HTML 实体,而 strip_tags() 则完全删除所有标签。
但是在使用 htmlspecialchars()、htmlentities() 和 strip_tags() 之后,输出现在呈现为
我认为这是安全的,但从数据库中获取时在首页上看起来不太好。
如何渲染通过 htmlspecialchars 或 htmlentities 传递的输入?
我不确定这是否是解决问题的正确方法,但我在 php 手册中找到了一个函数 "htmlspecialchars_decode()"。手册上说它的作用与 "htmlspecialchars()" 完全相反。我试过了,效果很好。
html_entity_decode()函数与htmlentities()相反。
我的建议是构建一个函数来清理所有文本输入,以及一个函数来检查来自数据库或任何其他来源的所有输出,如下所示:
<?php
// filter for user input
function filterInput($content)
{
$content = trim($content);
$content = stripslashes($content);
return $content;
}
//filter for viewing data
function filterOutput($content)
{
$content = htmlentities($content, ENT_NOQUOTES);
$content = nl2br($content, false);
return $content;
}
根据您的策略,您可能会向过滤器添加额外功能或删除一些功能。但是你这里的函数足以保护你免受 XSS 攻击。
编辑: 除了上述功能, 也可能与您的网站保护相关。
参考不同方法:
- trim: http://php.net/manual/en/function.trim.php
- 条纹斜线:http://php.net/manual/en/function.stripslashes.php
- html实体:http://php.net/manual/en/function.htmlentities.php
- nl2br: http://php.net/manual/en/function.nl2br.php
查看以下链接也是一个好主意:
- What's the best method for sanitizing user input with PHP?
- The ultimate clean/secure function
重要的是,了解 10 大风险并了解更多信息是件好事。
我使用了 HTMLPurifier 这是一个 PHP 过滤器库来清理 HTML 输入。
这是我的一个表单(PHP+MySQL,textarea 被 TinyMCE 取代)。它记录了带有段落、项目符号、标题和文本对齐方式(右对齐、左对齐、居中对齐和对齐)的描述。
提交后,记录显示为
<p style="text-align: justify;"><strong>Introduction</strong></p>
<p style="text-align: justify;">The death of the pixel leaves you with a flowing, magazine-quality canvas to design for. A canvas where curves are curves, not ugly pixel approximations of curves. A canvas that begins to blur the line between what we consider to be real and what we consider to be virtual.</p>
<p style="text-align: justify;">It wasn't too long ago that there was one set of rules for use of type on print and use of type on screen. Now that we have screens that are essentially print quality, we have to reevaluate these conventions.</p>
<p style="text-align: justify;">Web sites are transforming from boring fields of Arial to embrace the gamut of typographical possibilities offered by web fonts. Web fonts, combined with the style and layout options presented by the creative use of CSS and JavaScript offer a new world of typographic oppor</p>
<ol>
<li style="text-align: justify;">point 1</li>
<li style="text-align: justify;">point 2</li>
<li style="text-align: justify;">point 3</li>
</ol>
我了解到您需要清理进入数据库的所有数据以避免 XSS 并开始寻找解决方案。
我找到的解决方案是使用 "htmlspecialchars()"(来源:Lynda.com - 创建安全 PHP 网站)。
所以,教程说我们需要在保存到数据库之前清理我们的输入并使用类似(示例代码)的东西
<?php
if($_SERVER['REQUEST_METHOD'] === 'POST') {
$category_description = $_POST['category_description'];
echo $category_description;
echo '<br><br>';
echo htmlspecialchars($category_description);
echo '<br><br>';
echo htmlentities($category_description);
echo '<br><br>';
echo strip_tags($category_description);
}
?>
避免XSS.
我到这里为止。 htmlspecialchars() 函数将一些预定义字符转换为 HTML 实体,htmlentities() 将字符转换为 HTML 实体,而 strip_tags() 则完全删除所有标签。
但是在使用 htmlspecialchars()、htmlentities() 和 strip_tags() 之后,输出现在呈现为
我认为这是安全的,但从数据库中获取时在首页上看起来不太好。
如何渲染通过 htmlspecialchars 或 htmlentities 传递的输入?
我不确定这是否是解决问题的正确方法,但我在 php 手册中找到了一个函数 "htmlspecialchars_decode()"。手册上说它的作用与 "htmlspecialchars()" 完全相反。我试过了,效果很好。
html_entity_decode()函数与htmlentities()相反。
我的建议是构建一个函数来清理所有文本输入,以及一个函数来检查来自数据库或任何其他来源的所有输出,如下所示:
<?php
// filter for user input
function filterInput($content)
{
$content = trim($content);
$content = stripslashes($content);
return $content;
}
//filter for viewing data
function filterOutput($content)
{
$content = htmlentities($content, ENT_NOQUOTES);
$content = nl2br($content, false);
return $content;
}
根据您的策略,您可能会向过滤器添加额外功能或删除一些功能。但是你这里的函数足以保护你免受 XSS 攻击。
编辑: 除了上述功能,
参考不同方法:
- trim: http://php.net/manual/en/function.trim.php
- 条纹斜线:http://php.net/manual/en/function.stripslashes.php
- html实体:http://php.net/manual/en/function.htmlentities.php
- nl2br: http://php.net/manual/en/function.nl2br.php
查看以下链接也是一个好主意:
- What's the best method for sanitizing user input with PHP?
- The ultimate clean/secure function
重要的是,了解 10 大风险并了解更多信息是件好事。
我使用了 HTMLPurifier 这是一个 PHP 过滤器库来清理 HTML 输入。