防止SQL注入

wil*_*ber 2 php security sql-injection

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

$strSQL = "SELECT * FROM Benutzer WHERE Benutzername = '".$Benutzer."' AND Password = '".md5($PW)."'";
Run Code Online (Sandbox Code Playgroud)

变量$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'='ahi") or ("a"="a.

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

Kyl*_*Dye 10

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

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

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

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

我希望这个帮助能祝你好运!

凯尔


Rya*_*Cue 5

我个人建议在MD5上使用SHA1等算法,因为碰撞的可能性较低.您也应该对您的密码进行腌制,否则可以使用彩虹表来破解您的密码.

此外,用于mysql_real_escape_string()逃避事物,不要简单地搜索和替换常见的注射.

  • 不,不要*使用字符串转义.字符串转义很容易做错,而且很难做对.使用绑定参数.绑定参数通过备用通道发送到数据库,因此不可能被解析为SQL. (9认同)
  • `mysql_real_escape_string()`是由MySQL服务器执行的,我相信MySQL的人知道一些关于正确使用这些东西的事情. (5认同)