以下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"="a
,hi" or 1=1 --
,hi' or 1=1 --
,hi' or 'a'='a
和hi') or ('a'='a
。
我错过了什么吗?我应该使用不同的方法来防止SQL注入吗?
答案 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)
Prepared statements是一项了不起的发明。
http://www.php.net/manual/en/pdo.prepare.php和http://www.php.net/manual/en/mysqli.prepare.php示例。
答案 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。