2009-11-11 2 views
3

DBMS_ASSERT은 Oracle에서 SQL 주입 공격을 방지하는 키 중 하나입니다. SQL Server 2005/2008에서이 기능을 사용할 수 있습니까?Oracle의 DBMS_ASSERT에 해당하는 Sql Server는 무엇입니까?

DBMS_ASSERT의 모든 Oracle 패키지 멤버에 해당하는 특정 구현을 찾고 있습니다.

  • NOOP
  • SIMPLE_SQL_NAME
  • QUALIFIED_SQL_NAME
  • SCHEMA_NAME 나는 그들 중 하나 인 ... 변수를 결합 ... 예방 주사의 모범 사례를 알고있다.
    그러나이 질문에서 저는 bind 변수가 사용되지 않은 시나리오에서 특히 입력을 살균하는 좋은 방법을 찾고 있습니다.

    특정 구현이 있습니까?
    실제로 Oracle 패키지의 SQL Server 포트 인 라이브러리가 있습니까?

+2

바인드 변수를 사용하는 것은 DBMS_ASSERT 또는 사용자 입력을 위장하는 유사한 방법을 사용하는 것보다 훨씬 낫습니다. –

+1

SQL Server는 알고 있지만 Oracle은 아는 사람이라면 DBMS_ASSERT가 정확히 무엇을 수행합니까? – RickNZ

답변

1

당신이 가지고있는 유일한 가능성이 옵션은()가 소유자 또는 데이터베이스 정규화되지 않은 제공 가능 SIMPLE_SQL_NAME 또는 ENQUOTE_NAME 등이있다. 그래서 테이블 이름에 대한 동등한 수 있습니다 따라서 개체 이름을 (탈출하는 데 사용됩니다 QUOTENAME입니다

개체를 완전히 한정하는 메커니즘이 없으므로 (예 : 'bob'테이블을 'database.owner.bob'으로 변환) 수동으로 함께 입력해야합니다. , 선택적으로 QUOTENAME을 사용하여 값을 이스케이프합니다 (예 :

). 개체가 기존 데이터베이스에있는 경우

는, 당신은 DB_NAME()를 사용하고, 소유자가 변수로 전달 될 것 가정 수 : 정말 복잡한 방법으로

DB_NAME() + '.' + QUOTENAME(@owner) + '.' + QUOTENAME(@tablename)

, 당신은뿐만 아니라 주인을 얻을 수 있습니다 :

USER_NAME(OBJECTPROPERTY(OBJECT_ID(@tablename), 'ownerid')))

예 내가 해결 고려 될 수있다이 모두 실현,하지만 그들은 옵션입니다.

그러나 실제로 값을 이스케이프하려면 직접 SQL Server에 기본 제공되는 SQL Server가 없으므로 모든 수동 문자열 조작이 가능합니다. SQL Server sp_ExecuteSQL 의미 체계를 사용하여 sproc을 다시 작성하는 것이 가치가있을지라도, 이렇게하기 위해 자리에 앉아 UDF를 만들 수도 있습니다.

0

마술 "주사 금지"명령이 없습니다. 당신이 1과 2를 할 수없는 경우에 '교체, 데이터베이스 계층

  • 에 전달하기 전에 형태의 안전성을
  • 위생적으로 입력을 보장하기 위해 매개 변수화 된 쿼리를 사용하여

    1. : 방법론은의 조합입니다 동적 SQL을 맹목적으로 실행하기 전에 모든 입력 및 기타 위생 (sanitize) 메소드에서.
  • +0

    @Aaron 나는 방법론을 알고 있습니다 ... 제 질문은 DBMS_ASSERT 동등성에만 해당됩니다. 정확히 일치하는 것이 없다면 DB 전문가 중 일부는 라이브러리/확장을 작성하여 에뮬레이트 할 수 있습니다. 나는 그 라인에서 듣기를 고대하고있다 –

    +0

    나는 무엇이 든지을 모른다, 미안. 사람들이 작성한 확장 기능은 데이터베이스 수준이 아닌 프런트 엔드/중간 계층 용으로 작성된 것 같습니다. –

    0

    나는 또한 Sql Server의 경우 DBMS_ASSERT과 비슷한 것을 찾고 있었지만 아무 소용이 없었다. 그래서 필자는 필요한 PROC 모음을 작성했습니다.

    Microsoft는 실제로 비슷한 것을 제공해야하지만 그때까지는 스스로 해결해야합니다.

    0

    이와 같이 SQL SERVER에는 DBMS_ASSERT가 없습니다.

    그러나 SQL Injection

    2

    문자열을 구축하여 동적 쿼리를 수행하지 마십시오이 링크에 의해 아론 버트 랜드의 답을 강화하고이를 실행.

    sp_executesql을 사용하고 매개 변수로 매개 변수를 전달하십시오.

    당신은 SQL 주입이 더 이상 없다는 것을 알 수 있습니다.

    EDIT : 죄송합니다. 서둘러서 잘못된 명령을 작성했습니다. 그것은 sp_execute가 아니며 sp_executesql입니다. 그것은 문자열과 매개 변수 집합을 취합니다 : 매개 변수의 모든 인코딩과 이스케이프는 SQL Server에 의해 수행됩니다.

    EDIT2

    : sp_executesql statement explaination

    +0

    @Patonza이 답변은 어떤 가치도 제공하지 않습니다 ... 나는 주사를 예방할 수있는 방법이 아닌 오라클의 동등 물을 찾고 있습니다. 제 질문을 읽고 주제별로 설명하십시오. –

    +2

    죄송합니다. 오라클에서 MS SQL Server로 일부 소프트웨어를 이식하고 있습니다. 이 시나리오에서는 DBMS_ASSERT를 1 : 1로 대체해야합니다. 그러나 가능한 경우 (예 :새 코드) 문제를 완전히 피하는 것이 좋습니다. 나는 누군가가 내 충고로 이익을 얻을 수 있다고 생각했다. 아마도 대답 대신에 코멘트를 게시 했어야했다. :) – Patonza

    2

    내가 가진 가장 가까운 것은 TSQLAssert for TSQLMacro하지만 그것은 단지 TSQL 저장 프로 시저를 지원합니다. 그것은 무료입니다.

    TSQLAssert는 TSQLMacro 위에 구축 된 어설 션 프레임 워크 입니다. 과 유사한 어설 션 오류를 C++과 같은 언어 (예 : )와 추가 로깅 구성 요소 (해당 언어에서 찾을 수 없음)을 제공하기위한 것입니다. TSQLAssert는 저장 프로 시저 및 트리거 - 내에서만 사용할 수 있습니다. 사용자 정의 함수 및보기는 작동하도록 허용하는 많은 키워드를 지원하지 않습니다.

    관련 문제