现在的位置: 首页 > 综合 > 正文

java中的sql参数和sql注入

2013年08月11日 ⁄ 综合 ⁄ 共 1192字 ⁄ 字号 评论关闭

 

当今,大多数程序都会或多或少地使用SQL语句和数据库打交道。在程序代码中,SQL语句以字符串的形式存在,如“SELECT column1, column2, … FROM table1 WHERE param_column1 = value1 AND param_column2 =‘value2’ ”。这个例子以数据列param_column1、param_column2的值分别为value1、value2作为过滤条件,从数据表table1中查询column1、column2等数据列。其中param_column1为整数类型,param_column2为字符串类型。
很多时候,value1与value2的值在程序运行时才能确定,这意味着SQL语句只能在程序运行中动态生成。不少开发人员喜欢采用字符串拼凑的方式生成SQL语句,形如 “SELECT column1, column2, … FROM table1 WHERE param_column1 = ” + int_to_str( int_value )+ “ AND param_column2 =‘ ” + str_value + “ ’ ”。C程序员可能更倾向于选择格式化字符串的方式,其中格式类似于 “SELECT column1, column2,… FROM table1 WHERE param_column1 = %d AND param_column2 =‘ %s ’ ”,在实际的值代替%后,SQL语句发送给数据库引擎。
从SQL执行的角度看,字符串格式化与字符串拼凑并没有太大的差别。每次查询条件稍有变化,都会向数据库提交不同的SQL语句。这些SQL语句之间虽然差别可能很小,但查询引擎每次都得重新解析,造成执行效率的降低。另外,如果上面的例子中,如果param_column1或param_column2是二进制类型的数据,则要生成SQL语句显然很麻烦。更为重要的是,这种生成SQL语句的方式存在安全隐患,很容易导致SQL注入式攻击。又以上面的SQL语句为例,如果攻击者为param_column2指定的值为“ ’ OR ‘’ = ‘ ”(不包含双引号),则得到的SQL语句为“SELECT column1, column2, … FROM table1 WHERE param_column1 = value1 AND param_column2 =‘’ OR ‘’ = ‘’ ”,使WHERE子句形同虚设,table1中所有的记录都会查询出来。如果攻击者更缺德一点,为param_column2指定的值为“ ’;DELETE FROM table1 WHERE ‘’ = ‘”(不包含双引号),则得到的SQL语句为“SELECT column1, column2, … FROM table1 WHERE param_column1 = 0 AND param_column2 =‘’;DELETE FROM table1 WHERE ‘’ = ‘’ ”,执行之后,数据表table1就被清空了。
 

抱歉!评论已关闭.