我看到很多关于mysqli的文章和问题,它们都声称可以防止sql注入。但是它是否百分之百可靠,还是有一些方法可以绕过它。我不关心跨站脚本或网络钓鱼攻击,只关心sql注入。
我一开始应该说的是,我正在使用预处理语句。这就是我所说的mysqli。如果我在没有任何字符串连接的情况下使用预处理语句,那么它是否百分之百可靠?
我看到很多关于mysqli的文章和问题,它们都声称可以防止sql注入。但是它是否百分之百可靠,还是有一些方法可以绕过它。我不关心跨站脚本或网络钓鱼攻击,只关心sql注入。
我一开始应该说的是,我正在使用预处理语句。这就是我所说的mysqli。如果我在没有任何字符串连接的情况下使用预处理语句,那么它是否百分之百可靠?
但它是否毫无漏洞,或者还有什么方法可以绕过它呢。
不是的,你必须知道你在做什么。如果使用绑定参数(MySqli提供的一个功能),则完全可以从这种攻击向量中完全安全地防止注入类型攻击。这不能阻止程序员直接嵌入字符串,从而使注入攻击成为可能。你必须按照设计意图使用该功能。
我一开始应该说的是我正在使用准备好的语句(prepared statements)。那么,如果我使用准备好的语句而没有任何字符串拼接,那么它就是绝对安全的吗?
“绝对安全”仍然是一个非常危险的词。但是,通过准备好的语句绑定变量,你可以避免注入攻击。这是因为绑定参数与 SQL 查询分开传输。采用“传统”的嵌入字符串方法时,数据库服务器需要解析输入,这其中存在许多边缘情况(字符集等)。当数据和查询分别发送时,实际上不存在解析(至少不解析变量数据)。
它并不能比旧的mysql模块更好地防止SQL注入,只是让开发者更容易做到这一点,现在可以使用预处理语句而不是调用mysql_real_escape_string。