【发布时间】:2019-06-17 05:39:03
【问题描述】:
我试图弄清楚为什么在进行 URL 编码时,经过净化的字符串与未经过净化的字符串的输出不同。
我不知道这叫什么,但我搜索了 URL 编码和清理并尝试了谷歌但我找不到任何解释。
我在发布视频后偶然发现了这一点,问题是我在数据库中插入标题,取出它们并用它创建一个 URL。
示例 URL(由于问题而无法使用)
localhost/proviin/video/kojima%26%2339%3Bs+cancelled+masterpiece+-+investigating+silent+hills/16
我进行了单页测试,以测试正在发生的事情和行为,如下所示。
我需要的结果如何(但这没有经过清理):
$title = "Kojima's Cancelled Masterpiece - Investigating Silent Hills";
echo $title;
echo "<br>";
echo urlencode($title);
输出:(可以在 URL 中使用)
- 小岛被取消的杰作 - 调查寂静岭
- 小岛%27s+取消+杰作+-+调查+寂静+山丘
怎么样
$title = sanitize("Kojima's Cancelled Masterpiece - Investigating Silent Hills", "str");
echo $title;
echo "<br>";
echo urlencode($title);
输出:(在 URL 中不起作用,但经过清理)
小岛被取消的杰作——调查寂静岭
小岛%26%2339%3Bs+已取消+杰作+-+调查+寂静+山丘
消毒功能
function sanitize($item, $type) {
switch ($type) {
case "str":
return filter_var($item, FILTER_SANITIZE_STRING);
break;
case "mail":
return filter_var($item, FILTER_SANITIZE_EMAIL);
break;
case "url":
return filter_var($item, FILTER_SANITIZE_URL);
break;
case "int":
return filter_var($item, FILTER_SANITIZE_NUMBER_INT);
break;
case "float":
return filter_var($item, FILTER_SANITIZE_NUMBER_FLOAT);
break;
default:
return false;
}
}
据我所知:
在插入数据库之前对数据进行清理。
当你回显时你会转义(htmlspecialchars)
但是为什么在使用urlencode()时输出不同的净化字符串?
如果这是正常行为,我到底如何在将字符串插入数据库表之前对其进行清理,并在带有urlencode() 的 URL 中使用它们?
【问题讨论】:
-
永远,永远,永远不要在将某些东西放入数据库之前对其进行“清理”。您永远不知道需要哪种输出媒体来显示此数据,因此如果您对其进行清理以供在
<a href="DATA_HERE">中使用,那么您将失去理智,试图使其看起来适合<div>DATA_HERE</div> -
天哪,我不应该在将其放入数据库之前对其进行清理吗? :o 它不是这样工作的:插入之前:消毒当向用户显示时:转义(等 htmlspecialcharts)?
-
我不同意@MonkeyZeus,如果我们不清理,页面将容易受到持久性 XSS 和 SQL 注入的攻击
-
你应该清理输入,然后保存到数据库,并在输出时取消清理。
-
@VinaySheoran 这就是我的想法?输入数据库时清理,从数据库输出数据时转义(htmlspecialchars?)?但是我仍然对上面的问题要做什么感到迷茫
标签: php urlencode sanitization input-sanitization