Java - สตริงการยกเว้นเพื่อป้องกันการฉีด SQL


146

ฉันพยายามใส่ anti sql injection ใน java และฉันพบว่ามันยากมากที่จะทำงานกับฟังก์ชั่นสตริง "replaceAll" ในที่สุดฉันต้องฟังก์ชั่นที่จะแปลงใด ๆ ที่มีอยู่\ในการ\\ใด ๆ"เพื่อ\"ใด ๆ'ไป\'และใด ๆ\nไป\\nเพื่อที่ว่าเมื่อสตริงจะถูกประเมินโดยการฉีด MySQL SQL จะถูกปิดกั้น

ฉันได้เพิ่มโค้ดบางส่วนที่ฉันทำงานด้วยและ\\\\\\\\\\\ฟังก์ชั่นทั้งหมดทำให้ตาของฉันแย่ลง หากใครเกิดขึ้นมีตัวอย่างของเรื่องนี้ฉันจะขอบคุณมันมาก


1
ตกลงฉันมาที่การพูดคุยที่ PreparedStatements เป็นวิธีที่จะไป แต่จากอคติปัจจุบันที่ฉันต้องดำเนินการตามแผนเดิมและเพิ่งวางตัวกรองในเวลาและเมื่อเหตุการณ์สำคัญในปัจจุบันถึงฉันสามารถ ย้อนกลับและปรับฐานข้อมูลอีกครั้งเพื่อเตรียมสถานะ ในเวลาเฉลี่ยที่จะรักษาโมเมนตัมใครบางคนมีทางออกที่มีประสิทธิภาพเพื่อหลบหนีตัวละครด้านบนสำหรับ MySQL ที่ได้รับ Java และมันเป็นระบบการแสดงออกปกติเป็นความเจ็บปวดแน่นอนในการหาจำนวนหนีที่จำเป็น ....
Scott Bonner

2
คำสั่ง SQL บางรายการเท่านั้นที่สามารถกำหนดพารามิเตอร์ได้เช่น "SET ROLE role_name" หรือ "LISTEN channel_name"
Neil McGuigan

1
@NeilMcGuigan ใช่แล้ว ขับรถส่วนใหญ่ยังจะปฏิเสธที่จะ parameterize สิ่งที่ชอบCREATE VIEW myview AS SELECT * FROM mytable WHERE col = ?ตั้งแต่คำสั่งหลักคือDDL -statement แม้ว่าส่วนที่คุณกำลังพยายามที่จะ parameterize เป็นจริงดราก้อน
SeldomNeedy

คำตอบ:


249

PreparedStatements เป็นวิธีที่จะไปเพราะพวกเขาทำให้การฉีด SQL เป็นไปไม่ได้ ต่อไปนี้เป็นตัวอย่างง่ายๆที่จะให้อินพุตของผู้ใช้เป็นพารามิเตอร์:

public insertUser(String name, String email) {
   Connection conn = null;
   PreparedStatement stmt = null;
   try {
      conn = setupTheDatabaseConnectionSomehow();
      stmt = conn.prepareStatement("INSERT INTO person (name, email) values (?, ?)");
      stmt.setString(1, name);
      stmt.setString(2, email);
      stmt.executeUpdate();
   }
   finally {
      try {
         if (stmt != null) { stmt.close(); }
      }
      catch (Exception e) {
         // log this error
      }
      try {
         if (conn != null) { conn.close(); }
      }
      catch (Exception e) {
         // log this error
      }
   }
}

ไม่ว่าอักขระจะอยู่ในชื่อและอีเมลอักขระเหล่านั้นจะถูกวางในฐานข้อมูลโดยตรง พวกเขาจะไม่ส่งผลกระทบต่อคำสั่ง INSERT แต่อย่างใด

มีวิธีการตั้งค่าที่แตกต่างกันสำหรับประเภทข้อมูลที่แตกต่างกัน - วิธีใดที่คุณใช้ขึ้นอยู่กับว่าเขตข้อมูลของคุณคืออะไร ตัวอย่างเช่นหากคุณมีคอลัมน์ INTEGER ในฐานข้อมูลคุณควรใช้setIntวิธีการ PreparedStatement เอกสารแสดงวิธีการต่าง ๆ ทั้งหมดสำหรับการตั้งค่าและรับข้อมูล


