防止SQL注入

时间:2009-09-22 13:18:59

标签: php security sql-injection

以下PHP MySQL语句是否可以防止SQL注入?

$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,{{ 1}},hi" or "a"="ahi" or 1=1 --hi' or 1=1 --hi' or 'a'='ahi') or ('a'='a

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

7 个答案:

答案 0 :(得分:10)

您可能希望查看参数化查询以查询数据库。这消除了SQL注入攻击。

我主要使用postgreSQL,执行此类查询的格式如下所示:

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

大多数数据库都具有与此功能相似的功能。

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

凯尔

答案 1 :(得分:5)

我个人建议在MD5上使用SHA1等算法,因为碰撞的可能性较低。您也应该salting your passwords,否则可以使用rainbow tables破解您的密码。

另外,使用mysql_real_escape_string()来逃避事情,不要只是进行搜索并替换普通注射。

答案 2 :(得分:5)

答案 3 :(得分:2)

如果安全性应该尽可能高,你应该使用一些其他散列方法而不是md5 - 例如SHA256。另外,使用密码盐。

答案 4 :(得分:0)

尝试使用mysql_real_escape_string()

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

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

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

AND Passwort = '".md5(mysql_real_escape_string($PW))."'"
根据输入文本,

可能会产生不同的结果。

是的,还要为此密码添加一些“盐”。对于一些想法你喜欢这个

SHA1(MD5($通)):
  SHA1($盐$通):
  SHA1($ $通盐):
  SHA1($用户名$通):
  SHA1(。$ $用户名通$盐):

答案 5 :(得分:0)

  

安全标准应尽可能高。

如果md5被包含在您的设计中,没有人抬起眉毛或者自己吐咖啡,那么您需要重新审视客户端的安全问题。如果安全性非常重要,他们需要为安全专家加入您的团队。每个人都说他们想要安全的代码。很少有人愿意为此付出代价,因此实际上很少得到它。

答案 6 :(得分:0)

请务必strip_tags任何公开内容(或使用您自己的html过滤器)以防止XSS。