2011-05-11 2 views
0

나는 보통 다음과 같이하여 사용자 입력을 피할 수있다 :PHP : 사용자 입력이 "예방 접종 된"방법에 관한 조언

htmlspecialchars($str,ENT_QUOTES,"UTF-8");

그리고 mysql 연결이 가능할 때마다 mysql_real_escape_string($str).

어떻게 개선 할 수 있습니까? 나는 지금까지이 문제에 아무런 문제가 없었지만 그것에 대해 확신 할 수 없다.

고맙습니다.

+1

* 사용자 입력은 * 사용 *되었을 때만 이스케이프해야하며 그 정확한 사용에 필요한 위생 방법 만 사용해야합니다. 관련 또는 속임수 : [PHP : 궁극적 인 깨끗한/보안 기능] (0120-13995) –

+0

나는 그것을 읽을거야. 고맙습니다. – Francisc

답변

2

는 스토리지 (살균)과 디스플레이를 위해 인코딩. 데이터는 이 아니어야합니다.은 저장 용으로 인코딩해야합니다. 원시 데이터 만 저장하려고합니다. 이스케이프 문자는 저장되지 않으므로 이스케이프 처리는 원시 데이터를 전혀 변경하지 않습니다. 원시 데이터와 명령 구문의 차이점을 올바르게 알리기 위해서만 사용됩니다. 한마디로

, 당신은 다음을 수행 할 :

또한 마법 따옴표를 사용하는 경우 사용자의 입력에서 슬래시를 제거해야 할 수도 있습니다
$data = $_POST['raw data']; 
//Shorthand used; you all know what a query looks like. 
mysql_query("INSERT " . mysql_real_escape_string($data)); 

$show = mysql_query("SELECT ..."); 
echo htmlentities($show); 
// Note that htmlentities() is usually overzealous. 
// htmlspecialchars() is enough the majority of the time. 
// You also don't have to use ENT_QUOTES unless you are using single 
// quotes to delimit input (or someone please correct me on this). 

. stripslashes()이면 충분합니다.

당신이 char(5)있는 DB 필드가 있다고 가정 : 다음과 같은 예를 들자면, 저장을 위해 인코딩하지해야하는 이유에 대해서는

. html 입력은 maxlength="5"입니다. 사용자가 "& & & & &"이라고 입력하면 완전히 유효 할 수 있으며 "& &"으로 저장됩니다. 검색된 후 사용자에게 다시 표시 될 때 인코딩하지 않으면 "& &"이 표시되며 이는 올바르지 않습니다. 인코딩을하면 "& amp; &"으로 잘못 표시됩니다. 사용자가 저장하려는 데이터를 저장하지 않습니다. 원시 데이터를 저장해야합니다.

이것은 또한 사용자가 특수 문자를 저장하려는 경우 문제가됩니다. 이것들을 어떻게 보관합니까? 너는하지 않는다. 그대로 보관하십시오.

SQL 인젝션을 막으려면 적어도 최소한 mysql_real_escape_string의 이스케이프 입력을 사용해야하지만 PDO와 같은 DB 래퍼와 함께 prepared statement를 사용하는 것이 좋습니다. 어떤 것이 가장 잘 작동하는지 파악하거나, 직접 작성하십시오 (그리고 철저히 테스트하십시오).

XSS (교차 사이트 스크립팅)로부터 보호하려면 사용자 입력을 다시 표시하기 전에 인코딩하십시오.

+0

감사합니다, tandu. – Francisc

+0

잘 설명! – Tech4Wilco

1

mysql_real_escape_string($str)만을 사용하여 SQL 삽입을 피할 경우 항상을 쿼리에서 인용 부호로 묶어 확인하십시오.

안전하지 않은 출력을 화면에 구문 분석 할 때 htmlspecialchars를 사용해도됩니다.

+0

고마워요, 웨슬리. – Francisc

1

데이터베이스가 PDO로 전환됩니다. 훨씬 쉬워서 당신을 위해 도망갑니다. 데이터 탈출한다

http://php.net/pdo

+0

감사합니다, Prikkeldraad. – Francisc