用于登录表单的简单sql注入解决方案


Simple sql injection solution for login forms?

我看到了几个例子和一些人使用这种方式在登录表单中查询数据库。我不完全确定这是否是安全登录表单的最佳方式。

这是PHP中的查询:

    $query = "SELECT * FROM users WHERE usern = '".$_POST['username']."' AND passw = '".md5($_POST['password'])."'";

在密码帖上有md5()就足够避免sql注入了吗?。我认为md5函数会将所有字符和sql字符串转换为一个32个字符的字符串。

还有哪些其他方式可以保护登录表单?

mysql_real_escape_string($_POST['username'])

尽管最好使用mysqli扩展并使用准备好的语句。

(假设您使用的是MySQL)

编辑:对于下面的评论,最好将其用于LIKE查询:

addcslashes(mysql_real_escape_string($_POST['username']), '%_')

在让数据靠近数据库之前,必须对数据进行消毒。最简单的方法是使用mysql_real_escape_string($_POST['username']),但这只是你最不需要做的

如果你使用的是像CodeIgniter这样的框架,你可以使用它们的内置功能,它可以去除$_POST或$_GET输入的任何XSS风险。否则,我推荐这些帖子:

  • 用PHP清理用户输入的最佳方法是什么
  • 清洁&PHP中的安全字符串

您还需要退出$_POST['username']

是的,md5将保护您免受sql注入的影响。

对于这个例子,像这样的东西是可以的

$query = "SELECT * FROM users WHERE MD5(usern) = '".md5($_POST['username'])."' AND passw = '".md5($_POST['password'])."'";

构建查询的方式允许在用户名中注入代码片段。您可以使用事先准备好的语句来避免:http://php.net/manual/en/pdo.prepared-statements.php

准备好的语句基本上会描述语句的结构,然后添加数据。这样,用户就不能用输入数据来改变语句的结构。

如果你制作了一个清除所有POST和GETS的函数,你就是安全的

function clean() { 
    foreach($_POST as $key => $val) { 
        $_POST[$key] = mysql_real_escape_string($val);
    } 
}

您还可以将PDO和语句与变量一起使用,PDO将自动清除。

<?php
try {
    $dbh = new PDO("mysql:host=$hostname;dbname=$db", $dbusername, $dbpassword);
    $query = "SELECT * FROM users WHERE usern = ? AND passw = ?";
    $sth=$dbh->prepare($sql);
    $sth->execute(array($_POST['username'], md5($_POST['password']));
    $result =  $sth->fetch();
}
} catch(PDOException $e) {
    echo $e->getMessage();
    exit;
}

PDO是在PHP 中停止SQL注入的最佳方式

只有一个简单的解决方案将参数用于用户名和密码等字段,这样SQL命令字符串就可以从参数中单独发送,然后攻击者只会得到空白响应。使用参数时,SQL命令字符串将与参数分开进行解析和编译。使用事先准备好的语句是最好的解决方案。