2015-01-28 5 views
0

안드로이드 개발자로서 안드로이드 앱의 요청을 위해 서버를 준비하고 싶습니다. 첫 번째 목표는 데이터베이스에 항목을 추가하기위한 요청 링크를 만드는 것이 었습니다. 그래서 Slim framwork에 의해 PHP 파일에서 아래와 같은 것을 만들었습니다.Slim framework - php - 주사를 방지하는 방법은 무엇입니까?

내 질문은입니다 : /addEntry을 호출하여 데이터베이스가 떨어지거나 더 나쁜 것이 아닌 "나쁜 텍스트"를 주입 할 수있는 기회가 있습니까? 어떻게 내가 이것을 막을 수 있니?

p.s 내 말을 잘 들어 주길 바랍니다.

<?php 

require 'Slim/Slim.php'; 
\Slim\Slim::registerAutoloader(); 

$app = new \Slim\Slim(); 

$app->get(
    '/', 
    function() { 
     echo "working"; 
    } 
); 

ini_set('display_startup_errors', 1); 
ini_set('display_errors', 1); 
error_reporting(-1); 

$username = ; 
$password = ; 
$hostname = ; 
$database = ; 

$dbhandle = mysql_connect($hostname, $username, $password) or die("Unable to connect to MySQL"); 

if (!mysql_select_db($database)) { 
    die("not connected"); 
} 

//#addEntry 
$app->post(
    '/addEntry', 
    function() { 
     $app = \Slim\Slim::getInstance(); 
     $cat_id = $app->request()->post('cat_id'); 
     $ent_name = $app->request()->post('ent_name'); 
     $ent_description = $app->request()->post('ent_description'); 

     if ($cat_id == NULL || $ent_name == NULL) { 
      $app->halt(400); 
     } 

     mysql_query('SET CHARACTER SET utf8'); 
     mysql_query("insert into t_entries VALUES(NULL, '" . $ent_name . "', " 
       . (empty($ent_description) ? "NULL" : "'". $ent_description ."'") 
       . "," . $cat_id . ", '0');"); 

     return; 
    } 
); 

$app->run(); 

$app->run(); 
+0

사용하는 프레임 워크가 그러한 종류의 보호 기능을 내장하지 않은 경우 사용자 입력을 피해야합니다. SQL 인젝션에 대해 읽어보십시오. 많은 예제가 있습니다. 또한 mysql 함수는 더 이상 사용되지 않습니다. – Whirlwind

+0

라이브러리를 바꿀 때까지'mysql_real_escape_string()'을 stop-gap으로 찾는다. 이 함수를 통해 SQL에 삽입 될 모든 사용자 입력을 전달하면 OK가됩니다. 매개 변수 바인딩은 여전히 ​​갈 방법입니다! – halfer

+0

:'$ app-> run()'을 두 번 호출하는 이유는 무엇입니까? – halfer

답변

0

Doctrine 또는 Eloquent와 같은 기존 ORM을 사용하는 것이 좋습니다. 그렇다면 사용자 입력에 대해 많은 걱정을 할 필요가 없습니다.

네이티브 PHP 함수를 계속 사용하려면 mysql_connect()을 사용하지 마십시오. 대신 mysqli_connect()을 사용하십시오. SQL 주입을 방지하려면 mysqli_prepare()을 사용하여 SQL 쿼리를 준비합니다. 내가 살균하는 PHP 함수 filter_var를 사용하는 것이 좋습니다

$app->post('/addEntry',function() use ($app) { 
1

:

$app->post('/addEntry',function() { 
    $app = \Slim\Slim::getInstance(); 

이 같은 use 키워드 폐쇄에 변수를 전달할 수 있습니다

또한, 당신은이 작업을 수행 할 필요가 없습니다 입력 값. 이 외에도 RedBean이나 Eloquent 또는 Doctrine과 같은 ORM을 사용하는 것이 좋습니다. 좀 더 밝아 지길 원한다면 Dabble 또는 Medoo과 같은 라이브러리를 사용하십시오. 마지막으로, PHP 네이티브 함수를 사용하지 않는 것이 좋습니다.

관련 문제