1

假设我有一个使用正则表达式清理字符串的函数:

function RegExCleaner($var)
{
    return preg_replace('Regular expression', '', $var)
}

函数的外观和工作方式并不重要。只是一个简单的例子。

如果我使用此功能来清理用户输入或某个值一次,然后使用值“服务器端”来清理一次就足够了,还是可以多层进行?因此,如果我在一系列函数中使用变量,我是否在每个函数中都清理它?这实际上提高了安全性还是我只是增加了不必要的工作量?

4

2 回答 2

1

恕我直言,最好有一个地方发生这种情况。在进入系统的过程中清理所有东西,然后你就不用担心了。如果你在很多地方进行消毒,跟踪你在哪里消毒也会让人感到困惑。在每个级别进行清理不会损害您的逻辑,但由于这个原因可能会使维护变得更加困难。

我推荐一个函数库来清理输入,可能包含在一个类中,例如作为静态方法,并通过其中一个函数传递所有内容。

于 2012-12-24T15:35:34.200 回答
1

基本上有两种处理用户输入的方法:

  1. 消毒:这会从输入中删除不需要的东西。不需要的东西可能是各种标签、格式无效的字符、某些单词或字母等。这几乎总是你应该做的事情。唯一的例外是如果输入是一个简单的值,例如整数或布尔值,可以通过验证直接处理。

  2. 验证:这可以确保输入确实是您所期望的。它是数字、布尔值、文本块等吗?这与其说是关于安全性,不如说是关于实际获取正确类型的数据以使您的程序能够运行。

对于这两点,有一个名为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!');
}

要记住的一件非常重要的事情是没有神奇的药丸。用户输入不能只是在漂白剂进来的时候洗掉,然后说是安全的。您需要知道用户输入应该是什么,然后相应地处理它。如果它不是您所知道的,那么立即踩刹车并将其扔回给用户。

于 2012-12-24T15:56:44.850 回答