公众号:SAP Technical
本文作者:matinal
 

前言部分

SQL语法允许开放SQL语句的每子句动态指定作为在括号中指定一个数据对象的内容。如果其中一个数据对象的全部或部分内容来自程序外部,则存在以下SQL注入之一的风险:

访问非允许的数据库表

如果动态指定的数据库表完全或部分来自程序外部,则用户可能会访问他们通常没有授权的数据库。如果在动态指定的数据库表中使用外部输入是不可避免的,则必须正确检查输入。

在以下程序部分中,方法CHECK_TABLE_NAME_STR仅允许访问飞行数据模型的表。来自其他或不存在的数据库表的输入被拒绝。也不允许访问超大数据库表,以避免对系统性能造成太大压力。

DATA dbtab TYPE string.
cl_demo_input=>request( CHANGING field = dbtab ). TRY.
dbtab =
cl_abap_dyn_prg=>check_table_name_str(
val = to_upper( dbtab )
packages = 'SAPBC_DATAMODEL' ).
CATCH cx_abap_not_a_table cx_abap_not_in_package.
cl_demo_output=>display( 'Wrong input' ).
LEAVE PROGRAM.
ENDTRY. DATA dref TYPE REF TO data.
FIELD-SYMBOLS <fs> TYPE STANDARD TABLE.
CREATE DATA dref TYPE STANDARD TABLE OF (dbtab)
WITH EMPTY KEY.
ASSIGN dref->* TO <fs>. DATA lines TYPE i.
SELECT COUNT(*)
FROM (dbtab)
INTO (@lines).
IF lines > 1000.
cl_demo_output=>display( 'Table too large' ).
LEAVE PROGRAM.
ENDIF. SELECT *
FROM (dbtab)
INTO TABLE @<fs>.
cl_demo_output=>display( <fs> ).

访问非允许的表列用户可能会访问为他们通常没有授权表列。用户还可以未经许可重命名列,或使用聚合函数执行未经授权的计算。如果在动态指定的表列中使用外部输入是不可避免的,则必须正确检查输入。

注意点:
在GROUP BY之后指定列时,相同的安全建议适用于在SELECT之后直接动态指定的列。

动态WHERE条件的操作

如果动态WHERE条件完全或部分来自程序外部,则用户可能会访问他们通常没有授权的数据。如果无法避免在动态WHERE条件中使用外部输入 ,则必须正确检查输入并且通常也会屏蔽输入。

注意点:
动态指定HAVING条件时,应用与动态WHERE条件相同的安全建议。

在以下程序部分中,通过使用类CL_ABAP_DYN_PRG的方法QUOTE来防止潜在的SQL注入,该方法在开头和结尾添加引号。如果未使用此方法,并且输入“x'OR name <>' ”,则会显示SCUSTOM表中的所有数据。

DATA name TYPE string.
DATA customers TYPE TABLE OF scustom WITH EMPTY KEY. cl_demo_input=>request( CHANGING field = name ). DATA(cond) = `country = 'DE' AND name = ` &&
cl_abap_dyn_prg=>quote( name ). TRY.
SELECT * FROM scustom
WHERE (cond)
INTO TABLE @customers.
cl_demo_output=>display( customers ).
CATCH cx_sy_dynamic_osql_syntax.
cl_demo_output=>display( 'Wrong input' ).
ENDTRY.

操纵动态变化表达式

如果动态更改表达式完全或部分来自程序外部,则用户可能会更改他们通常没有授权的数据。如果无法避免在动态更改表达式中使用外部输入,则必须正确检查输入并且通常也会屏蔽输入。

在以下程序部分中,通过使用类CL_ABAP_DYN_PRG的方法QUOTE来防止潜在的SQL注入,该方法在开头和结尾添加引号。如果未使用此方法,并且例如,如果在其中一个输入字段中输入“ ...'discount = '90 ”,则相关客户的折扣将设置为90。

DATA in TYPE REF TO if_demo_input. 

DATA customer TYPE scustom. 

DATA: id TYPE scustom-id,
name TYPE string,
street TYPE string,
city TYPE string,
postcode TYPE string. id = '00000001'.
SELECT SINGLE *
FROM scustom
WHERE id = @id
INTO @customer. name = customer-name.
street = customer-street.
city = customer-city.
postcode = customer-postcode. in = cl_demo_input=>new( ).
in->add_field( CHANGING field = name
)->add_field( CHANGING field = street
)->add_field( CHANGING field = city
)->add_field( CHANGING field = postcode
)->request( ). DATA(set_expr) =
COND string( WHEN name IS NOT INITIAL
THEN ` NAME = ` &&
cl_abap_dyn_prg=>quote( name ) ) &&
COND string( WHEN street IS NOT INITIAL
THEN ` STREET = ` &&
cl_abap_dyn_prg=>quote( street ) ) &&
COND string( WHEN city IS NOT INITIAL
THEN ` CITY = ` &&
cl_abap_dyn_prg=>quote( city ) ) &&
COND string( WHEN postcode IS NOT INITIAL
THEN ` POSTCODE = ` &&
cl_abap_dyn_prg=>quote( postcode ) ). TRY.
UPDATE scustom SET (set_expr) WHERE id = @id.
CATCH cx_sy_dynamic_osql_syntax.
cl_demo_output=>display( 'Wrong input' ).
ENDTRY.