1
ด้วยวิธีการนี้คุณสามารถปฏิบัติต่อทุกพารามิเตอร์เป็นสตริงและยังปลอดภัยหรือไม่ ฉันพยายามที่จะคิดหาวิธีที่จะปรับปรุงสถาปัตยกรรมที่มีอยู่เพื่อความปลอดภัยโดยไม่ต้องสร้างชั้นฐานข้อมูลทั้งหมด ...
สกอตต์บอนเนอร์

1
dynqmic SQL ทั้งหมดเป็นเพียงสตริงดังนั้นจึงไม่ใช่คำถามที่ถาม ฉันไม่คุ้นเคยกับ PrepStatement ดังนั้นคำถามจริงคือสร้างคิวรีแบบพารามิเตอร์ที่สามารถประมวลผลได้ด้วย ExecuteUpdate ถ้าใช่มันก็ดี ถ้าไม่ใช่นั่นเป็นเพียงการซ่อนปัญหาและคุณอาจไม่มีตัวเลือกที่ปลอดภัยยกเว้นการออกแบบเลเยอร์ฐานข้อมูลใหม่ การจัดการกับการฉีด SQL เป็นหนึ่งในสิ่งที่คุณต้องออกแบบตั้งแต่ต้น; ไม่ใช่สิ่งที่คุณสามารถเพิ่มได้อย่างง่ายดายในภายหลัง
Cylon Cat

2
หากคุณกำลังแทรกลงในฟิลด์ INTEGER คุณจะต้องใช้ 'setInt' เช่นเดียวกันฟิลด์ฐานข้อมูลตัวเลขอื่น ๆ จะใช้ตัวตั้งค่าอื่น ฉันโพสต์ลิงก์ไปยัง PreparedStatement docs ที่แสดงรายการตัวตั้งค่าทุกประเภท
Kaleb Brasee

2
ใช่ไซลอน PreparedStatements สร้างแบบสอบถามแบบมีพารามิเตอร์
Kaleb Brasee

2
@Kaleb Brasee ขอบคุณ เป็นเรื่องดีที่รู้ เครื่องมือมีความแตกต่างในทุกสภาพแวดล้อม แต่การลงแบบสอบถามที่กำหนดพารามิเตอร์เป็นคำตอบพื้นฐาน
Cylon Cat

46

วิธีเดียวในการป้องกัน SQL injection คือการใช้พารามิเตอร์แบบ SQL มันเป็นไปไม่ได้ที่จะสร้างตัวกรองที่ฉลาดกว่าคนที่แฮ็ค SQL เพื่อหาเลี้ยงชีพ

ดังนั้นใช้พารามิเตอร์สำหรับการป้อนข้อมูลการปรับปรุงและสถานที่ Dynamic SQL เป็นเพียงประตูเปิดสำหรับแฮกเกอร์และนั่นรวมถึง SQL แบบไดนามิกในขั้นตอนการจัดเก็บ Parameterize, parameterize, parameterize


11
และแม้กระทั่งการกำหนดพารามิเตอร์ SQL ไม่รับประกัน 100% แต่มันเป็นการเริ่มต้นที่ดีมาก
duffymo

2
@duffymo ฉันยอมรับว่าไม่มีอะไรปลอดภัย 100% คุณมีตัวอย่างของการฉีด SQL ที่จะทำงานได้แม้กับ SQL ที่มีพารามิเตอร์?
Cylon Cat

3
@Cylon Cat: แน่นอนเมื่อกลุ่มของ SQL (เช่น @WhereClause หรือ @tableName) ถูกส่งผ่านเป็นพารามิเตอร์เชื่อมต่อกันใน SQL และดำเนินการแบบไดนามิก การฉีด SQL เกิดขึ้นเมื่อคุณให้ผู้ใช้เขียนรหัสของคุณ ไม่สำคัญว่าคุณจะจับภาพรหัสของพวกเขาเป็นพารามิเตอร์หรือไม่
Steve Kass

16
BTW, ผมไม่ทราบว่าทำไมถึงไม่ได้กล่าวถึงมากขึ้น แต่การทำงานกับ PreparedStatements ยังเป็นมากขึ้นง่ายขึ้นและมากเพิ่มเติมสามารถอ่านได้ เพียงอย่างเดียวนั่นอาจทำให้พวกเขาเป็นค่าเริ่มต้นสำหรับโปรแกรมเมอร์ทุกคนที่รู้เกี่ยวกับพวกเขา
Edan Maor

