在检索过程中使用mysql_real_escape_string函数
在这段代码中,使用了mysql_real_escape_string函数对从$_POST['username']和$_POST['password']接收到的数据进行了转义处理,并在检索数据时使用了mysql_real_escape_string函数。这是因为检索数据时最容易发生注入攻击。为了防止类似Facebook去年的黑客事件发生,需要在检索数据时进行转义处理。
然而,在新的代码中不应该使用mysql_*函数,也不应该使用md5加密密码。建议使用SHA1或者bcrypt来代替。所以,在插入数据时进行转义处理,在检索数据时再次进行转义处理是一个好的做法。
此外,建议在输入时进行验证和过滤,在插入数据时进行SQL转义,根据过滤的方式可以选择是否进行输出转义。
可以尝试使用sha512加密。Charles在这里是正确的。许多注入攻击可以使用md5,这可能会构成威胁。可以使用一个$hash salt与sha1或者bcrypt结合使用,例如$hash_salt = "fGMNIub43kJHb5T6kl",然后将其添加到所有检索到的数据中。
在查询中,对于任何和所有进入查询的内容都需要进行SQL转义处理。对于在HTML环境中呈现的内容需要进行HTML转义处理。除非将数据插入数据库,否则不要使用SQL转义函数。代码中的stripslashes函数的使用暗示这段代码只适用于PHP环境配置不当的情况。
mysql_real_escape_string during retrieval
在从数据库检索数据时,不应该使用mysql_real_escape_string()
(以及它的更现代版本mysqli::real_escape_string()
)。转义数据以便插入数据库的唯一原因是因为您正在将其作为另一种语言(SQL)中的字符串数据进行组装。这就是转义的目的。如果有一个API调用,您可以将所有元素作为离散参数提供,那么您就不需要转义数据。但是SQL并不是这样工作的。
类似地,只有在无法关闭PHP实例中的魔术引号时,才需要使用stripslashes()
。
如果无法关闭魔术引号,请将您的应用程序托管到其他地方。打开魔术引号是不可思议的。