일반적인 PHP 애플리케이션 개발에서 대부분의 로직에는 사용자가 성공적으로 로그인했는지 확인하고, 장바구니에 항목을 추가하고, 신용카드 거래를 처리하는 등의 데이터 처리 작업이 포함됩니다.
데이터는 수많은 소스에서 나올 수 있습니다. 보안에 민감한 개발자라면 두 가지 유형의 데이터를 쉽고 확실하게 구분해야 합니다.
l 필터링된 데이터
l 오염된 데이터
귀하가 직접 설정한 모든 신뢰할 수 있는 데이터는 필터링된 데이터로 간주될 수 있습니다. 사용자가 직접 설정한 데이터는 다음 이메일 주소 데이터와 같은 하드 코딩된 데이터입니다.
$email = 'chris@example.org';
위의 이메일 주소 chris@example.org는 원격 데이터 소스에서 나온 것이 아닙니다. 분명히 믿을만 합니다. 원격 데이터 원본에서 들어오는 모든 데이터가 입력되고, 모든 입력 데이터는 오염되어 있으므로 사용하기 전에 필터링해야 합니다.
오염된 데이터란 사용자가 제출한 양식, 메일 서버에서 받은 이메일, 기타 웹 애플리케이션에서 보낸 xml 문서 등 적법성을 보장할 수 없는 모든 데이터를 의미합니다. 이전 예에서 $email은 필터링된 데이터가 포함된 변수입니다. 데이터는 변수가 아니라 핵심입니다. 변수는 단지 데이터의 컨테이너일 뿐이며 프로그램이 실행될 때 오염된 데이터로 덮어쓰이는 경우가 많습니다.
$email = $_POST['email'];
물론 , 이것이 $email을 변수라고 부르는 이유입니다. 데이터를 변경하지 않으려면 대신 상수를 사용할 수 있습니다.
CODE:
아아앙
위의 명령문으로 정의된 경우 EMAIL은 스크립트 전체에서 chris@example.org 값을 갖는 변경되지 않는 상수이며 이를 다시 할당하려고 해도(대개 실수로) 변경되지 않습니다. 예를 들어, 다음 코드는 chris@example.org를 출력합니다.
(상수를 재정의하려고 시도하면 알림 수준의 오류 메시지가 발생합니다).
코드:
아아앙
팁
상수에 대한 자세한 내용은 //m.sbmmt.com /을 참조하세요.
1장에서 논의한 것처럼,register_globals는 $email과 같은 변수의 출처를 결정하기 어렵게 만들 수 있습니다. 외부 소스의 모든 데이터는 합법적인 것으로 입증될 때까지 오염된 것으로 간주되어야 합니다.
사용자는 다양한 방법으로 데이터를 보낼 수 있지만 대부분의 애플리케이션은 양식 제출 결과에 따라 가장 중요한 작업을 수행합니다. 다른 공격자는 제출된 데이터(애플리케이션이 작동하는 기반)를 조작하여 간단히 손상시킬 수 있으며, 양식을 통해 애플리케이션의 디자인과 사용하는 데 필요한 데이터가 편리하게 열립니다. 이것이 모든 웹 애플리케이션 보안 문제 중에서 양식 처리가 첫 번째 관심사인 이유입니다.
사용자는 세 가지 방법으로 앱에 데이터를 전송할 수 있습니다.
l URL(예: GET 데이터 방법)
l 요청 내용을 통해(예: POST 데이터 방법)
l HTTP를 통해 헤더 정보(쿠키 등)
HTTP 헤더 정보는 폼 처리와 직접적인 관련이 없으므로 이 장에서는 다루지 않습니다. 일반적으로 GET 및 POST 데이터에 대한 의심은 HTTP 헤더 정보를 포함한 모든 입력으로 확장될 수 있습니다.
表单通过GET或POST请求方式传送数据。当你建立了一个HTML表单,你需要在form标签的method属性中指定请求方式:
<form action="http://example.org/register.php" method="GET">
在前例中,请求方式被指定为GET,浏览器将通过URL的请求串部分传输数据,例如,考虑下面的表单:
CODE:
<form action="http://example.org/login.php" method="GET"> <p>Username: <input type="text" name="username" /></p> <p>Password: <input type="password" name="password" /></p> <p><input type="submit" /></p> </form>
如果我输入了用户名chris和密码mypass,在表单提交后,我会到达URL为//m.sbmmt.com/的页面。该URL最简单的合法HTTP/1.1请求信息如下:
CODE:
GET /login.php?username=chris&password=mypass HTTP/1.1 Host: example.org
并不是必须要使用HTML表单来请求这个URL,实际上通过HTML表单的GET请求方式发送数据与用户直接点击链接并没有什么不同。
记住如果你在GET方式提交的表单中的action中试图使用请求串,它会被表单中的数据所取代。
而且,如果你指定了一个非法的请求方式,或者请求方式属性未写,浏览器则会默认以GET方式提交数据。
为说明POST请求方式,只对上例进行简单的更改,考虑把GET请求方式更改为POST的情况:
CODE:
<form action="http://example.org/login.php" method="POST"> <p>Username: <input type="text" name="username" /></p> <p>Password: <input type="password" name="password" /></p> <p><input type="submit" /></p> </form>
如果我再次指定用户名chris和密码mypass,在提交表单后,我会来到//m.sbmmt.com/页面。表单数据在请求的内部而不是一个URL的请求串。该方式最简单的合法HTTP/1.1请求信息如下
CODE:
POST /login.php HTTP/1.1 Host: example.org Content-Type: application/x-www-form-urlencoded Content-Length: 30 username=chris&password=mypass
现在你已看到用户向你的应用提供数据的主要方式。在下面的小节中,我们将会讨论攻击者是如何利用你的表单和URL作为进入你的应用的缺口的。
以上就是PHP安全-表单与数据的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!