首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保护用户输入

保护用户输入
EN

Stack Overflow用户
提问于 2015-07-25 06:21:27
回答 3查看 188关注 0票数 0

我在一个网站上工作,我正在使用mysqli连接到数据库。但是我不知道该用什么来转义表单中用户的html输入。我听说过strip_tags、htmlspecialchars和许多其他的东西。我应该使用什么?我想保护我的数据库免受窥探者的攻击,但我也想保护用户的数据。我已经md5ed了密码。

EN

回答 3

Stack Overflow用户

发布于 2015-07-25 06:45:39

从用户获取数据时,应该始终考虑使用filter extension。它有大量的过滤和验证过滤器,你可以使用。

例如,如果您正在处理具有字段nameageemailpass的表单,则可以使用有意义的筛选器对其进行筛选:

代码语言:javascript
复制
// 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对密码进行哈希处理:

代码语言:javascript
复制
$password = filter_input(INPUT_POST, 'password', FILTER_UNSAFE_RAW);
$hashed   = password_hash($password, PASSWORD_BCRYPT);

用于验证密码的...and:

代码语言:javascript
复制
$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

代码语言:javascript
复制
$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
EN

Stack Overflow用户

发布于 2015-07-25 06:43:35

要防止SQL注入并使转义输入变得容易,请使用prepared statements

处理HTML输入取决于允许什么,以及您是否希望某些输入接受HTML。

如果您不想输入超文本标记语言,可以选择使用strip_tags从输入中完全删除超文本标记语言,然后进一步验证。

当您想要显示数据库中来自用户输入的值时,可以使用htmlspecialcharshtmlentities,这样所有的HTML标记都将从<转换为&lt;,这样输出就不会被解析为HTML,从而允许人们在您的页面上放置恶意链接或脚本标记。

票数 0
EN

Stack Overflow用户

发布于 2015-07-25 06:44:47

我不太确定你是只有一张登录表,还是你也有一张注册表。如果您有一个向数据库提交数据的注册表单,那么您应该尝试阅读有关sanitizing的内容。这种做法已经对数据库中的XSS注入有很大帮助。需要注意的一件事是,不要在清理密码字段上花费太多精力,因为您不想弄乱用户密码。

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

老实说,我推荐使用像河豚这样的东西,它很健壮。

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

代码语言:javascript
复制
public static function createSalt($aLength = 16, $aCost = 10){
    $salt = strtr(base64_encode(mcrypt_create_iv($aLength)), '+', '.');
    $salt = sprintf("$2y$%02d$", $aCost) . $salt;
    return $salt;
}

以及如何创建密码

代码语言:javascript
复制
public static function createPassword($aPassword, $aSalt) {
    return crypt($aPassword, $aSalt);
}

然后,您将能够根据用户输入+ salt创建一个密码。

附注:对数据库中插入的值进行转义总是一个好主意。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31620663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档