3
โปรดทราบว่า PreparedStatements สำหรับฐานข้อมูลบางอย่างมีราคาแพงมากในการสร้างดังนั้นหากคุณจำเป็นต้องทำมาก ๆ ให้วัดทั้งสองประเภท
Thorbjørn Ravn Andersen

36

จริงๆถ้าคุณไม่สามารถใช้การป้องกันตัวเลือกที่ 1: เตรียมงบ (Parameterized แบบสอบถาม)หรือการป้องกันตัวเลือกที่ 2: วิธีการเก็บไม่ได้สร้างเครื่องมือของคุณเองใช้OWASP Enterprise Security API จากOWASP ESAPIโฮสต์บน Google Code:

อย่าเขียนตัวควบคุมความปลอดภัยของคุณเอง! การคิดค้นวงล้อใหม่เมื่อพูดถึงการพัฒนาระบบควบคุมความปลอดภัยสำหรับเว็บแอปพลิเคชันหรือบริการเว็บทุกครั้งทำให้เสียเวลาและมีช่องโหว่ด้านความปลอดภัยจำนวนมาก ชุดเครื่องมือ OWASP Enterprise Security API (ESAPI) ช่วยให้นักพัฒนาซอฟต์แวร์สามารถป้องกันข้อบกพร่องด้านการออกแบบและการนำไปใช้งานด้านความปลอดภัย

สำหรับรายละเอียดเพิ่มเติมโปรดดูที่การป้องกันการฉีด SQL ในชวาและSQL Injection ป้องกันโกงแผ่น

ให้ความสนใจเป็นพิเศษกับตัวเลือกการป้องกัน 3:การหลีกเลี่ยงการป้อนข้อมูลที่ผู้ใช้ป้อนทั้งหมดที่แนะนำโครงการOWASP ESAPI )


4
ESAPI ดูเหมือนว่าจะหมดอายุในวันนี้ ใน AWS มี WAF ที่สามารถช่วยในการฉีด SQL, XSS ฯลฯ มีทางเลือกอื่น ๆ ณ จุดนี้หรือไม่?
ChrisOdney

@ChrisOdney A WAF สามารถข้ามได้อย่างง่ายดาย เฟรมเวิร์กส่วนใหญ่ใช้การป้องกัน SQL-Injection ของตัวเองซึ่งพวกเขาหลบหนีพารามิเตอร์โดยอัตโนมัติด้วยตนเอง ทางเลือกสำหรับโครงการแบบดั้งเดิม: owasp.org/index.php/ …
Javan R.

19

(นี่คือคำตอบของความคิดเห็นของ OP ภายใต้คำถามเดิมฉันยอมรับอย่างสมบูรณ์ว่า PreparedStatement เป็นเครื่องมือสำหรับงานนี้ไม่ใช่ regexes)

เมื่อคุณพูด\nคุณหมายถึงลำดับ\+ nหรืออักขระตัวดึงบรรทัดจริงหรือไม่ ถ้าเป็น\+ nงานตรงไปตรงมา:

s = s.replaceAll("['\"\\\\]", "\\\\$0");

ในการจับคู่แบ็กสแลชหนึ่งรายการในอินพุตคุณใส่สี่รายการในสตริง regex ในการใส่แบ็กสแลชหนึ่งรายการในเอาต์พุตคุณใส่สี่รายการในสตริงการแทนที่ นี่คือการสมมติว่าคุณกำลังสร้าง regexes และการแทนที่ในรูปแบบของตัวอักษร Java String หากคุณสร้างมันด้วยวิธีอื่น (เช่นโดยการอ่านจากไฟล์) คุณไม่จำเป็นต้องหลบหนีทั้งหมด

หากคุณมีอักขระตัวดึงข้อมูลบรรทัดในอินพุตและคุณต้องการแทนที่ด้วยลำดับ escape คุณสามารถสร้างการส่งผ่านครั้งที่สองผ่านอินพุตนี้:

s = s.replaceAll("\n", "\\\\n");

หรือบางทีคุณต้องการแบ็กสแลชสองอัน (ฉันไม่ชัดเจนเกินไป):

s = s.replaceAll("\n", "\\\\\\\\n");

