programing

SQL에서 인용문 '을(를) 어떻게 처리합니까?

magicmemo 2023. 7. 30. 17:35
반응형

SQL에서 인용문 '을(를) 어떻게 처리합니까?

John Doe 등의 이름을 가진 데이터베이스가 있습니다.불행하게도 이 이름들 중 일부는 Keiran O'Keefe와 같은 인용구를 포함하고 있습니다.다음과 같은 이름을 검색하려고 하면 다음과 같습니다.

SELECT * FROM PEOPLE WHERE SURNAME='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의 구조를 변경할 수 없습니다. 다른 매개 변수로 동일한 문을 여러 번 실행하려는 경우에는 더 빠릅니다.

또한 예를 들어 오류가 발생하는 동안 문자열을 적절하게 이스케이프하지 않음으로써 다른 많은 문제에 대해 스스로를 개방한다는 점을 지적해야 합니다.좋은 출발점이나 다음의 고전적인 xkcd 만화는 http://en.wikipedia.org/wiki/SQL_injection 을 참조하십시오.

alt text

Oracle 10 솔루션은

SELECT * FROM PEOPLE WHERE SURNAME=q'{O'Keefe}'

Matt가 제안한 바와 같이 매개변수화된 쿼리는 당신의 친구입니다.

Command = SELECT * FROM PEOPLE WHERE SURNAME=?

그것들은 당신을 두통으로부터 보호해줄 것입니다.

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

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

입력 필터링은 일반적으로 데이터베이스 계층이 아닌 언어 수준에서 수행됩니다.
및 php 및NET 둘 다 SQL 문을 이스케이프하기 위한 각각의 라이브러리를 가지고 있습니다.언어를 확인하고 사용 가능한 항목을 확인합니다.
데이터가 신뢰할 수 있는 경우 문자열 바꾸기를 수행하여 ' 앞에 다른 '를 추가하여 데이터를 이스케이프할 수 있습니다.일반적으로 입력이 악의적일 위험이 없는 경우 이 정도면 충분합니다.

좋은 질문은 당신이 어떤 언어를 사용하고 있느냐는 것입니다.
PHP 파일: SELECT * FROM PEOPLE WERENY='mysql_escape_string(O'Keefe)'
하지만 당신이 언어를 지정하지 않았기 때문에, 나는 당신이 탈출 문자열 함수 mysql 또는 당신의 언어로 조사할 것을 제안할 것입니다.

Zend Framework를 사용하는 경우 견적을 처리하는 것이 코드입니다.

$db = Zend_Db_Table_Abstract::getDefaultAdapter();

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

예를 들어;

//SELECT * FROM PEOPLE WHERE SURNAME='O'Keefe' will become
SELECT * FROM PEOPLE WHERE SURNAME='\'O\'Keefe\''

구글에서 30대 이하로 발견...

Oracle SQL FAQ

언급URL : https://stackoverflow.com/questions/29699/how-do-i-deal-with-quotes-in-sql

반응형