Php MYSQL注入和md5加密

Php MYSQL注入和md5加密,php,mysql,encryption,md5,code-injection,Php,Mysql,Encryption,Md5,Code Injection,如果我用md5加密MYSQL注入,它还会执行吗?如果我在执行“MYSQL\u real\u escape\u string”之前对MYSQL注入进行加密,它是否能够使MYSQL注入为空?我应该在加密之前运行“mysql\u real\u escape\u string”吗 返回一个包含ASCII字符0-9和a-f的字符串。SQL注入需要使用像“或”这样的字符,因此md5()生成的哈希字符串永远不会导致SQL注入,因为算法可以正常工作 因此,你可以毫不担心地写这样的东西: $username =

如果我用md5加密MYSQL注入,它还会执行吗?如果我在执行“MYSQL\u real\u escape\u string”之前对MYSQL注入进行加密,它是否能够使MYSQL注入为空?我应该在加密之前运行“mysql\u real\u escape\u string”吗

返回一个包含ASCII字符0-9和a-f的字符串。SQL注入需要使用像
这样的字符,因此md5()生成的哈希字符串永远不会导致SQL注入,因为算法可以正常工作

因此,你可以毫不担心地写这样的东西:

$username = mysql_real_escape_string( $_POST['username'] );
$password = md5( $_POST['password'] );
mysql_query("SELECT * FROM users WHERE user='$username' AND pass='$password'");
但是,最好总是转义传递给查询的数据。

返回一个包含ASCII字符0-9和a-f的字符串。SQL注入需要使用类似于
'
的字符,因此md5()生成的哈希字符串永远不会导致SQL注入,考虑到该算法达到了预期的效果

因此,你可以毫不担心地写这样的东西:

$username = mysql_real_escape_string( $_POST['username'] );
$password = md5( $_POST['password'] );
mysql_query("SELECT * FROM users WHERE user='$username' AND pass='$password'");

但是,总是转义传递给查询的数据是一种很好的做法。

如果使用MD5对值进行散列,则该值不再包含任何恶意注入的字符。MySQL不会解码MD5散列并将其解释/执行为SQL。事实上,MD5散列无法解码,因为它是一种单向算法。

如果使用MD5对值进行散列,则它不再包含任何恶意注入字符。MySQL不会解码MD5散列并将其解释/执行为SQL。事实上,MD5散列无法解码,因为它是一种单向算法。

MD5散列值是二进制数据,在php中表示为十六进制。这意味着,它们只包含数字0..9和字母A..F。
SQL注入不能使用这些字母,因此您是安全的。

MD5哈希值是二进制数据,在php中表示为十六进制。这意味着,它们只包含数字0..9和字母A..F。
使用这些字母不可能进行SQL注入,因此您是安全的。

MD5哈希值本身不会导致SQL注入,但是如果您试图避免SQL注入,那么您的方法是导致SQL注入的一种非常好的方法

你将一类不能引起注入的变量(MD5'd密码)作为特例,然后将另一类变量(例如,计算为整数的事物)作为特例,然后忘记哪些应该转义,哪些不应该转义,最后得到的是一个应该转义但不应该转义的微小变量,团队中没有人发现它。。。。哎呀,你的代码中有一个真正的漏洞

你避免逃逸一个安全类,你避免逃逸第二个安全类,然后你错误地假设第三个安全类也是安全的——结果是,MD5采用了二进制编码,有人设法找到了一种方法来创建一个注入。。。哎呀。。。您的代码中还有一个真正的漏洞

你应该:

1) 始终使用参数化查询。这使得逃避变得不必要,避免了忘记逃避某事的风险。使用
mysqli
和:

2) 如果因为某种原因你不能,逃避一切。即使这是不必要的。你不想忘记什么


反对SQL注入的规则是:不要试图了解什么是安全的,什么不是安全的,假设一切都是不安全的,并将一切都视为不安全的。如果将安全值视为不安全值,程序仍将正常运行;如果将不安全值视为安全值,程序将包含一个巨大的安全漏洞,一个错误就足够了。

MD5哈希值本身不会导致SQL注入,但是,如果您试图避免SQL注入,那么您的方法是导致SQL注入的一个非常好的方法

你将一类不能引起注入的变量(MD5'd密码)作为特例,然后将另一类变量(例如,计算为整数的事物)作为特例,然后忘记哪些应该转义,哪些不应该转义,最后得到的是一个应该转义但不应该转义的微小变量,团队中没有人发现它。。。。哎呀,你的代码中有一个真正的漏洞

你避免逃逸一个安全类,你避免逃逸第二个安全类,然后你错误地假设第三个安全类也是安全的——结果是,MD5采用了二进制编码,有人设法找到了一种方法来创建一个注入。。。哎呀。。。您的代码中还有一个真正的漏洞

你应该:

1) 始终使用参数化查询。这使得逃避变得不必要,避免了忘记逃避某事的风险。使用
mysqli
和:

2) 如果因为某种原因你不能,逃避一切。即使这是不必要的。你不想忘记什么


反对SQL注入的规则是:不要试图了解什么是安全的,什么不是安全的,假设一切都是不安全的,并将一切都视为不安全的。如果将安全值视为不安全值,则程序仍将正常运行;如果将不安全值视为安全值,则程序将包含一个巨大的安全漏洞,一个错误就足够了。

而通常md5哈希值不能用于注入攻击,值得指出的是,rawmd5散列值可以被利用。原始md5哈希是使用
md5($userSubmittedValue,true)
——它们很容易受到攻击,因为输出是一个可以包含非十六进制输出的字符串。。虽然以原始形式生成哈希并不常见,但需要注意的是,技术上的哈希值可以在注入攻击中被利用

下面是一个如何实现的示例:


但是,正如其他人所指出的,十六进制md5输出不易受到注入攻击。

虽然通常md5哈希值不能用于注入攻击,但值得指出的是,rawmd5哈希值可以被利用。原始md5哈希是h