2013-10-19 3 views
3

postgresql에 연결하기 위해 노드 js와 모듈 pg를 사용하고 있습니다. 태그 데이터베이스를 검색하려고하지만 작동하지 않게하려면 을 입력하십시오. 변수 태그 i가 url의 param을 저장했지만 consult가 결과를 반환하지 않습니다. 어떻게 수정할 수 있습니까?postgresql과 노드 j에서 비슷한 검색을하는 방법

app.get("/tags", function(req, res){ 
     var tag = req.query.q; 
     res.json(tag) 
     var search = db.client.query("SELECT * FROM tags WHERE name LIKE '%$1%'", [tag], function(err, result){ 
       res.json(result); 
      } 
     ); 
    }); 

답변

9

잘 모르겠지만 node.js PostgreSQL 인터페이스가 좋다고 생각합니다. 이 번호가 틀 포함 리터럴 SQL 문자열입니다 : 문자열 내부에 자리이기 때문에

'%$1%' 
해당 문자열 내부

$1tag의 값으로 대체되지 않습니다하지 자리는 모두, 그들은 단지 문자열을하고 있다는 자리 표시 자와 같은 형식을가집니다.

두 가지 일반적인 옵션은 다음과 같습니다

  1. 클라이언트 코드에서 % 와일드 카드를 추가합니다.
  2. % 와일드 카드를 데이터베이스 내의 문자열에 연결하십시오.

과 같을 것이다 첫 번째 :

db.client.query("SELECT * FROM tags WHERE name LIKE $1", ['%' + tag + '%'], ... 

이 같은 두 번째 : 당신이 선호하는 접근 중

db.client.query("SELECT * FROM tags WHERE name LIKE '%' || $1 || '%'", [tag], ... 

사용. 같은

+0

덕분에 많은 첫 번째 예는 내가 첫 번째 버전은 초 미만 SQL 주입을 허용 추측 나 –

+0

에 적합합니다. 두 번째 것은 더 취약한 것처럼 보입니다. – Heribert

+1

@Heribert SQL 문자열 연결이 일어나기 전에 '$ 1'이 SQL에 대해 올바르게 이스케이프 처리되므로 아무런 차이가 없어야합니다. –

1

ES6 솔루션이 될 것 무언가 :

client.query('select * from users where user_name Ilike $1', [`%${req.query.q}%`], (err1, result) => { ...

+0

이것은 왜 투표가 중단 되었습니까? 그리고 그 이유는 명확하지 않습니다. 왜 여기에 보안 문제가 있습니까? – James

관련 문제