> </p> <p><input type="submit" name="submit" value="log in"/> </p> </form>
此 HTML 标记存在什么问题?为密码字段选择的输入类型为 text,这意味着用户键入该字段的任何内容都会以明文形式显示在屏幕上。
您可以方便地将该类型更改为 password,并将该字段中的用户输入替换为一串星号。可靠吗?绝对可靠。不过,这一步骤在很多应用程序中会被忽略。事情虽小,但在安全方面会使人们感到不安。您愿意将钱存入休息大厅的窗口被严重毁坏的银行吗?也许您会。但是您可能更期望银行是完好无损的。对于应用程序来说,道理相同。
让我们继续介绍处理表单提交的 verify.php 文件。
清单 2. 简单的 PHP 登录验证
<?php $user = $_POST['user']; $pw = $_POST['password'];
$sql = "select user,password from users where user='$user' and password='$pw' limit 1'; $result = mysql_query($sql);
if (mysql_num_rows($result)){ //we have a match! }else{ //no match }
?>
读阅到此,您会露出满意的微笑。等待阅读本文加密部分的部分读者可能变得不耐烦了,但是加密仅为安全问题的一部分。您还必须聪明地处理引入的用户数据。developerWorks 教程 “锁定您的 PHP 应用程序”(请参阅参考资料)讨论了 SQL 注射:将不正常的数据发送到数据库可导致有害或无根据的访问。无论您使用多少个加密,公开弱点没有一点好处。
您应遵循下面的传统安全原则:“不信任用户提供的数据” 和 “深层防御”;清除传入数据并通过转义传入的字符串保护数据库(参见清单 3)。深层防御是将多余的安全方法都妥善保管 —— 不仅包括加密,还包括用户所提供数据的智能处理。 清单 3. 保护 PHP 形式解析免受用户数据操作的影响
<?php $user = strip_tags(substr($_POST['user'],0,32)); $pw = strip_tags(substr($_POST['password'],0,32));
$sql = "select user,password from users where user='". mysql_real_escape_string($user)."' and password='". mysql_real_escape_string($pw)."' limit 1'; $result = mysql_query($sql);
if (mysql_num_rows($result)){ //we have a match! }else{ //no match } ?>
通过合理使用 strip_tags()、substr() 和 mysql_real_escape_string(),可以删除任何潜在的有害命令,将字符串减少到 32 个字符,并去掉所有特殊字符,数据库可能将这些字符解释为非预期命令字符串的一部分。
在这一过程结束时,数据库中仍有一个明文密码。您不能显示它。最容易的修复方法是使用 PHP 的内置 crypt() 功能。
使用 crypt()
PHP 的内置 crypt() 功能可实现单向加密 或单向散列。它只所以是单向的,是因为在对某内容进行 上一页 [1] [2] [3] [4] [5] [6] 下一页 |