Android에서 SQL 쿼리를 실행하려면 SQL 주입 취약점을 방지하기 위해 매개변수화된 자리 표시자를 사용하는 경우가 많습니다. 이는 IN 절을 사용할 때 발생합니다. 다음 쿼리를 고려해보세요.
<code>String names = "name1', 'name2"; // 动态生成 String query = "SELECT * FROM table WHERE name IN (?)"; Cursor cursor = mDb.rawQuery(query, new String[]{names});</code>
그러나 Android에서는 물음표를 제공된 값으로 바꿀 수 없습니다. 또는 다음을 선택할 수 있습니다.
<code>String query = "SELECT * FROM table WHERE name IN (" + names + ")"; Cursor cursor = mDb.rawQuery(query, null);</code>
이 접근 방식은 SQL 주입 위협을 제거하지만 쿼리를 적절하게 매개변수화하는 데 실패합니다.
삽입 위험을 피하면서 매개변수화를 달성하려면 자리표시자 패턴이 있는 문자열 사용을 고려하세요.
<code>String query = "SELECT * FROM table WHERE name IN (" + makePlaceholders(names.length) + ")"; Cursor cursor = mDb.rawQuery(query, names);</code>
makePlaceholders(len) 함수는 필요한 수의 물음표를 쉼표로 구분하여 포함하는 문자열을 생성합니다. 이를 통해 매개변수화에 영향을 주지 않고 쿼리를 안전하게 삽입할 수 있습니다.
makePlaceholders(len) 구현:
<code>String makePlaceholders(int len) { if (len < 1) { throw new IllegalArgumentException("Length must be > 0"); } StringBuilder sb = new StringBuilder(len * 2 - 1); sb.append("?"); for (int i = 1; i < len; i++) { sb.append(",?"); } return sb.toString(); }</code>
SQLite는 일부 특정 Android 버전을 제외하고 일반적으로 최대 999개의 호스트 매개변수를 지원합니다.
위 내용은 Android SQL 쿼리에서 IN 절을 안전하게 매개변수화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!