2013-07-04 4 views
1

이것은 데이터 삭제에 대한 기본적인 질문입니다. 사용자가 < 또는>를 입력해야하는 정당한 이유가없는 양식 필드가 있는데, html과 javascript를 주입하는 데 사용할 수 있습니다.POST 필드에 '<' nor '>'도 포함되어 있지 않은 경우 안전합니까?

htmlentities와 다양한 스트립 기능을 사용하지 않고도 자신의 장소에서 사용할 수있게되어 기쁩니다.이 베어 본 2 단계 접근 방식이 스크립트의 안전성을 보장하는지 궁금합니다.

  1. 브라우저 관련 삽입을 피하려면 필드에 '<'또는 '>'이 포함되어 있는지 확인하십시오.
  2. SQL 인젝션을 피하기 위해 필드를 데이터베이스로 보내기 전에 PDO quote() 함수를 사용하십시오.

미리 감사드립니다.

+1

당신이 그것을 생각하지 않았기 때문에 다른 사람이하지 않는다는 것을 의미하지는 않습니다. 항상 제대로 일하십시오. –

+3

** 자리 표시 자 **를 사용하지 않는 경우 잘못 처리하면 존재하지 않는 문제가 생깁니다. DB에 데이터를 보낼 때 "quoting"을 잊어 버리십시오. 자리 표시자를 사용하면 * SQL Injection *을 잊어 버릴 수 있습니다. 그러나 모든 사용 사이트는 주사를 피하기 위해 적절한 기술을 사용해야합니다. 즉 데이터가 나중에 사용되었습니다. 각 * 사용 사이트 *는 다르게 작동합니다. URL을 인코딩합니까? HTML 엔티티를 이스케이프합니까? JSON 인코딩? 자리 표시 자? 그냥 사용하십시오. 항상. – Paul

+0

데이터베이스에있을 때 값으로 무엇을하고 있습니까? – Gumbo

답변

3

그것은 <textarea>을 만약 문자열이 어떤 앰퍼샌드 (&)를 포함하는 경우 당신은 여전히 ​​예상치 못한 효과를 얻을 수 있지만, 당신은 XSS 주사로부터 안전 아마이있어.

필드가 <input> 인 경우 따옴표도 이스케이프 처리해야합니다. 예를 들어, 값이 " onmouseover="alert('foo'); (큰 따옴표로 묶인 속성을 사용하고 있다고 가정 할 때, 작은 따옴표를 사용하는 경우에는 두 가지 유형의 따옴표를 서로 바꿔 가며) 값이 무엇이 될지 고려하십시오.

  • 가가 아닌 HTML 문자열을 포함 할 때마다 :

    어쨌든, 할 수있는 안전한 것은 필요 이스케이프 (등 HTML, SQL,) 문맥에서 사용되는 문자열을 탈출 항상 이다 HTML 코드에서 htmlspecialchars()을 사용하십시오.

  • SQL 쿼리에 비 SQL 문자열을 포함시킬 때마다 DB 라이브러리의 인용 방법을 사용하십시오 (예 : PDO::quote(), mysqli_escape_string() 등). 또는 더 나은 것은 use placeholders입니다. 그래서 사용자 입력을 SQL에 처음부터 임베드 할 필요가 없습니다. 당신이 문자열이 여전히해야 할 올바른 일이 탈출, 탈출 할 필요 모든 문자가 포함되지 않습니다 확인있어하더라도

. 또한 문자열이 포함 할 수도 있고 포함하지 않을 수도있는 가정에 대한 변경 사항이 변경되는 경우 물지 않게됩니다.

+0

직접 답변을 작성하고 제 베어 본 접근 방식에 대한 구체적인 조언을 해주셔서 감사드립니다. 여러분이 언급 한 인용문의 문제는 전혀 발생하지 않았습니다. 정말 기뻐요. – zx81

+0

을 명확히하기 위해, 당신은 당신이 이것에 꽤 행복하다고 느낄 것입니까? $ db-> quote (htmlspecialchars ($ string)) 준비된 문장과 관련하여 convo를 복제하지 않기 위해 원래 게시물의 주석에 설명을 요청했습니다. 다시 한 번 감사드립니다. – zx81

+1

+1. @playful : Ilmari가 말했듯이 컨텍스트에서 문자열을 사용하는 시점에서 탈출합니다. 이는 HTML 페이지에 문자열을 놓는 순간에'htmlspecialchars()'를한다는 것을 의미합니다. 데이터베이스 입력에서 처리하는 것은 잘못된 방법입니다. 데이터베이스에서 처리 할 수없는 마크 업으로 끝나고 데이터베이스에서 가져온 HTML에 문자열을 넣을 때 안전하지 않습니다. 또한 일반적으로'$ db-> quote()'를 수동으로 호출하는 것보다 매개 변수화 된 쿼리 ('$ db-> prepare()')를 사용해야합니다. 보안 실수를하기가 더 쉽고 어렵습니다. – bobince