Comments (4)
안녕하세요. SIR 입니다.
의견 주셔서 감사합니다.
from gnuboard5.
@thisgun -$wr_id
로 바뀌었군요.
이게 기준 값이 바뀌어버리는 셈인데 문제가 발생할 수 있습니다.
-$wr_id
가 이 이슈의 중복 문제를 해결하는 가장 확실한 방법이지만, 그누보드 커뮤니티에서 흔히 "끌올(끌어 올리기)", "점프" 기능이라고 불리는 wr_num
컬럼의 값을 임의로 변경해 게시물을 가장 앞으로 정렬 시키는 팁이나 스킨, 플러그인 등으로 공유되는 것들이 있습니다. 저도 이런 기능을 만들다가 발견한 이슈입니다.
근데 이런 것들이 마찬가지로 get_next_num()
함수를 이용하는 방법으로 wr_num
컬럼의 값을 변경하는데 이번 변경사항을 아래와 같은 문제가 발생합니다.
3개의 글이 순서대로 작성한 상태 (정렬은 wr_num ASC)
wr_id | wr_num |
---|---|
3 | -3 |
2 | -2 |
1 | -1 |
wr_id=1 글을 끌어올리기 (가장 작은 wr_num(-3)에서 1을 뺀 값(-4)으로 지정)
wr_id | wr_num |
---|---|
1 | -4 |
3 | -3 |
2 | -2 |
새로운 글을 작성하면 wr_id=4로 글이 작성됨
wr_id | wr_num |
---|---|
4 | -4 |
1 | -4 |
3 | -3 |
2 | -2 |
이와 같이 wr_num이 겹치는 문제가 발생합니다.
이런 문제로 일명 "끌올" 기능을 활용하는 사이트에서는 wr_num
중복 문제가 더욱 심각해집니다.
"끌올" 기능을 빈번하게 사용할수록 기존 코드보다 우연이 아닌 확정적으로 문제가 발생합니다.
이 문제는 기존과 같이 get_next_num()
을 사용했던 상황을 고려해 호환성을 유지하는 방법으로 서브쿼리로 대체하는 방법이 적절할 것 같습니다.
diff --git forkSrcPrefix/bbs/write_update.php forkDstPrefix/bbs/write_update.php
index d6d47647af35ec6f6a7f830fa5a711bb49b4c70d..6edd6fc69cffdb0bc1aee911448c476d1cf5d7a5 100644
--- forkSrcPrefix/bbs/write_update.php
+++ forkDstPrefix/bbs/write_update.php
@@ -259,7 +259,7 @@ if ($w == '' || $w == 'r') {
}
$sql = " insert into $write_table
- set wr_num = '$wr_num',
+ set wr_num = (select min(wr_num) - 1 from $write_table sq),
wr_reply = '$wr_reply',
wr_comment = 0,
ca_name = '$ca_name',
물론 이번에 추가된 코드 $add_wr_update_sql = ($wr_num === 0) ? ", wr_num = '-$wr_id' " : "";
등은 다시 제거되어야 합니다.
제가 이 이슈에서 wr_parent
를 같이 언급한 이유가 기존 방식은 유지하되 wr_num
을 서브쿼리로 값을 가져와 사용하여 지연 문제를 줄이도록 개선하고, 이는 완전히 문제를 해결하지 못할 수 있기 때문에 비밀답글의 권한이 잘못 주어지는 문제를 해결하기 위해서 답글의 wr_parent
를 답글 자신의 wr_id
가 아닌 원본 글의 wr_id
를 기록하는 방식... 즉, "댓글(comment)"과 같은 방식의 적용이 가능한가에 대한 것입니다.
현재는 원본글과 마찬가지로 답글 또한 wr_id === wr_parent
이므로 원본글을 찾는데 문제가 발생하지만 wr_parent
값을 댓글처럼 원본글의 wr_id
를 사용한다면 원본글을 찾을 때 발생하는 문제를 해결할 수 있을 것 같아서 언급한 것입니다. 다만, 아직 관련 코드를 완전히 살피지 못해서 이 부분은 sir 개발자분들이 확인을 해주시길 바랐던 것입니다.
from gnuboard5.
wr_parent
관련해서 코드를 다 살피지 못했기 때문에 PR이 아닌 이슈만 남겼던 것인데, 보안취약점은 어쩔 수 없겠지만 버그 등의 문제는 이슈 제출자가 변경된 코드를 확인하는데 시간을 좀 주셨으면 합니다.
이슈 내용을 나름대로 열심히 적었다고는 하지만 윗 댓글처럼 설명하지 못한 부분이나 부족한 부분이 있을 수 있습니다.
저도 업데이트하고 확인하다보니 아차 싶었습니다만, 이러면 제 이슈가 버그를 만들어 내는 원인이 되어버렸다는 생각에 철렁합니다.
내 이슈가 해결이 되었는지 확인하고 이슈 내용이 제대로 전달되었는지 이슈 제출자 스스로도 판단할 시간이 필요합니다.
이슈 제출자에게 3~7일 가량의 시간을 주시면 좋을 것 같습니다.
배포 전에 이슈나 코드에 대해 상호 점검할 시간이 주어졌으면 합니다.
from gnuboard5.
안녕하세요. SIR 입니다.
코드를 제공해 주셔서 정말 감사합니다.
알려주신 코드를 참고하여 코드를 수정했습니다.
from gnuboard5.
Related Issues (20)
- qa 게시판 에러 HOT 1
- faq 부분에 헤더 문제 HOT 1
- 로그인 헤더 와 푸터 문제요 HOT 1
- 메뉴 정렬 문제 HOT 1
- 조건 $i > 0 는 항상 false ? HOT 1
- 최신 그누보드 게시판 글쓰기 에러 HOT 1
- 문법 오타 제보합니다 HOT 2
- 취소...
- 최신그누보드) 게시판 관리 목록 훅 이슈 문제 HOT 3
- 소셜로그인 타임아웃기간이 길어서 api 장애시 문제됩니다. HOT 1
- 최신 그누보드 에서 회원 관리 에러 HOT 1
- Open Redirect 취약점 HOT 1
- member_confirm, Open Redirect 취약점 HOT 1
- login, Open Redirect 취약점 HOT 1
- 게시판에서 회원 아이디로 댓글 검색 시 잘못된 결과가 나오는 문제 HOT 1
- 나이스 페이 결제시 완료 후 마지막에서 500에러
- `HTMLPurifier_Filter_iframevideo` 클래스명의 대소문자 불일치 HOT 1
- 초기화되지 않은 `$cache` 변수 HOT 1
- IE 5.5 체크 코드 삭제
- http 1.0 헤더 삭제
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from gnuboard5.