1
ขอบคุณสำหรับความคิดเห็นที่ฉันชอบวิธีที่คุณทำทุกตัวละครในหนึ่งฉันจะเกี่ยวกับวิธีการแสดงออกปกติน้อยกว่าของการแทนที่ทั้งหมดสำหรับแต่ละ ... ฉันไม่แน่ใจว่าจะกำหนดคำตอบสำหรับคำถามนี้ในขณะนี้ . ที่สุดแล้วคำตอบที่เตรียมไว้คือคำตอบ แต่สำหรับวัตถุประสงค์ปัจจุบันของฉันคำตอบของคุณคือคำตอบที่ฉันต้องการคุณจะอารมณ์เสียหรือเปล่าถ้าฉันให้คำตอบกับคำตอบที่เตรียมไว้ก่อนหน้านี้หรือมีวิธีแบ่งปันคำตอบระหว่างคู่
Scott Bonner

1
เนื่องจากนี่เป็นเพียงกากตะกอนชั่วคราวไปข้างหน้าและยอมรับคำตอบ PreparedStatement ข้อใดข้อหนึ่ง
Alan Moore

12

PreparedStatements เป็นวิธีที่จะไปมากที่สุด แต่ไม่ใช่ทุกกรณี บางครั้งคุณจะพบว่าตัวเองอยู่ในสถานการณ์ที่แบบสอบถามหรือส่วนหนึ่งของมันจะต้องมีการสร้างและจัดเก็บเป็นสตริงสำหรับใช้ในภายหลัง ตรวจสอบเอกสารการป้องกันการฉีด SQLบนเว็บไซต์ OWASPสำหรับรายละเอียดเพิ่มเติมและ API ในภาษาการเขียนโปรแกรมที่แตกต่างกัน


1
Cheatsheets OWASP ถูกย้ายไปที่ GitHub ชีต SQL Injection cheat ตอนนี้ที่นี่: github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/…
theferrit32

10

งบเตรียมเป็นทางออกที่ดีที่สุด แต่ถ้าคุณต้องการทำมันด้วยตนเองคุณสามารถใช้StringEscapeUtilsคลาสจากไลบรารี Apache Commons-Lang มันมีescapeSql(String)วิธีการที่คุณสามารถใช้:

import org.apache.commons.lang.StringEscapeUtils; … String escapedSQL = StringEscapeUtils.escapeSql(unescapedSQL);


2
สำหรับการอ้างอิง: commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/…อย่างไรก็ตามวิธีนี้จะหนีจากเครื่องหมายคำพูดเท่านั้นและดูเหมือนจะไม่ป้องกันการโจมตี SQL Injection
Paco Abato

11
สิ่งนี้ถูกลบออกจากเวอร์ชันล่าสุดเพราะมันเป็นเพียงการหลีกหนีคำพูดเดียว
Pini Cheyni

2
คำตอบนี้ควรจะถูกลบเพราะมันไม่ได้ป้องกันการฉีด sql
Javan R.

9

ใช้การแสดงออกปกติเพื่อลบข้อความที่อาจทำให้เกิดการฉีด SQL เสียงเช่นคำสั่ง SQL จะถูกส่งไปยังฐานข้อมูลผ่านทางStatementมากกว่าPreparedStatementมากกว่า

หนึ่งในวิธีที่ง่ายที่สุดในการป้องกันการฉีด SQL ในตอนแรกคือการใช้ PreparedStatementซึ่งยอมรับข้อมูลเพื่อแทนที่คำสั่ง SQL โดยใช้ตัวยึดตำแหน่งซึ่งไม่พึ่งพาการต่อข้อมูลสตริงเพื่อสร้างคำสั่ง SQL เพื่อส่งไปยังฐานข้อมูล

สำหรับข้อมูลเพิ่มเติมการใช้คำสั่งที่เตรียมไว้จากบทเรียน Javaจะเป็นจุดเริ่มต้นที่ดี


6

ในกรณีที่คุณกำลังจัดการกับระบบเดิมหรือมีหลายสถานที่ที่จะเปลี่ยนเป็นPreparedStatements ในเวลาน้อยเกินไป - เช่นหากมีอุปสรรคในการใช้แนวปฏิบัติที่ดีที่สุดที่เสนอโดยคำตอบอื่น ๆ คุณสามารถลองAntiSQLFilter


5

