PHP 개발 시 주의해야 할 보안 문제
$myUsername = ‘tmyer';
$arrayarrayUsers = array(‘tmyer', ‘tom', ‘tommy');
define(“GREETING”, ‘Hello there' . $myUsername);
?>
그러나 아래의 데이터 요소는 모두 흠이 있다.명세서 2.안전하지 않고 흠이 있는 코드
$myUsername = $_POST['username']; //tainted!
$arrayarrayUsers = array($myUsername, ‘tom', ‘tommy'); //tainted!
define(“GREETING”, ‘hello there' . $myUsername); //tainted!
?>
왜 첫 번째 변수 $my Username에 하자가 있습니까?양식 POST에서 직접 가져오기 때문입니다.사용자는 파일을 지우거나 이전에 업로드한 파일을 실행하기 위한 악성 명령을 포함하여 이 입력 영역에 문자열을 입력할 수 있습니다."알파벳 A-Z만 사용하는 클라이언트를 사용할 수 없습니까(Javascrīpt) 폼 검사 발은 원래 이런 위험을 피하나요?네, 이것은 항상 좋은 절차입니다. 그러나 뒤에서 보듯이 누구나 모든 폼을 자신의 기계에 다운로드하여 수정한 후에 그들이 필요로 하는 모든 내용을 다시 제출할 수 있습니다.솔루션은 간단합니다: $_POST['username']에서 정리 코드를 실행합니다.만약 이렇게 하지 않는다면, $myUsername을 사용할 때 (예를 들어 그룹이나 상수에서) 이 대상들을 오염시킬 수 있습니다.사용자 입력을 정리하는 간단한 방법은 정규 표현식으로 처리하는 것이다.이 예시에서 자모만 받아들이기를 바란다.문자열을 특정 수량의 문자로 제한하거나 모든 알파벳을 소문자로 요구하는 것도 좋은 생각일 수 있다.명세서사용자의 입력을 안전하게 합니다
$myUsername = cleanInput($_POST['username']); //clean!
$arrayarrayUsers = array($myUsername, ‘tom', ‘tommy'); //clean!
define(“GREETING”, ‘hello there' . $myUsername); //clean!
function cleanInput($input){ $clean = strtolower($input);
$clean = preg_replace(“/[^a-z]/”, “”, $clean);
$clean = substr($clean,0,12);return $clean;
}
?>
규칙 2: 보안을 실시하기 어려운 PHP 설정을 사용하지 않는 것은 사용자의 입력을 신뢰할 수 없다는 것을 알고 기계에서 PHP를 설정하지 말아야 하는 방식을 알아야 한다.예를 들어, register_ 를 비활성화하려면globals.만약 register_globals, 같은 이름의 GET나 POST 문자열을 $variable로 바꾸는 등 부주의한 일을 할 수 있습니다.이 설정을 비활성화하면 PHP는 정확한 이름 공간에서 정확한 변수를 인용하도록 강요합니다.양식 POST에서 변수를 사용하려면 $_ 참조해야 합니다.POST['variable'].이렇게 하면 이 특정 변수를 쿠키, 세션 또는 GET 변수로 오해하지 않습니다.규칙3: 만약 그것을 이해하지 못한다면 일부 개발자들이 이상한 문법을 사용하거나 문장을 치밀하게 조직하여 간단하지만 의미가 모호한 코드를 형성하는 것을 보호할 수 없다.이런 방식은 효율이 높을 수 있지만, 코드가 무엇을 하고 있는지 이해하지 못하면 어떻게 보호할지 결정할 수 없습니다.예를 들어, 다음 두 단락의 코드 중 어느 단락을 좋아하십니까?명세서코드를 쉽게 보호할 수 있도록 하다
//obfuscated code
$input = (isset($_POST['username']) ? $_POST['username']:”);
//unobfuscated code
$input = ”;
if (isset($_POST['username'])){
$input = $_POST['username'];
}else{
$input = ”;
}
두 번째 비교적 뚜렷한 코드 세그먼트에서 $input에 하자가 있음을 쉽게 알 수 있으며 정리를 해야 안전하게 처리할 수 있다.규칙 4:'종심방어'는 새로운 법보 본 강좌에서 온라인 폼을 어떻게 보호하는지 예시로 설명하고 폼을 처리하는 PHP 코드에서 필요한 조치를 취한다.마찬가지로 PHP regex를 사용하여 GET 변수가 완전히 숫자인지 확인하더라도 SQL 조회에서 전의적인 사용자 입력을 사용할 수 있도록 조치를 취할 수 있습니다.종심 방어는 좋은 생각만이 아니라, 당신이 심각한 번거로움에 빠지지 않도록 보장할 수 있다.기본 규칙을 논의했으니 이제 첫 번째 위협인 SQL 주입 공격을 연구하자.◆ SQL 주입 공격을 방지하기 위해 SQL 주입 공격에서 사용자는 폼이나 GET 검색 문자열을 조작하여 데이터베이스 조회에 정보를 추가한다.예를 들어 간단한 로그인 데이터베이스가 있다고 가정하자.이 데이터베이스의 모든 기록에는 사용자 이름 필드와 암호 필드가 있습니다.사용자가 로그인할 수 있도록 로그인 폼을 만듭니다..
<html>
<head>
<title>Login</title>
</head>
<body>
<form action=”verify.php” method=”post”>
<p><label for='user'>Username</label>
<input type='text' name='user' id='user'/>
</p> <p><label for='pw'>Password</label>
<input type='password' name='pw' id='pw'/>
</p> <p><input type='submit' value='login'/></p>
</form>
</body>
</html>
이 폼은 사용자가 입력한 사용자 이름과 비밀번호를 받아들여 사용자 입력을verify로 제출합니다.php 파일입니다.이 파일에서 PHP는 로그인 폼에서 나온 데이터를 처리합니다. 다음과 같습니다. 목록 5.안전하지 않은 PHP 양식 처리 코드입니다
<?php
$okay = 0;
$username = $_POST['user'];
$pw = $_POST['pw'];
$sql = “select count(*) as ctr from users where username='
”.$username.”‘ and password='”. $pw.”‘ limit 1″;
$result = MySQL_query($sql);
while ($data = mysql_fetch_object($result)){
if ($data->ctr == 1){
//they're okay to enter The application!
$okay = 1;
}
}
if ($okay){
$_SESSION['loginokay'] = true;
header(“index.php”);
}else{
header(“login.php”);
}
?>
이 코드는 보기에 문제없을 것 같은데, 맞습니까?세계 각지의 수백 개의 PHP/MySQL 사이트에서 이런 코드를 사용하고 있다.그것은 어디에 틀렸습니까?좋아, "사용자 입력을 신뢰할 수 없음"을 기억해라.여기에는 사용자로부터 온 정보에 대한 전의가 없기 때문에 응용 프로그램이 공격을 받기 쉽다.구체적으로 어떤 유형의 SQL 주입 공격도 발생할 수 있다.예를 들어 사용자가 foo를 사용자 이름으로 입력하고'or'1′='1을 암호로 입력하면 실제적으로 다음 문자열을 PHP에 전달하고 조회를 MySQL에 전달합니다
<?php
$sql = “select count(*) as ctr from users where username=
'foo' and password=” or '1′='1′ limit 1″;
?>
이 조회는 항상 계수 값 1을 되돌려주기 때문에 PHP에서 접근을 허용합니다.암호 문자열의 끝에 일부 악성 SQL을 주입하면 해커는 합법적인 사용자로 분장할 수 있다.이 문제를 해결하는 방법은 PHP의 내장 mysql_real_escape_string () 함수는 사용자가 입력한 패키지로 사용됩니다.이 함수는 문자열의 문자를 정의하여 문자열이 삐침표 등 특수 문자를 전달할 수 없게 하고 MySQL이 특수 문자에 따라 조작하도록 합니다.명세서 7은 전의로 처리된 코드를 보여 줍니다.명세서 7은 전의로 처리된 코드를 보여 줍니다
<?php
$okay = 0;
$username = $_POST['user'];
$pw = $_POST['pw'];
$sql = "select count(*) as ctr from users where username='".mysql_real_
_string($username)."' and password='". mysql_real_escape_string($pw)."'
limit 1";
$result = mysql_query($sql);
while ($data = mysql_fetch_object($result)){
if ($data->ctr == 1){ //they're okay to enter the
application!
$okay = 1;
}
}
if ($okay){
$_SESSION['loginokay'] = true;
header("index.php");
}
else{
header("login.php");
}
?>
mysql_ 사용하기real_escape_string () 은 사용자가 입력한 패키지로서 사용자가 입력한 악성 SQL 주입을 피할 수 있습니다.만약 사용자가 SQL을 통해 전달된 기형적인 암호를 주입하려고 시도한다면, 다음 조회는 데이터베이스에 전달됩니다
select count(*) as ctr from users where username='foo' and password=
'\' or \'1\'=\'1′ limit 1″
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.