由于在构造查询语句的时候,会拼接来自用户输入的数据,如果没有对用户输入数据作适当的过滤,用户就可以构造一些特殊的数据,通过服务器返回的错误信息来获取数据库中的信息,当然包括用户名密码类的敏感数据,甚至直接修改数据。
比如:简单的查询sql="select*fromabcwherea='"+x+"'";
构造特殊的x:sql="select*fromabcwherea='"+"'having'1'='1"+"'";//由于没有groupby语句而单独使用having,将会出错,服务器返回错误信息,错误信息中会包括比如字段名称,数据库名称等等一些。获取这些信息后,就可以进一步构造特殊语句获取更多信息。
所以防注入的2个要点就是:过滤和屏蔽错误提示。