คุณต้องใช้รหัสต่อไปนี้ด้านล่าง อย่างรวดเร็วนี้อาจดูเหมือนรหัสเก่า ๆ ที่ฉันสร้างขึ้น อย่างไรก็ตามสิ่งที่ฉันทำคือดูซอร์สโค้ดสำหรับhttp://grepcode.com/file/repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.31/com/mysql/jdbc/PreparedStatement ชวา หลังจากนั้นฉันตรวจดูรหัสของ setString (int parameterIndex, String x) อย่างระมัดระวังเพื่อค้นหาตัวละครที่มันจะหลบหนีและปรับแต่งมันให้เหมาะกับชั้นเรียนของฉันเองเพื่อที่จะสามารถใช้ตามวัตถุประสงค์ที่คุณต้องการ ท้ายที่สุดถ้านี่คือรายการของตัวละครที่ Oracle หนีออกมาจากนั้นการรู้ว่านี่เป็นสิ่งที่ทำให้เกิดความปลอดภัยอย่างมาก บางทีออราเคิลอาจต้องใช้วิธีเขยิบเพื่อเพิ่มวิธีการที่คล้ายกับวิธีนี้สำหรับการเปิดตัว Java รุ่นใหญ่ครั้งต่อไป

public class SQLInjectionEscaper {

    public static String escapeString(String x, boolean escapeDoubleQuotes) {
        StringBuilder sBuilder = new StringBuilder(x.length() * 11/10);

        int stringLength = x.length();

        for (int i = 0; i < stringLength; ++i) {
            char c = x.charAt(i);

            switch (c) {
            case 0: /* Must be escaped for 'mysql' */
                sBuilder.append('\\');
                sBuilder.append('0');

                break;

            case '\n': /* Must be escaped for logs */
                sBuilder.append('\\');
                sBuilder.append('n');

                break;

            case '\r':
                sBuilder.append('\\');
                sBuilder.append('r');

                break;

            case '\\':
                sBuilder.append('\\');
                sBuilder.append('\\');

                break;

            case '\'':
                sBuilder.append('\\');
                sBuilder.append('\'');

                break;

            case '"': /* Better safe than sorry */
                if (escapeDoubleQuotes) {
                    sBuilder.append('\\');
                }

                sBuilder.append('"');

                break;

            case '\032': /* This gives problems on Win32 */
                sBuilder.append('\\');
                sBuilder.append('Z');

                break;

            case '\u00a5':
            case '\u20a9':
                // escape characters interpreted as backslash by mysql
                // fall through

            default:
                sBuilder.append(c);
            }
        }

        return sBuilder.toString();
    }
}

2
ฉันคิดว่ารหัสนี้เป็นเวอร์ชั่นที่แปลแล้วของซอร์สโค้ดในลิงค์ด้านบน ตอนนี้ในรุ่นใหม่mysql-connector-java-xxxนี้case '\u00a5'และcase '\u20a9'งบดูเหมือนจะได้รับการลบออก
ZHY

