사용자가 PHP 용 Evernote SDK를 사용하여 Evernote 계정에 로그인 할 수있게 해주는 간단한 PHP 응용 프로그램 (MyApp)을 작성했습니다. 하지만, 내 응용 프로그램에서, 나는이 작업을 수행 할 수 :쿠키에서 PHP 로그인 - 일부 SQL 주입 방지 예
- 사용자가 Evernote에 로그인을 승인
- 의 MyApp 등 # 1의 requestToken, requestTokenSecret를 수신
- 의 MyApp의 쿠키에 저장 # 2 및
$_SESSION
- 나중에 사용자가 내 사이트로 돌아 오면 MyApp가 쿠키를 통해 쿠키를 기록합니다.
예, 쿠키 기반 로그인은 안전하지 않습니다. 그러나 내 응용 프로그램은 중요한 데이터를 저장하지 않습니다. 가장 간단한 방법은 무엇입니까?
//if cookie
if (isset($_COOKIE['requestToken'])) {
$m = new mysqli(MYSQL_SERVER, MYSQL_USER, MYSQL_PASS, MYSQL_DB);
$q = "SELECT uid FROM users WHERE token={$_COOKIE['requestToken']} and secret={$_COOKIE['requestTokenSecret']}";
// cookie matches db?
if ($result = $m->query($q)) {
$_SESSION['login']=TRUE;
$result->close();
}
else // no match
$_SESSION['login']=FALSE;
}
else { //no cookie - create
if (EverNoteLogin()) {
$year=time()+86400*365; //86400 = 1 day
setcookie('requestToken',$_SESSION['requestToken'],$year);
setcookie('requestTokenSecret',$_SESSION['requestTokenSecret'],$year);
}
}
이 개선 사항 버전
//if cookie
if (isset($_COOKIE['requestToken'])) {
//check db
$m = new mysqli(MYSQL_SERVER, MYSQL_USER, MYSQL_PASS, MYSQL_DB);
$s=$m->prepare("SELECT uid FROM user WHERE token=? AND secret=?");
$s->bind_param('ss',$rt, $rs);
$rt=$_COOKIE['requestToken'];
$rs=$_COOKIE['requestTokenSecret'];
$s->execute();
$s->store_result();
$n=$s->num_rows;
//match db?
if ($n) {
if ($n==1) { // 1 match
$s->bind_result($uid);
$_SESSION['uid']=$uid;
$_SESSION['login']=TRUE;
}
else
$_SESSION['login']=FALSE; // >1 match not good
}else
$_SESSION['login']=FALSE;
}
else { //no cookie - create
if (EverNoteLogin()) {
$year=time()+86400*365; //86400 = 1 day
setcookie('requestToken',$_SESSION['requestToken'],$year);
setcookie('requestTokenSecret',$_SESSION['requestTokenSecret'],$year);
}
}
이것은 SQL 삽입에 취약합니다. '$ _COOKIE'는 사용자 데이터이며 신뢰할 수 없습니다. MySQLi를 사용하고 있기 때문에 이것은'query()'호출보다는 준비된 문장이어야한다. –
먼저 변수에 $ _COOKIE 정보를 저장 한 다음이를 이스케이프합니다. $ token = mysql_real_escape_string ($ _ COOKIE [ 'requestToken']); –
MySQL 웹 사이트 Juapo2 (http://php.net/manual/en/function.mysql-real-escape-string.php) : "이 확장의 사용은 권장하지 않으며 대신 MySQLi 또는 PDO_MySQL 확장을 사용해야합니다 . " –