必须清理散列密码?
Hashed password must be sanitized?
这只是一种好奇。如果您在将密码插入查询之前对其进行加密(使用 sha1 或其他方法),则必须对其进行清理?或者哈希的结果总是安全的?
这个简单的代码安全吗?
$salt = "123xcv";
$password = $_POST['password'];
$password = sha1($password+$salt);
$query = "select * from user where password='$password'";
The value is returned as a string of 40 hex digits, or NULL if the argument was NULL.
假设您有足够大的 varchar
列,则无需进行清理。
这就是说,使用 prepared statements 总是更干净,没有理由只是连接字符串来构建查询。
除非您以某种方式验证了输入,否则您不应该假设它将始终 return 是一个安全的输出,因为诸如 SHA1 之类的函数可能 return 错误如果给出意外输入的值。例如:
echo '<?php echo sha1(''); ?>' | php
Warning: sha1() expects at least 1 parameter, 0 given in - on line 1
而这个输出显然违反了"it's always a hex string"的假设。其他语言中的其他散列函数可以呈现另一种行为。
除此之外,上述密码哈希码方案 ($password = sha1($password+$salt);
) 非常 弱 (see why),我强烈建议不要使用它即使在一个例子中,因为最终保证有人会在 Whosebug 上找到它并在生产中使用。
此外,如上所述,通过连接字符串构建 SQL 查询也是一种不好的做法,将来可能会导致安全问题:今天查询中的唯一参数将是密码,明天有人决定添加一些其他选项,我敢打赌他们不会重写查询,而只是使用已经存在的模板...
这个sql注入问题是出于一种常见的错觉而提出的。
事实上,根本没有"sanitization"这样的东西,也没有任何函数可以执行这种不存在的任务。以及没有 "safe" 或 "unsafe" 数据。只要您遵循简单的规则,每个数据都是 "safe"。
更不用说程序员有很多更重要的事情要记住,除了某些特定数据在某些特定上下文中 "safe"。
您真正需要的是,完全避免使用原始 SQL 这种愚蠢的查询,使用 ORM 运行 SQL为你。虽然在极少数情况下,当您确实需要 运行 复杂查询时,您必须使用 placeholders 来替换您的 every variable询问。
这只是一种好奇。如果您在将密码插入查询之前对其进行加密(使用 sha1 或其他方法),则必须对其进行清理?或者哈希的结果总是安全的?
这个简单的代码安全吗?
$salt = "123xcv";
$password = $_POST['password'];
$password = sha1($password+$salt);
$query = "select * from user where password='$password'";
The value is returned as a string of 40 hex digits, or NULL if the argument was NULL.
假设您有足够大的 varchar
列,则无需进行清理。
这就是说,使用 prepared statements 总是更干净,没有理由只是连接字符串来构建查询。
除非您以某种方式验证了输入,否则您不应该假设它将始终 return 是一个安全的输出,因为诸如 SHA1 之类的函数可能 return 错误如果给出意外输入的值。例如:
echo '<?php echo sha1(''); ?>' | php
Warning: sha1() expects at least 1 parameter, 0 given in - on line 1
而这个输出显然违反了"it's always a hex string"的假设。其他语言中的其他散列函数可以呈现另一种行为。
除此之外,上述密码哈希码方案 ($password = sha1($password+$salt);
) 非常 弱 (see why),我强烈建议不要使用它即使在一个例子中,因为最终保证有人会在 Whosebug 上找到它并在生产中使用。
此外,如上所述,通过连接字符串构建 SQL 查询也是一种不好的做法,将来可能会导致安全问题:今天查询中的唯一参数将是密码,明天有人决定添加一些其他选项,我敢打赌他们不会重写查询,而只是使用已经存在的模板...
这个sql注入问题是出于一种常见的错觉而提出的。
事实上,根本没有"sanitization"这样的东西,也没有任何函数可以执行这种不存在的任务。以及没有 "safe" 或 "unsafe" 数据。只要您遵循简单的规则,每个数据都是 "safe"。
更不用说程序员有很多更重要的事情要记住,除了某些特定数据在某些特定上下文中 "safe"。
您真正需要的是,完全避免使用原始 SQL 这种愚蠢的查询,使用 ORM 运行 SQL为你。虽然在极少数情况下,当您确实需要 运行 复杂查询时,您必须使用 placeholders 来替换您的 every variable询问。