MySql에서 아포스트로피 ( ')를 피하는 방법?


146

MySQL의 문서 가되어야한다고 말한다 \'. 그러나 scite와 mysql은 모두 ''작동합니다. 나는 그것을 보았습니다. 어떻게해야합니까?


당신은 여부에 대해 얘기하는 ''또는 \'올바른?
랩터

\'''내가 실수하지 않으면 ANSI SQL을 준수 하는 반면 MySQL 은
apokryfos

SQL 구현에 따라- ''\ ','\ '', 때로는 '['] '은 코드에서 벗어날 수 있습니다. 이 외에도 많은 수의 유니 코드 대체 가이 검사를 무시합니다. 여기서 전체 게임은 ''기반 이스케이프의 품질을 남용하여 최종 '수는 홀수보다는 짝수 여야합니다. 여러 이스케이프 메소드를 서로 매쉬하여 이상하게되면 이스케이프를 물리 치고 원시 SQL을 주입 할 수 있습니다. 이야기의 도덕 : 문자열 보간을 사용하지 말고 항상 준비된 진술을 사용하십시오.
Shayne

답변:


185

당신이 인용 한 MySQL 문서는 실제로 당신이 언급 한 것보다 조금 더 말합니다. 또한 말합니다

" '"로 인용 된 문자열 내부의 " '"는 " "로 쓸 수 있습니다 ''.

(또한 MySQL 5.0 버전의 표 8.1. 특수 문자 이스케이프 시퀀스 에 연결했으며 현재 버전은 5.6이지만 현재 표 8.1. 특수 문자 이스케이프 시퀀스 는 매우 유사합니다.)

나는 매개 변수 backslash_quote (string) 대한 Postgres 메모 가 유익 하다고 생각합니다 .

따옴표를 \'문자열 리터럴로 표시 할 수 있는지 여부를 제어합니다 . 따옴표를 나타내는 기본 SQL 표준 방법은 따옴표를 두 배로 늘리는 것 ( '')이지만 PostgreSQL은 역사적으로도 받아 들였습니다 \'. 그러나를 사용 \'하면 보안 위험이 발생합니다.

즉, 이중 인용 부호 문자를 사용하는 것이 작은 따옴표를 이스케이프 처리하기 위해 백 슬래시를 사용하는 것보다 전체적이고 장기적으로 더 나은 선택입니다.

이제 언어 선택, SQL 데이터베이스 및 비표준 쿼크 선택 및 쿼리 프레임 워크 선택을 방정식에 추가하려는 경우 다른 선택으로 끝날 수 있습니다. 제약 조건에 대한 많은 정보를 제공하지 않습니다.


42

표준 SQL은 큰 따옴표를 사용합니다. MySQL은이를 합리적으로 준수해야합니다.

'He said, "Don''t!"'

+1. 어디 그것이하지 ''로 이스케이프해야한다고 말하는가 dev.mysql.com/doc/refman/5.0/en/...
user4951

'should'가 아니라 'may'라고 표시되지만 정보는 다음과 같습니다 (표 아래). 문자열 내에 따옴표 문자를 포함시키는 방법에는 여러 가지가 있습니다.“ '”로 인용 된 문자열 안에“ '”는“ ''” . " ""로 인용 된 문자열 내부의 " ""는 " "로 쓸 수 있습니다 "". 따옴표 문자는 이스케이프 문자 (“``”)로 시작합니다.
Jonathan Leffler

1
아포스트로피를 두 배로 늘려 탈출하는 가장 좋은 방법입니다.
Alex _TNT

10

user2087510의 의미는 다음과 같습니다.

name = 'something'
name = name.replace("'", "\\'")

나는 또한 이것을 성공으로 사용했다.


1
최고의 답변은 그렇지 않은 동안 저를 위해 일했습니다
Jared

1
왜 \ '가 아닌 \\'입니까?
biniam

@biniam_Ethiopia 두 번째 \ 첫 번째 탈출
Juha Untinen

2
가능한 보안 문제. 문자열에 이미 \ '가 포함되어 있으면 SQL 주입을 얻을 수 있으므로 \를 삽입하면 문자열에 \\'로 삽입되어 문자열이 종료됩니다. 대신 name.replace ( " '", "' '") 사용
Garr Godfrey

6

그냥 ''대신 '두 번 쓰세요'


1
대신에 아포스트로피를 두 번 사용
MRRaja

5

예를 들면 다음과 같습니다.

SELECT * FROM pubs WHERE name LIKE "%John's%"

작은 따옴표를 묶으려면 큰 따옴표를 사용하십시오.

작은 따옴표를 사용한다고 주장하고 문자를 이스케이프 해야하는 경우 :

SELECT * FROM pubs WHERE name LIKE '%John\'s%'

4

내가 알고있는 세 가지 방법이 있습니다. 첫 번째는 가장 아름답 지 않고 두 번째는 대부분의 프로그래밍 언어에서 일반적인 방법입니다.

  1. 다른 작은 따옴표를 사용하십시오. 'I mustn''t sin!'
  2. \작은 따옴표 앞에 이스케이프 문자 를 사용하십시오 '.'I mustn\'t sin!'
  3. 작은 따옴표 대신 큰 따옴표를 사용하여 문자열을 묶습니다. "I mustn't sin!"

개인적으로 선호하는 \'언어는 너무 많은 프로그래밍 언어에서 사용되지만 ''더 많은 SQL 언어에서 지원되므로 옵션 1을 사용하는 것이 호환성에 더 좋습니다. 예를 들어 Sqlite는 백 슬래시 이스케이프에서는 작동하지 않습니다.
okdewit

0

문자열을 교체

value = value.replace(/'/g, "\\'");

여기서 value는 데이터베이스에 저장할 문자열입니다.

더욱이,

이것에 대한 NPM 패키지, 당신은 그것을 볼 수 있습니다

https://www.npmjs.com/package/mysql-apostrophe


도구 나 라이브러리를 답으로 게시하지 마십시오. 적어도 그것이 답변 자체에서 문제해결하는 방법을 보여 주십시오 .
Baum mit Augen

작동하지 않습니다. 당신은 물건을 탈출하는 것을 잊었다. replace (/ \ '/ g, "\\\'")
Michael

0

아포스트로피가있는 데이터 포인트가 있다면 아포스트로피 앞에 하나의 아포스트로피를 추가 할 수 있다고 생각합니다.

예. '이 곳은 요한의 장소입니다'

여기서 MYSQL은 'This is John' 's place'라는 두 문장을 가정합니다.

당신은 '이곳은 요한의 장소'입니다. 나는 그것이 그렇게 작동해야한다고 생각합니다.



0

아마도 주제가 맞지 않지만 HTML 양식에서 텍스트 입력을 삭제하는 방법을 찾고 있었으므로 사용자가 아포스트로피 문자를 입력 할 때 텍스트를 SQL에 쓰려고 할 때 오류가 발생하지 않습니다. 기반의 DB 기반 테이블. 이 작업을 수행하는 몇 가지 방법이 있으며 SQL 삽입에 대해서도 읽을 수도 있지만 PHP의 간단한 옵션은 모든 아포스트로피 를 저장하려는 대상 으로 변환 하는 htmlspecialchars () 함수를 사용하는 것입니다. '어쨌든.


인코딩은 저장 용이 아니라 표시 용입니다. 준비된 진술을 사용하십시오.
mickmackusa

준비된 진술은 보안과 신뢰성의 황금 표준이라는 데 동의합니다. 텍스트 데이터를 HTML로 저장할 수있는 특정 사례를 강조하고 있었으며,이 경우 내 메서드 대신 바인딩 된 매개 변수를 사용하는 것입니다. HTML 입력, HTML 출력
Grindlay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.