【第六篇】SAP ABAP7.5x新语法之SQL注入的更多相关文章

  1. 【第二篇】SAP ABAP7.5x新语法之OPEN SQL

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:SAP ABAP7.5x系列之OPEN SQL ...

  2. 【第七篇】SAP ABAP7.5x新语法之F4增强

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:SAP ABAP7.5x系列之F4增强 前言部分 ...

  3. 【第八篇】SAP ABAP7.5x新语法之F4增强【续】

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:SAP ABAP7.5x系列之F4增强[续]   ...

  4. 【第五篇】SAP ABAP7.5x新语法之命名规约

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:SAP ABAP7.5x系列之命名规约   命名 ...

  5. 【第四篇】SAP ABAP7.5x新语法之CREATE DATA&INTERFACE

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文地址:SAP ABAP7.5x系列之CREATE DA ...

  6. 【第三篇】SAP ABAP7.5x新语法之程序结构&SubScreen

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文地址:SAP ABAP7.5x系列之程序结构& ...

  7. 【第一篇】SAP ABAP7.5x新语法之预定义数据结构

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:SAP ABAP7.5x系列之预定义数据结构 前 ...

  8. 【ABAP系列】SAP ABAP7.40新语法简介第一篇

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP7.40新语法简 ...

  9. 【ABAP系列】SAP ABAP7.40新语法简介第二篇

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP7.40新语法简 ...

随机推荐

  1. 测试工具之RobotFramework安装

    Robot Framework很多公司再用,图形化界面,类表格填写关键字和参数,几乎不需要编码知识,上手很快 最近看到某满公司使用的就是这个工具,特地看了下,确实很简单,对于初入测试行业的人来说是个很 ...

  2. CentOS 6.5的安装详解(图文详解)

    不多说,直接上干货! 主流: 目前的Linux操作系统主要应用于生产环境, 主流企业级Linux系统仍旧是RedHat或者CentOS. 免费: RedHat 和CentOS差别不大,CentOS是一 ...

  3. PHP-CPP开发扩展(三)

    PHP-CPP是一个用于开发PHP扩展的C++库.本节讲解PHP函数形参相关的实现. 指定函数参数类型 有时候,我们需要指定函数的形参是数组或者指定的,那么在PHP-CPP里是否可以指定函数的参数类型 ...

  4. U盘上安装Ubuntu系统 便捷式系统 - 赖大大

    简单介绍: U盘可以作为电脑的磁盘使用,在U盘上安装Ubuntu系统,只要有电脑,就可以轻松打开自己的系统, 方便又快捷,非常适合出差工作,学习使用. 另外,插入U盘后,需要我们就入电脑的Blos模式 ...

  5. Jenkins 批量删除历史构建

    在一次巡查 Jenkins 时,发现很多个项目的历史构建比较多,这些历史构建对于现在来说又没有什么用处,那么想把它删除,但是一个一个删除很累,毕竟总共加起来有上千个,历史构建,而且还不只是一个项目.那 ...

  6. 程序员进阶之算法练习:LeetCode专场

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由落影发表 前言 LeetCode上的题目是大公司面试常见的算法题,今天的目标是拿下5道算法题: 题目1是基于链表的大数加法,既考察基本 ...

  7. jquery插入,复制、替换和删除节点

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  8. spring-boot-2.0.3启动源码篇二 - run方法(一)之SpringApplicationRunListener

    前言 Springboot启动源码系列还只写了一篇,已经过去一周,又到了每周一更的时间了(是不是很熟悉?),大家有没有很期待了?我会尽量保证启动源码系列每周一更,争取不让大家每周的期望落空.一周之中可 ...

  9. spring-boot-2.0.3启动源码篇五 - run方法(四)之prepareContext

    前言 此系列是针对springboot的启动,旨在于和大家一起来看看springboot启动的过程中到底做了一些什么事.如果大家对springboot的源码有所研究,可以挑些自己感兴趣或者对自己有帮助 ...

  10. 一篇迟到的gulp文章,代码合并压缩,less编译

    前言 这篇文章本应该在去年17年写的,但因为种种原因没有写,其实主要是因为懒(捂脸).gulp出来的时间已经很早了,16年的时候还很流行,到17年就被webpack 碾压下去了,不过由于本人接触gul ...