문제

나는 몇 가지 코드를 이용하는 쿼리를 방지하여 주입이지만,또한 필요할 수 있는 동적으로 생성하는 쿼리에 관계 없이 구조의 표입니다.어떻게 하면 이렇게 할 수 있습니까?

여기에 예를 들어,말하는 내가 있는 테이블과 함께 열 이름,주소,전화 등이 있습니다.I 웹 페이지가 있는 곳에 나가 실행 열 표시 고 채우기를 선택하는 드롭다운 그들과 함께로 옵션이 있습니다.

다음으로,저는 textbox 라 검색.이 텍스트 상자가 나타나지 않으로 사용되는 매개 변수입니다.

현재 내 코드는 다음과 같은 형태입니다:

result = pquery('SELECT * FROM contacts WHERE `' + escape(column) + '`=?', search);

나는 불쾌한 느낌에서 비록 그것.이유는 내가 사용하는 쿼리를 사용하지 않도록하는 것입 .또한, 은 가능성이 없는 디자인 탈출을 위해 열 이름이 있습니다.

고 있는지 어떻게 확인할 수 있는 이 방법은 내가 하려는?

편집: 그 이유는 내가 필요로 동적 쿼리는 스키마가 사용자 구성 가능,그리고 나지 않을 것이 주위에 아무것도 수정 하드 코딩이 가능합니다.

도움이 되었습니까?

해결책

전달하는 대신 열 이름,그냥 통과하는 식별자를 코드를 번역해 열 이름을 사용하여 하드 표입니다.이것은 당신에 대해 걱정할 필요가 악의적인 데이터 전달되는,모든 데이터 어느 번역 법적으로거나,알려진 신호를 받을 수도 있습니다.Psudoish 코드:

@columns = qw/Name Address Telephone/;
if ($columns[$param]) {
  $query = "select * from contacts where $columns[$param] = ?";
} else {
  die "Invalid column!";
}

run_sql($query, $search);

다른 팁

트릭은 자신감에서 탈출하고 검증하는 루틴입니다.내가 사용하는 내 자신의 SQL 함수에서 탈출하는 오버로드를 위해 리터럴의 다른 유형이 있습니다.아무데도 나는 삽입식(반대로 인용한 문자 값)에서 직접 사용자 입력이 있습니다.

여전히,그것을 할 수 있습니다,내가 추천한 별도와 엄격한 기능의 유효성 검사에 대한 열 이름입니다.그것을 받아들이 단 하나의 식별가

/^\w[\w\d_]*$/

당신은에 의존해야 가정을 만들 수 있습에 대한 당신의 자신의 열 이름이 있습니다.

내가 사용하는 ADO.NET 의 사용은 SQL 명령과 SQLParameters 하는 그 명령을 탈출 문제입니다.그래서 만약 당신에 마이크로소프트 공구 환경을 뿐만 아니라,내가 말할 수 있는 사용이 매우 sucesfully 를 구축하는 dynamic SQL 그리고 아직 보호하고 매개변수

행운을 빕

들에게 열의 결과에 따라 다른 쿼리는 테이블에 열거한 가능한 스키마는 값입니다.에는 두 번째 쿼리할 수 있는 현재의 선택은 열 이름을 정의하는 데 사용되는 스키마.는 경우에 반환되는 행이 없음을 입력 열가 잘못되었습니다.

표준 SQL,을 묶어야로 구분한 식별자는다.이 의미는:

SELECT * FROM "SomeTable" WHERE "SomeColumn" = ?

니다 테이블에서 선택이라는 SomeTable 으로 다음과 같가 총액(지 않을 경우 변환 이름의 버전),그리고 적용될 조건을 열라고 SomeColumn 으로 표시된 총액.

의 자체는 아주 도움이 되지 않지만,경우에 적용할 수 있습니다 탈출()기술을 쌍따옴표하는 이름을 입력을 통해 귀하의 웹 양식을,당신을 구축 할 수 있습니다 쿼리를 합리적으로 쉽게 할 수 있습니다.

물론,당신이 말한 당신이 피하고 싶었을 사용하여 탈출하고 실제로 당신을 사용할 필요가 없이 그것에 매개 변수를 제공하는 곳은?장소-홀더.하지만 어디로 사용자 제공 데이터 쿼리로,당신은 필요한 자신을 보호하기 위해서 악의적인 사람들이다.

다른 DBMS 있는 다른 방법으로 제공으로 구분된 식별자가 있습니다.MS SQL Server,예를 들어,사용하는 것 같이 대괄호[SomeTable]대신 쌍따옴표.

의 열 이름에는 어떤 데이터베이스를 포함할 수 있는 공간을 의미할 수 있을 인용하는 열 이름을,하지만 당신의 데이터베이스에 포함되지 않은 열을 실행하기만 하면 열 이름을 일정한 표현 또는 어떤 종류의 체크인하기 전에 접합으로 SQL:

if ( $column !~ /^\w+$/ ) {
  die "Bad column name [$column]";
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top