2013-09-26 2 views
0

This Raw SQL WSI API은 매우 강력하지만, 필요한 엔티티 ID를 검색하는 유일한 방법이기도합니다. 예를 들어 이름으로 제조업체를 검색 할 수 있어야합니다 (더 나은 방법이 있는지 토론). 가정에 가장 좋은 방법은 정말 나쁜 생각이SQL이 XML을 통해 전송 될 때 SQL 인젝션으로부터 보호

'SELECT ManufactuerGUID FROM Manufacturer WHERE Name = ' . "$name" 

같은 쿼리를 보내는 것입니다 그리고 난 그것을 쓰기 위해 자신이 싫어 ...하지만 난 그것을 소독하는 것이 최선의 방법을 모르겠어요. 일반적으로 매개 변수화는 SQL 드라이버 (AFAIK)를 통해 수행됩니다. 제가 생각할 수있는 유일한 것은 ... DBD::ODBC에서 최종 SQL 문자열을 다시 얻을 수 있습니까? 다른 제안을 환영합니다. 아마도 제가 사용할 수있는 위생 처리 라이브러리가 있을까요?

명확히하기 위해 ASP.net Storefront의 API를 실제로 제어 할 수는 없습니다. 제조업체 Name은 사람의 입력에서 오는 유일한 매개 변수이므로 나머지 부분을 코딩하는 방법에 대해 걱정할 필요는 없습니다. 예,이 API는 믿기지 않을 정도로 어리석은 생각이며 쿼리를 매개 변수화하는 방법을 제공했다면 좋을 것입니다.

+1

이 Raw API는 실제로 매우 무의미한 것으로 보입니다. ** 아무도 ** XML을 통해 전송 된 SQL이 필요합니다. 모든 사람들이 사용하는 규칙적인 방법이 있습니다 : 당신은 * 어떤 * 질의 [이미 코드에 적혀 있습니다]만을 보내고, 사용할 * 데이터 *를 보내십시오. 바퀴를 재발 명하지 마십시오. XML을 통해 SQL을 보내지 마십시오. –

+0

@ YourCommonSense ... 그렇다면 매개 변수 (제조업체 이름)를 기반으로 필요한 데이터 (guid)를 반환하도록 내가 보내야 할 내용을 알려주십시오. 나는 바퀴를 다시 발명하지 않고이 API를 작성하지 않았다. 나는 단순히 그것과 연결되어있다. – xenoterracide

+0

그래 ... 누가 더 나은 대답을 찾았을 때 이걸 무시 했어? 고마워. 이 작업을 수행하는 인터페이스를 찾는 것이 쉽지는 않습니다. – xenoterracide

답변

0

내가 찾은 this documentation은 QueryParams 옵션이 있음을 나타냅니다.

<query name="Entities" rowElementName="Entity"> 
<sql> 
<![CDATA[ 
    select Name,Description from {EntityName} with (NOLOCK) where {EntityName}[email protected] 
]]> 
</sql> 
<querystringreplace replaceTag="{EntityName}" 
    replacetype="runtime" 
    replaceparamname="EntityName" 
    defvalue="" 
    validationpattern="(category)|(section)|(affiliate)|(manufacturer)|(distributor)|(library)" /> 
<queryparam paramname="@EntityID" 
    paramtype="runtime" 
    requestparamname="EntityID" 
    sqlDataType="int" 
    defvalue="0" 
    validationpattern="" /> 
</query> 

나는 이것이 SQL 주입을 방지하기에 충분하다고 생각한다. (제품을 알고있는 사람을 확인하는 것이 좋겠지 만). 왜 이것이 내가 이해할 수없는 주요 SQL 인터페이스 문서에서 전혀 언급되지 않는지.

-1

어쩌면 당신은 ManufactuerGUID라는 테이블을 가지고 있습니다. 그래서 당신은 그렇게 쉽게 CRUDS를 코딩 할 수 있습니다 .... 외부에서는 나쁜 상황을 개선하는 가장 좋은 방법을 묻습니다 ... 어떻게 출력을 위해 SqlParameters를 사용합니까? 구문 분석은 여전히 ​​나쁜 것들을 거부합니다.

+0

이 질문에 대한 정확한 해결책이 있지만 – xenoterracide

2

DBIquote 방법을 제공합니다. 아마도이 방법을 대상 데이터베이스와의 실제 연결로 사용하는 것이 가장 좋지만이를 수행 할 수없는 경우 NullP 드라이버를 대신 사용할 수 있습니다. quote의 결과가 이미 주변에 작은 따옴표 나 큰 따옴표를 가지고, 그래서 당신은 그들에게 자신을 작성하지 않는 것이

use DBI; 
my $dbh = DBI->connect("dbi:NullP:"); 
my $quoted_name = $dbh->quote($name); 

참고.

+0

API를 제어하지 않습니다. 훌륭한 대답입니다. 쿼리를 매개 변수화하는 방법이 있음을 의미하는 문서를 발견했습니다. 수동으로 인용하는 것보다 분명히 낫습니다. API가 매개 변수화 옵션을 제공하지 않는 경우에도 여전히 최선의 방법입니다. – xenoterracide