문제

이 질문에 이미 답변이 있습니다.

  • Oracle에서 작은 따옴표 '를 예상하고 이스케이프하는 방법 2 답변

    저는 John Doe 등과 같은 이름의 데이터베이스를 가지고 있습니다. 불행히도 이러한 이름 중 일부에는 Keiran O'Keefe와 같은 따옴표가 포함되어 있습니다.이제 다음과 같은 이름을 검색 할 때 : 라코 디스

    (당연히) 오류가 발생합니다.

    이 오류가 발생하지 않도록하려면 어떻게해야합니까?Oracle과 PLSQL을 사용하고 있습니다.

도움이 되었습니까?

해결책

이스케이프 문자는 '이므로 따옴표를 두 개의 따옴표로 바꿔야합니다.

예 :

SELECT * FROM PEOPLE WHERE SURNAME='O'Keefe'

되다

SELECT * FROM PEOPLE WHERE SURNAME='O''Keefe'

즉,이 작업을 직접 수행하는 것은 잘못된 것 같습니다. 언어에 SQL에서 사용하기 위해 문자열을 이스케이프하는 기능이있을 수 있지만 더 나은 옵션은 매개 변수를 사용하는 것입니다. 일반적으로 다음과 같이 작동합니다.

SQL 명령은 다음과 같습니다.

SELECT * FROM PEOPLE WHERE SURNAME=?

그런 다음 실행할 때 "O'Keefe"를 매개 변수로 전달합니다.

매개 변수 값이 설정되기 전에 SQL이 구문 분석되기 때문에 매개 변수 값으로 SQL의 구조를 변경할 방법이 없습니다 (다른 매개 변수로 동일한 명령문을 여러 번 실행하려는 경우 더 빠릅니다). .

또한 귀하의 예제는 오류를 유발하지만 문자열을 적절하게 이스케이프하지 않음으로써 다른 많은 문제에 직면하게된다는 점도 지적해야합니다. 좋은 시작점은 http://en.wikipedia.org/wiki/SQL_injection 을 참조하십시오. 다음 고전 xkcd 만화 .

대체 텍스트

다른 팁

Oracle 10 솔루션은 라코 디스

매개 변수화 된 쿼리는 Matt가 제안한 것처럼 친구입니다. 라코 디스

두통으로부터 보호 해 줄 것입니다.

  • 따옴표가있는 문자열
  • 날짜를 사용하여 쿼리
  • SQL 주입

매개 변수화 된 SQL을 사용하면 다른 이점이 있습니다. Oracle에서 명령문을 구문 분석하는 데 필요한 작업량을 줄임으로써 Oracle의 CPU 오버 헤드 (및 기타 리소스)를 줄입니다.매개 변수를 사용하지 않는 경우 (오라클에서는 바인드 변수라고 함) "select * from foo where bar= 'cat'"및 "select * from foo where bar= 'dog'"는 별도의 명령문으로 처리됩니다. 여기서 "select * from foo where bar= : b1 "은 동일한 명령문입니다. 즉, 구문, 참조되는 객체의 유효성 등과 같은 항목을 다시 확인할 필요가 없습니다.일반적으로 가장 효율적인 SQL 실행 계획을 얻지 못하는 것으로 나타나는 바인드 변수를 사용할 때 가끔 문제가 발생하지만 이에 대한 해결 방법이 있으며 이러한 문제는 실제로 사용중인 술어, 인덱싱 및 데이터 왜곡에 따라 다릅니다.

입력 필터링은 일반적으로 데이터베이스 레이어가 아닌 언어 수준에서 수행됩니다.
php와 .NET에는 모두 SQL 문을 이스케이프하기위한 각각의 라이브러리가 있습니다.언어를 확인하고 사용 가능한 언어를 확인하세요.
데이터가 신뢰할 수있는 경우 문자열 교체를 수행하여 '의 앞에 다른'을 추가하여 이스케이프 할 수 있습니다.일반적으로 입력이 악의적이라는 위험이없는 경우 충분합니다.

어떤 언어를 사용하고 계십니까?
PHP에서는 다음을 수행합니다. SELECT * FROM PEOPLE WHERE SURNAME= 'mysql_escape_string (O'Keefe)'
그러나 언어를 지정하지 않았으므로 이스케이프 문자열 함수 mysql 또는 기타 언어로 살펴볼 것을 제안합니다.

Zend Framework를 사용하는 경우 견적을 처리하려면 여기에 코드가 있습니다.

$db = Zend_Db_Table_Abstract::getDefaultAdapter();

$db->quoteInto('your_query_here = ?','your_value_here');

예 : 라코 디스

Google에서 30 대 미만 발견 ...

Oracle SQL FAQ

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top