保护用户输入

时间:2015-07-24 22:21:27

标签: php mysqli

我正在网站上工作,我正在使用mysqli连接到数据库。但我不知道如何使用什么来逃避表单中用户的html输入。我听说过strip_tags,htmlspecialchars等等。我该怎么用?我想从偷窥者那里保护我的数据库,但我也希望保护用户数据。我已经输入了密码。

3 个答案:

答案 0 :(得分:1)

从用户获取数据时,您应始终考虑使用filter extension。它有许多可以使用的清理和验证过滤器。

例如,如果您要处理包含字段nameageemailpass的表单,则可以使用有意义的过滤器对其进行过滤:< / p>

// This filter strips tags from the input
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);

// This filter strips anything that is not a numeral (a whole number)
$age = filter_input(INPUT_POST, 'age', FILTER_SANITIZE_NUMBER_INT);

// This filter strips characters that are illegal in email addresses
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);

// This filter does not do anything to the input
$pass = filter_input(INPUT_POST, 'pass', FILTER_UNSAFE_RAW);

使用内置password hashing API哈希密码:

$password = filter_input(INPUT_POST, 'password', FILTER_UNSAFE_RAW);
$hashed   = password_hash($password, PASSWORD_BCRYPT);

...并验证密码:

$password = filter_input(INPUT_POST, 'password', FILTER_UNSAFE_RAW);
$hashed   = '[HASHED PASSWORD FROM DATABASE]';

if (password_verify($password, $hash)) {
    echo 'Valid password!';
} else {
    echo 'Invalid password!';
}

如果您使用的是旧版本的PHP,则可能无法使用此API。在这种情况下,您应该考虑将PHP升级到最新的稳定版本。较新版本的PHP比旧版本更安全,所以...升级!随时都可以升级。

如果无法升级,则可以使用this compatibility library

对于数据库,请使用MySQLi API,特别是prepared statements

$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
$password = filter_input(INPUT_POST, 'password', FILTER_UNSAFE_RAW);
$hashed   = password_hash($password, PASSWORD_BCRYPT);

// Create a database connection
$db = new MySQLi('localhost', 'username', 'password', 'database');

// Prepare an SQL query with placeholders
$stmt = $db->prepare('INSERT INTO `users` (`name`, `hash`) VALUES (?, ?)');

// Always expect errors and do something about them!
if ($stmt === false) {
    die('Prepare error: ' . $db->error);
}
// Bind the username and password to the prepared statement
$stmt->bind_param('ss', $username, $hashed);

// Execute and do something...
if ($stmt->execute()) {
    echo 'Saved successfully!';
} else {
    echo 'Error: ', $stmt->error;
}

答案 1 :(得分:0)

要防止SQL注入并轻松转义输入,请使用prepared statements

处理HTML输入取决于允许的内容以及您是否希望某些输入接受HTML。

如果您不想输入HTML,可以选择使用strip_tags从输入中完全删除HTML,然后再进一步验证。

如果要显示来自用户输入的数据库中的值,请使用htmlspecialcharshtmlentities,以便将所有HTML标记从<转换为&lt;因此输出不会被解析为HTML,因此允许人们在您的网页上放置恶意链接或脚本标记。

答案 2 :(得分:0)

我不确定您是否只有登录表单,或者您是否也有注册表单。如果您有一个向数据库提交数据的注册表单,那么您应该尝试阅读sanitizing。这种做法已经为您的数据库中的XSS注入提供了很多帮助。有一点需要注意,因为你不想弄乱用户密码,所以不要花费很多精力来清理密码字段。

正如其他人已经说过的,MD5和SHA1现在毫无意义,它们是安全漏洞。如果你使用的是PHP 5.5,那么你应该使用@Mark Ba​​ker在他的评论中写道的方法:password_hash()/ password_verify()。

我建议使用类似河豚的东西,说实话它很强大。

如果你想创建一个盐,这里有一个小片段:

public static function createSalt($aLength = 16, $aCost = 10){
    $salt = strtr(base64_encode(mcrypt_create_iv($aLength)), '+', '.');
    $salt = sprintf("$2y$%02d$", $aCost) . $salt;
    return $salt;
}

以及我如何创建密码

public static function createPassword($aPassword, $aSalt) {
    return crypt($aPassword, $aSalt);
}

然后,您就可以根据用户输入+ salt创建密码。

P.S转义您在数据库中插入的值总是一个好主意。