假设我有一个使用正则表达式清除字符串的函数:
function RegExCleaner($var)
{
return preg_replace('Regular expression', '', $var)
}
该功能的外观和工作方式并不重要。只是一个简单的例子。
如果我使用此功能清理用户输入或某个值一次,然后使用值“服务器端”是否足以清除它一次或我可以多层?因此,如果我在一系列函数中使用变量,我是否在每个函数中清理它?这实际上是否提高了安全性,还是我只是添加了非必要的工作量?
答案 0 :(得分:1)
最好有一个地方发生这种情况恕我直言。在进入系统的途中清理所有内容,之后您无需担心。如果你在很多地方做这件事,你也可能会混淆跟踪你正在消毒的地方。在每个级别消毒都不会损害你的逻辑,但是由于这个原因,它可能会使维护更加困难。
我建议使用一个函数库来清理输入,可能包含在类中,例如作为静态方法,并通过其中一个函数传递所有内容。
答案 1 :(得分:1)
基本上有两种处理用户输入的方法:
消毒:这会从输入中删除不需要的内容。不需要的东西可能是各种标签,格式无效的字符,某些单词或字母等。这几乎总是你应该做的事情。唯一的例外是输入是一个简单的值,如整数或布尔值,可以通过验证直接处理。
验证:这可确保输入确实符合您的预期。它是数字,布尔值,文本块等吗?这与安全性无关,因为它实际上是为您的程序提供正确的数据以便能够运行。
对于这两点,都有一个名为Filter的PHP扩展。这是考虑到这些东西。
对于消毒输入,您可以执行以下操作:
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
$age = filter_input(INPUT_POST, 'age', FILTER_SANITIZE_NUMBER_INT);
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
$password = filter_input(INPUT_POST, 'password', FILTER_UNSAFE_RAW);
用于验证:
if (preg_match('/[\w\d]{4,20}/', $name) === 0) {
die('Invalid name!');
}
if ( ! ctype_digit($age) || ($age < 13)) {
die('Invalid age or too young!');
}
if ( ! filter_var($email, FILTER_VALIDATE_EMAIL)) {
die('Invalid email address!');
}
if (strlen($password) < 10) {
die('Password is too short!');
}
要记住的一件非常重要的事情是没有神奇药丸。用户输入不能只是在漂白时进行清洗,然后被认为是安全的。您需要知道用户输入应该是什么,然后相应地对待它。如果它不是您所知道的那么应立即刹车并将其扔回用户。