Protection against SQL injection
下面的php mysql语句是否可以防止SQL注入?
1 | $strSQL ="SELECT * FROM Benutzer WHERE Benutzername = '".$Benutzer."' AND Password = '".md5($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"="ahi" or"a"="a ,hi" or 1=1 ,
--hi' or 1=1 -- ,hi' or 'a'='a ,hi') or ('a'='a andhi") 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这样的算法,因为碰撞的可能性较低。你也应该加盐你的密码,否则人们可以使用彩虹表破解你的密码。
另外,使用
如果安全性应该尽可能高,那么您应该使用其他散列方法,而不是MD5,例如sha256。另外,使用密码salt。
一定要去掉任何公共内容的标签(或者使用你自己的HTML过滤器),以防止XSS。
The security standards should be as high as possible.
如果MD5包含在您的设计中,没有人会扬起眉毛或向自己吐咖啡,那么您需要与客户重新讨论安全问题。如果安全性如此关键,他们需要快速启动,让安全专家加入您的团队。每个人都说他们想要安全代码。很少有人愿意为此付出代价,所以很少有人真正得到它。
尝试使用
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):