2013-05-03 2 views
1

API를 통해 salesforce를 쿼리 할 때 SOQL 주입을 피하는 가장 좋은 방법은 무엇입니까? 관심이있는 두 가지 주요 API는 SOAP 및 REST API입니다. 현재 나의 방법은 사용자의 입력을 절대 사용하지 않는 것입니다 (회사 이름을 검색하는 경우 실용적이지 않습니다). 또는 문자열 내의 특정 문자를 인코딩하는 것입니다.SFDC의 SOQL 주입

그러나 APEX 내에 매개 변수화가 있다는 것을 알았습니다. API를 통해 비슷한 방법이 있는지 궁금합니다.

답변

1

철학적 호언 장담

응용 프로그램이 서로 다른 소스에서 액세스 같은 방식으로 작동해야하는 경우 정말 후 :

을 무엇 (Salesforce UI, PHP 커넥터, 일부 모바일 응용 프로그램) 그러면 Apex에 대해 재사용되는 일부 저장 프로 시저와 같은 생각을하는 것이 가장 좋습니다. 즉, 안전한 매개 변수를 전달할 수 있습니다.

&에 대한 질문을 너무 수월하게 처리하려는 경우 database.com이나 다른 클라우드 기반 데이터베이스 솔루션과 같은 것이 필요할 수도 있습니다.

실제 대답

나는 (바인드 변수/준비된 명령문과 같은) API를 통해 별도로 쿼리 명령과 별도로 PARAMS을 통과 할 박스 방식의 밖으로 잘 모르는 것 같아요. REST와 SOAP API 모두 Apex 내에 본질적으로 무엇이 Database.query()인지 알려줍니다. 물론 retrieve() 명령이나 queryMore()과 같은 몇 가지 차이점이 있지만 기준선입니다.

당신이 할 수있는 일은 John이 제안한 것과 유사한 방법으로 자주 사용되는 검색을 노출하는 것입니다 (추가 성능을위한 보너스 포인트 - 사전 컴파일 됨) 또는 일반적인 것을 구축하는 것입니다. runQueryparams[0]처럼 바인드 변수를 포함 할 경우

List<sObject> runQuery(String query, List<List<String>> params){...} 

그것을 작동합니다. 보이는 미친 그리고 나는 그것을 테스트하지 않았다;) 나는 바인딩 변수가 최선의 방법이라고 말하고 싶지만. 대안은 사용자의 입력을 피하는 것이지만 SQL 및 XSS 주입은 놀라 울 정도로 창조적 일 수 있습니다. Examples of XSS that I can use to test my page input?을 확인하십시오 (예, 저는 SOQL에 대해서만 질문했습니다).

실제 SOQL 주입 : http://wiki.developerforce.com/page/Secure_Coding_SQL_Injection. "최악의 경우 일어날 수 있기 때문에"사용자가 예상했던 것보다 더 많은 것을 검색 할 것이므로 (SELECT를 INSERT로 변환 할 수 없습니다) 이스케이프는 안전해야합니다 ...

1

정말해야 할 일은 입력 (이 경우 회사 이름)이 제대로 이스케이프 처리되는지 확인하는 것입니다. API 중 하나에 대한 쿼리 개체를 작성하는 매개 변수화 된 방법을 알지 못합니다.

그러나 값을 전달할 수 있도록 Salesforce 내에서 사용자 정의 웹 서비스 메소드를 노출해야하는 경우 Salesforce Apex 코드 언어에서 다음과 유사한 구문을 사용하여 값을 매개 변수화 할 수 있습니다.

public Account[] queryCompany(string companyName) { 
    return [SELECT Id FROM Account WHERE Name = :companyName]; 
} 
+0

현재 내 요청을 처리하기 위해 SFDC 인스턴스의 Apex 코드 또는 쿼리를 직접 전달할지 여부. Apex 코드를 사용하면 더 많은 유지 관리가 필요하지만 SQL 인젝션 –