문제

얼마나 위험한가 이 php?무엇을 할 수 있을까요?

$name = $_POST["user"];
$pwd = $_POST["pwd"];
$query = "SELECT name,pwd FROM users WHERE name = '$name' AND pwd = '$pwd'";
도움이 되었습니까?

해결책

가능한 문제 :

  1. SQL 주입
  2. XSS 주입 (이 코드가 삽입 쿼리 인 경우 확실한 문제가 될 것입니다)
  3. 일반 텍스트 비밀번호

SQL 문은 문제가 될 수 있습니다. SQL 주입을 위해 자신을 열어 두는 것은 나쁜 일입니다.

SQL 주입은 나쁘다. 날 믿어.

HTML 페이지에 $ 사용자를 표시하려면 사람들이 명령을 입력하여 레이아웃을 "해킹"할 수있는 기능을 포함하지 않을 수 있습니다.

<H1>HI MOM</H1>

또는 많은 것들 자바 스크립트.

또한 비밀번호를 평범한 텍스트로 저장하지 마십시오 (좋은 캐치 Cagcowboy!). 데이터베이스를 관리 (또는 해킹)하는 사람들에게 너무 많은 힘을줍니다. 누군가의 암호를 알 필요가 없습니다.

이와 같은 전술을 시도하십시오.

// mostly pulled from http://snippets.dzone.com/posts/show/2738
function MakeSafe($unsafestring) 
{
    $unsafestring= htmlentities($unsafestring, ENT_QUOTES);

    if (get_magic_quotes_gpc()) 
    { 
        $unsafestring= stripslashes($unsafestring); 
    }

    $unsafestring= mysql_real_escape_string(trim($unsafestring));
    $unsafestring= strip_tags($unsafestring);
    $unsafestring= str_replace("\r\n", "", $unsafestring);

    return $unsafestring;
} 

// Call a function to make sure the variables you are 
// pulling in are not able to inject sql into your 
// sql statement causing massive doom and destruction.

$name = MakeSafe( $_POST["user"] );
$pwd = MakeSafe( $_POST["pwd"] );

// As suggested by cagcowboy: 
// You should NEVER store passwords decrypted.
// Ever.  
// sha1 creates a hash of your password
// pack helps to shrink your hash
// base64_encode turns it into base64
$pwd = base64_encode(pack("H*",sha1($pwd)))

다른 팁

이 위험합니다 :xkcd bobby tables

SQL 주입을 제외하고, 비밀번호가 일반 텍스트로 저장 될 수있는 것처럼 보입니다.

이 코드는 $ 쿼리를 SQL 데이터베이스에 전달하지 않으면 매우 안전합니다.

하나가 게시된다면 0';drop table users;-- 이름을 위해

당신의 명령은 결국 존재합니다

select name, pwd form users where name='0'; 
drop table users; --'and pwd = '[VALUE OF PWD]'

따라서 먼저 데이터를 얻은 다음 사용자 테이블을 죽이고 나머지는 주석이기 때문에 아무것도하지 않습니다.

PHP의 특정 MySQL 명령은 SQL을 통과 할 때 여러 쿼리를 수행합니다.이를 피하는 가장 좋은 방법은 매개 변수화 쿼리입니다.

모든 DB 액세스에 PDO를 사용하고 강력히 추천합니다. 머리 위에 링크가 없지만 Google을 사용한 튜토리얼을 기억합니다.

SQL 주사가 발생하기 쉬운 일뿐만 아니라 주입이 의도하지 않은 경우에도 실패 할 것입니다.

예를 들어 사용자는 "Guillaume François Antoine, Marquis de L 'Hospital"이라는 이름을 원합니다. 사용자 이름에는 견적이 포함되어 있고이를 피하기 때문에 사용자가 시스템을 깨고 싶지는 않지만 쿼리가 실패합니다!

어느 쪽이든 pdo 또는 이런 식으로 수행하십시오.

$query = sprintf(
                   "SELECT 1 FROM users WHERE name = '%s' AND password = '%s'",
                   mysql_real_escape_string($_POST['name']),
                   mysql_real_escape_string(md5($_POST['password']))
                 );

믿거 나 말거나, 이것은 안전하다 ... magic_quotes_gpc 켜집니다. 그것은 결코 PHP6에 있지 않을 것이므로, 그 전에 그것을 고치는 것은 좋은 생각입니다.

  1. $_POST['user'] = "' or 1=1; --"; 누군가가 즉시 응용 프로그램에 대한 액세스

  2. $_POST['user'] = "'; DROP TABLE user; --"; 스(유료?) 사용자 목록별

  3. 당신이 나중에 에코$에 이름을 출력할 수 있는 결과에 XSS 주입 공격

: o 절대 절대하지 말고, 이것은 sqlinejection 공격을 일으킬 수 있습니다. 예를 들어 사용자 입력과 같은 경우 : '드롭 테이블 사용자 - $ username의 입력으로; 이 코드는 기관 코드와 관련하여 테이블을 삭제합니다. 해커는 더 많은 일을하고 웹 사이트를 해킹 할 수 있습니다.

이것은 일반적으로 매우 위험합니다. 경우에 따라 데이터베이스 권한에 의해 완화 될 수 있습니다.

입력 ($ 이름 및 $ PWD)을 검증하지 않습니다. 사용자는 이러한 필드 중 하나 또는 둘 다로 SQL을 보낼 수 있습니다. SQL은 데이터베이스에서 다른 데이터를 삭제하거나 수정할 수 있습니다.

매우 위험합니다. 비밀번호에 대한 좋은 아이디어는 암호를 MD5 해시로 변환하고이를 사용자의 '비밀번호'로 저장하는 것입니다.
1) 사용자가 암호를 도난 당하지 않도록 보호합니다. 2) 사용자가 악의적 인 문자열을 쓰면 항목/테이블/데이터베이스를 닦을 수 있습니다.

또한 이름으로 기본 매치 레지스어 표현식을 수행하여 A-ZA-Z0-9 만 사용하고 악센트가있는 몇 가지 악센트 (특수 문자, *'s, <'s,> 's)가 있는지 확인해야합니다. .

사용자 데이터가 SQL 쿼리에 관련되면 항상 데이터를 SANATIZE mysql_real_escape_string.

또한 비밀번호 자체 대신 비밀번호의 소금에 절인 해시 만 저장해야합니다. 다음 기능을 사용하여 임의의 소금 값으로 소금에 절인 해시를 생성하고 점검 할 수 있습니다.

function saltedHash($data, $hash=null)
{
    if (is_null($hash)) {
        $salt = substr(md5(uniqid(rand())), 0, 8);
    } else {
        $salt = substr($hash, 0, 8);
    }
    $h = $salt.md5($salt.$data);
    if (!is_null($hash)) {
        return $h === $hash;
    }
    return $h;
}

모두 함께:

$query = 'SELECT pwd FROM users WHERE name = "'.mysql_real_escape_string($_POST['user']).'"';
$res = mysql_query($query);
if (mysql_num_rows($res)) {
   $row = mysql_fetch_assoc($res);
   if (saltedHash($_POST["pwd"], $row['pwd'])) {
       // authentic
   } else {
       // incorrect password
   }
} else {
   // incorrect username
}

안전하지 않으며 PDO와 같은 것을 조사하고 싶을 수도 있습니다.PHP PDO

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top