关于php:防止SQL注入

Protection against SQL injection

本问题已经有最佳答案,请猛点这里访问。

下面的php mysql语句是否可以防止SQL注入?

1
$strSQL ="SELECT * FROM Benutzer WHERE Benutzername = '".$Benutzer."' AND Password = '".md5($PW)."'";

变量$Benutzer$PW是用户的输入。

我们根据常见的SQL注入技术检查用户名和密码:

' or 0=0 --, " or 0=0 --, or 0=0
--
, ' or 0=0 #, " or 0=0 #, or 0=0 #, ' or 'x'='x, " or"x"="x,
') or ('x'='x, ' or 1=1--, " or
1=1--
, or 1=1--, ' or a=a--, "
or"a"="a
, ') or ('a'='a, ") or
("a"="a
, hi" or"a"="a, hi" or 1=1
--
, hi' or 1=1 --, hi' or 'a'='a, hi') or ('a'='a and hi") or
("a"="a
.

我错过什么了吗?我应该使用不同的方法来防止SQL注入吗?


您可能需要研究用于查询数据库的参数化查询。这消除了SQL注入攻击。

我主要使用PostgreSQL,这样的查询格式如下:

1
2
3
$query = 'select * from Benutzer where Benutzername = $1 and Passwort = $2';
$params = array($Benutzer, md5($PW));
$results = pg_query_params($query, $params);

大多数数据库都具有类似于此功能的功能。

我希望这有帮助,祝你好运!

凯尔


准备好的陈述是一项了不起的发明。

例如http://www.php.net/manual/en/pdo.prepare.php和http://www.php.net/manual/en/mysqli.prepare.php。


我个人建议在MD5上使用sha1这样的算法,因为碰撞的可能性较低。你也应该加盐你的密码,否则人们可以使用彩虹表破解你的密码。

另外,使用mysql_real_escape_string()来逃避事情,而不是简单地搜索和替换常见的注射。


如果安全性应该尽可能高,那么您应该使用其他散列方法,而不是MD5,例如sha256。另外,使用密码salt。


一定要去掉任何公共内容的标签(或者使用你自己的HTML过滤器),以防止XSS。


The security standards should be as high as possible.

如果MD5包含在您的设计中,没有人会扬起眉毛或向自己吐咖啡,那么您需要与客户重新讨论安全问题。如果安全性如此关键,他们需要快速启动,让安全专家加入您的团队。每个人都说他们想要安全代码。很少有人愿意为此付出代价,所以很少有人真正得到它。


尝试使用mysql_real_escape_string()

1
2
3
4
$strSQL ="SELECT *
        FROM Benutzer
        WHERE Benutzername = '"
.mysql_real_escape_string($Benutzer)."'
        AND Passwort = '"
.mysql_real_escape_string(md5($PW))."'";

确保当用户注册时,使用相同的技术进行注册。例如,

1
AND Passwort = '".mysql_real_escape_string(md5($PW))."'"

1
AND Passwort = '".md5(mysql_real_escape_string($PW))."'"

可能会根据输入文本产生不同的结果。

是的,还可以在这个密码中添加一些"salt"。对于一些想法,你喜欢这样

sha1(MD5($pass)):sha1($salt.$pass):sha1($pass.$salt):sha1($username.$pass):sha1($username.$pass.$salt):