2009-02-27 4 views
7

사용자가 텍스트 영역에 텍스트를 입력합니다. 그런 다음 mySQL 데이터베이스에 직접 삽입됩니다. 나는 trim, htmlentities, mysql_real_escape_string을 사용하고 마술 따옴표를 활성화했다. 해당 데이터를 텍스트 영역으로 다시 출력 할 때 어떻게 위생 처리해야합니까?텍스트 영역에서받은 데이터를 텍스트 영역으로 다시 출력 할 때 적절하게 위생 처리하는 방법은 무엇입니까?

도움 주셔서 감사합니다. 이 작업을 수행하는 올바른 방법에 대해 너무 확신하지 못했습니다 ...

+0

마술 따옴표를 사용 중지하는 것이 좋습니다. 나중에 문제가 발생합니다. –

답변

14

저장할 때 htmlentities을 사용하지 마십시오. 표시 할 때는 htmlentities을 사용해야합니다. 경험 법칙은 필요할 때까지 데이터를 암호화/위생 처리하지 않습니다. 사용자가 입력을 편집하고 싶을 때 htmlentities을 저장하면 텍스트에 html_entity_decode을 입력해야합니다. 그래서 당신은 당신이 필요로하는 것을 더 위생적으로 소독합니다. 저장시 SQL 주입을 위생 처리해야하므로 mysql_real_escape_string입니다. 표시 할 때 XSS에 대해 위생 처리가 필요하므로 htmlentities입니다.

또한 Darryl Hein의 의견을 보았는지 확신 할 수 없지만 magic_quotes를 사용하고 싶지는 않습니다. They are a bad, bad, thing 및 PHP 5.3으로 사용되지 않으며 당신이 PHP의 이전 버전에 대한 소독하는 올바른 방법을 사용하지 않는, htmlentities()를 사용하는 경우에 대한 파올로의 대답에 추가

+0

그게 유일한 예방 조치일까요? –

+0

문자열이 무엇이든간에 HTML을 허용하지 않아도된다면 그게 전부입니다. HTML을 허용하기를 원한다면 매우 위험한 흰색 목록과 기타 등줄이 될 수 있습니다. –

+0

BBCode를 파싱 할 때도 마찬가지입니다. –

2

PHP 6에 모두 사라질 것 mysql DB에 삽입하는 것은 의 일부인 Prepared Statements을 사용하는 것입니다. 이는 mysql_real_escape_string()을 사용할 필요를 대체합니다.

그 외에도 다른 것들을 다루었다고 생각합니다.

+1

준비된 문을 사용하는 것만으로는 충분하지 않습니다. 바인드 된 매개 변수를 사용해야합니다. IOW : '?'를 사용하십시오. SQL 문자열에서 stmt-> bind_param()을 사용하여 데이터를 보내십시오. – Javier

+0

정상적인 워크 플로에서는 prepare 문에 도달하기 전에 유효하지 않은 텍스트를 잡으려고하지 않으시겠습니까? 어떤 경우에는 mysql_real_escape_string을 사용하는 것이 적절하지 않은가? – AlxVallejo

관련 문제