我看到了几个例子和一些人使用这种方式在登录表单中查询数据库。我不完全确定这是否是安全登录表单的最佳方式。
这是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命令字符串将与参数分开进行解析和编译。使用事先准备好的语句是最好的解决方案。