我正在网站上工作,我正在使用mysqli连接到数据库。但我不知道如何使用什么来逃避表单中用户的html输入。我听说过strip_tags,htmlspecialchars等等。我该怎么用?我想从偷窥者那里保护我的数据库,但我也希望保护用户数据。我已经输入了密码。
答案 0 :(得分:1)
从用户获取数据时,您应始终考虑使用filter
extension。它有许多可以使用的清理和验证过滤器。
例如,如果您要处理包含字段name
,age
,email
和pass
的表单,则可以使用有意义的过滤器对其进行过滤:< / 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,然后再进一步验证。
如果要显示来自用户输入的数据库中的值,请使用htmlspecialchars
或htmlentities
,以便将所有HTML标记从<
转换为<
因此输出不会被解析为HTML,因此允许人们在您的网页上放置恶意链接或脚本标记。
答案 2 :(得分:0)
我不确定您是否只有登录表单,或者您是否也有注册表单。如果您有一个向数据库提交数据的注册表单,那么您应该尝试阅读sanitizing。这种做法已经为您的数据库中的XSS注入提供了很多帮助。有一点需要注意,因为你不想弄乱用户密码,所以不要花费很多精力来清理密码字段。
正如其他人已经说过的,MD5和SHA1现在毫无意义,它们是安全漏洞。如果你使用的是PHP 5.5,那么你应该使用@Mark Baker在他的评论中写道的方法: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转义您在数据库中插入的值总是一个好主意。