ฉันพยายาม sqlmap ด้วยรหัสของคุณและมันไม่ได้ป้องกันฉันจากการโจมตีเฟิร์ส `Type: boolean-blind blind Title: และ blind-based blind - WHERE หรือ HAVING clause ส่วนของข้อมูล: q = 1% 'และ 5430 = 5430 และ'% ' = ''
shareef

ขออภัยที่ใช้งานได้ แต่กำลังดูผลลัพธ์เซสชันล่าสุดที่เก็บไว้ .. ฉันเก็บความคิดเห็นไว้สำหรับอนาคตที่คล้ายกัน ..
shareef

คุณสามารถใช้หรือorg.ostermiller.utils.StringHelper.escapeSQL() com.aoindustries.sql.SQLUtility.escapeSQL()
Mohamed Ennahdi El Idrissi

1
สิ่งสำคัญที่ควรทราบสิทธิ์การใช้งาน GPLv2 ในรหัสต้นฉบับซึ่งคัดลอกมาจากสำหรับทุกคนที่เจอสิ่งนี้ ฉันไม่ใช่ทนายความ แต่ฉันขอแนะนำอย่างสูงว่าอย่าใช้คำตอบนี้ในโครงการของคุณเว้นแต่คุณจะรับรู้ถึงความหมายของการรวมรหัสลิขสิทธิ์นี้
Nick Spacek

0

หลังจากค้นหาการทดสอบจำนวนมากของการแก้ปัญหาเพื่อป้องกัน sqlmap จากการฉีด sql ในกรณีของระบบมรดกที่ไม่สามารถใช้รูปปั้นที่เตรียมไว้ทุกที่

หัวข้อ Java-security-cross-site-scripting-xss-and-sql-injection ทางออก

ฉันลองใช้โซลูชันของ @Richard แต่ไม่ได้ผลในกรณีของฉัน ฉันใช้ตัวกรอง

เป้าหมายของตัวกรองนี้คือห่อหุ้มคำขอลงใน wrapper MyHttpRequestWrapper รหัสของตัวเองซึ่งเปลี่ยน:

พารามิเตอร์ HTTP ที่มีอักขระพิเศษ (<,>, ', …) ลงในรหัส HTML ผ่านวิธีการ org.springframework.web.util.HtmlUtils.htmlEscape (…) หมายเหตุ: มีคลาสที่คล้ายกันใน Apache Commons: org.apache.commons.lang.StringEscapeUtils.escapeHtml (…) อักขระการฉีด SQL (',“, …) ผ่าน Apache Commons classe org.apache.commons.lang.StringEscapeUtils escapeSql ( ... )

<filter>
<filter-name>RequestWrappingFilter</filter-name>
<filter-class>com.huo.filter.RequestWrappingFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>RequestWrappingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>




package com.huo.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletReponse;
import javax.servlet.http.HttpServletRequest;

public class RequestWrappingFilter implements Filter{

    public void doFilter(ServletRequest req, ServletReponse res, FilterChain chain) throws IOException, ServletException{
        chain.doFilter(new MyHttpRequestWrapper(req), res);
    }

    public void init(FilterConfig config) throws ServletException{
    }

    public void destroy() throws ServletException{
    }
}




package com.huo.filter;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import org.apache.commons.lang.StringEscapeUtils;

public class MyHttpRequestWrapper extends HttpServletRequestWrapper{
    private Map<String, String[]> escapedParametersValuesMap = new HashMap<String, String[]>();

    public MyHttpRequestWrapper(HttpServletRequest req){
        super(req);
    }

    @Override
    public String getParameter(String name){
        String[] escapedParameterValues = escapedParametersValuesMap.get(name);
        String escapedParameterValue = null; 
        if(escapedParameterValues!=null){
            escapedParameterValue = escapedParameterValues[0];
        }else{
            String parameterValue = super.getParameter(name);

            // HTML transformation characters
            escapedParameterValue = org.springframework.web.util.HtmlUtils.htmlEscape(parameterValue);

            // SQL injection characters
            escapedParameterValue = StringEscapeUtils.escapeSql(escapedParameterValue);

            escapedParametersValuesMap.put(name, new String[]{escapedParameterValue});
        }//end-else

        return escapedParameterValue;
    }

    @Override
    public String[] getParameterValues(String name){
        String[] escapedParameterValues = escapedParametersValuesMap.get(name);
        if(escapedParameterValues==null){
            String[] parametersValues = super.getParameterValues(name);
            escapedParameterValue = new String[parametersValues.length];

            // 
            for(int i=0; i<parametersValues.length; i++){
                String parameterValue = parametersValues[i];
                String escapedParameterValue = parameterValue;

                // HTML transformation characters
                escapedParameterValue = org.springframework.web.util.HtmlUtils.htmlEscape(parameterValue);

                // SQL injection characters
                escapedParameterValue = StringEscapeUtils.escapeSql(escapedParameterValue);

                escapedParameterValues[i] = escapedParameterValue;
            }//end-for

            escapedParametersValuesMap.put(name, escapedParameterValues);
        }//end-else

        return escapedParameterValues;
    }
}

มันดีjava-security-cross-site-scripting-xss-and-sql-injection topicมั้ย ฉันพยายามหาวิธีแก้ปัญหาสำหรับแอปพลิเคชันรุ่นเก่า
caot

0

จาก: [ที่มา]

public String MysqlRealScapeString(String str){
  String data = null;
  if (str != null && str.length() > 0) {
    str = str.replace("\\", "\\\\");
    str = str.replace("'", "\\'");
    str = str.replace("\0", "\\0");
    str = str.replace("\n", "\\n");
    str = str.replace("\r", "\\r");
    str = str.replace("\"", "\\\"");
    str = str.replace("\\x1a", "\\Z");
    data = str;
  }
return data;

}


0

หากคุณใช้ PL / SQL คุณสามารถใช้DBMS_ASSERT มันสามารถฆ่าเชื้ออินพุตของคุณเพื่อให้คุณสามารถใช้งานได้โดยไม่ต้องกังวลกับ SQL injections

ดูตัวอย่างคำตอบนี้: https://stackoverflow.com/a/21406499/1726419

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.