公众号: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. Python内置类型(4)--数值

    Python有以下三种的数值类型: 整型(integers), 浮点型(floating point numbers), 以及 复数(complex numbers).此外,布尔是整数的子类型. 数值 ...

  2. DevExpress GridView自动滚动

    引言 最新有一个winform项目使用的是DevExpress的控件,所以最近都在摸索使用这套控件,实在是佩服整套控件的强大,同时代码写起来也简洁.客户有一个需求,希望报表结果能在外接的大屏幕上定时滚 ...

  3. Delphi常用快捷键

    delphi是我学编程时的入门语言,用过一年多的时光,个人对它还是挺喜欢的.现在用的少了,一些快捷键和语法也有些遗忘了,这里对delphi的快捷键做个总结,留个纪念.嘿嘿,不知道还有多少人还用着这门语 ...

  4. vuejs深入浅出—基础篇

    一.从HelloWorld说起 任何语言的都是从Hello World开始的,VueJs也不例外,直接上代码: <script src="https://unpkg.com/vue/d ...

  5. 负载均衡+session共享(memcached-session-manager实现)

    前言 先给大家伙拜个年,祝大家:新的一年健健康康,平平安安! 本文的形成参考了很多人的博客,最多的应该是青葱岁月兄的这篇博客,大家可以先去看下,熟悉一些内容,因为本文是直接实践,一些理论性的知识就需要 ...

  6. 深入浅出 JVM GC(2)

    # 前言 在 深入浅出 JVM GC(1) 中,限于上篇文章的篇幅,我们留下了一个问题 : 如何回收? 这篇文章将重点讲述这个问题. 在上篇文章中,我们也列出了一些大纲,今天我们就按照那个大纲来逐个讲 ...

  7. C#基础 数据类型 类型转换

    本节主要讲解数据类型和各类型之间的转换,两点都是重点,难点在于各种转换的活学活用. 一   数据类型 (一)基本数据类型 1  值类型 (1)整形         int                ...

  8. .net dll反编译出现的问题,以及部分修复的方法

    常用.net反编译工具 1.Reflector 9.0.2 2.JustDecompile2015.3.928.0j 3.ILSpy 4.CS资源文件批量转换工具 base.AutoScaleMode ...

  9. The Maze Makers(csu1566)

    1566: The Maze Makers Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 90  Solved: 33[Submit][Status][ ...

  10. Best way to learn android and java?

    Question: I have been getting my feet wet with android sdk, eclipse, and other various beginner step ...