2012-03-30 179 views
1

我看到几个例子和人们用这种方式在登录表单中查询数据库。 我不完全确定这是做登录表单安全的最佳方式。用于登录表单的简单sql注入解决方案?

这是在PHP中查询:

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

足够有MD5()上的密码后,以避免SQL注入? 我认为md5函数会将所有字符和sql字符串转换为32个char字符串。

我可以使用哪些其他方式保护登录表单?

回答

6

mysql_real_escape_string($_POST['username'])

虽然这是更好地使用mysqli推广和使用准备好的语句。

(假设你使用MySQL)

编辑:针对下面的评论,它可能是很好用这个LIKE查询:

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

+1

+1对于准备好的语句 - 将要插入的数据传递为**数据**要比将您写入的SQL字符串与来自用户的不受信任的字符串混合在一起 – Deebster 2012-03-30 15:41:22

+0

明确+1准备好的语句......介意你**“mysql_real_escape_string()”**不会转义“%”。请查看php.net/manual/en/function.mysql-real-escape-string.php – 2012-03-30 15:45:28

+1

中的注释部分是的,尽管这只是使用LIKE时的一个问题。你可以使用'addcslashes()'来提供帮助。 – MichaelRushton 2012-03-30 15:48:49

0

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

如果您使用的是像CodeIgniter这样的框架,那么您可以使用它们的内部功能,它可以消除任何XSS风险的$ _POST或$ _GET输入。否则,我建议这些帖子:

0

您需要越狱$_POST['username']以及

和是md5将保护您免受sql注入。

在这个例子中,这样的事情将是确定

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

'MD5'的用户名? – MichaelRushton 2012-03-30 15:40:44

+0

不是一个好主意,我知道,在问题的上下文中作出回应,但不是比较用户名,而是比较md5的用户名。至少,这种方式你不需要担心登录注入。 – marvin 2012-03-30 15:50:43

+0

直到他试图将'INSERT'或'UPDATE'设置为''''usern'。 :) – MichaelRushton 2012-03-30 15:52:23

0

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

准备好的语句基本上会描述语句将如何构造,并在之后添加数据。这样,用户就不能用输入数据改变语句的结构。

0

如果你把它进行消毒的所有帖子,并让你安全

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

你也可以用use PDO and statements变量,并PDO将自动清洗的功能。

0
<?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是Best way to stop SQL Injection in PHP

0

只是一个简单的解决方案使用了类似的用户名和密码字段参数,使SQL命令字符串可分离从参数发送,然后攻击者将只能得到空白responses.When参数使用的SQL命令字符串将与参数分开并编译。使用准备好的语句是最佳解决方案。