2011-08-12 3 views
1

SQL 입문에 취약한 다음 코드로 몇 년간 자습서를 작성 했으므로 끝내야합니다.PHP injector에 취약한 PHP 코드

누구나 나에게 설명 할 수 있습니까 mysql_real_escape_strinng()? 현재 방탄 방법입니까?

//Function to sanitize values received from the form. Prevents SQL injection 
    function clean($str) { 
    $str = @trim($str); 
    if(get_magic_quotes_gpc()) { 
     $str = stripslashes($str); 
    } 
    return mysql_real_escape_string($str); 
} 

//Sanitize the POST values 
$usr = $_SESSION['usr']; 
$live = (isset($_POST['live']))?1:0; 
$created = date("F j, Y, g:i a",time()+60*60); 
$title= clean($_POST['title']); 
$content = clean($_POST['content']); 

//Create INSERT query 
$qry = "INSERT INTO news(usr, live, created, title, content) VALUES('$usr', '$live', '$created', '$title', '$content') "; 
$result = @mysql_query($qry); 
+0

가능한 중복 http://stackoverflow.com/ 질문/60174/best-way-to-stop-sql-injection-in-php) –

+0

+1 좋은 코드. '$ _SESSION [ 'usr']'이 이미 새 니타 이징되었다는 것을 전제로하면 괜찮습니다! – TMS

답변

1

예, 그렇습니다. 이 경우.

"보편적 인 위생 처리"와 같은 것은 없습니다. 그게 전부이기 때문에 으로 인용합시다.MySQL의 쿼리

  • HTML 코드
  • JSON에 대한
  • like 표현 MySQL의 쿼리에 대한

    1. 문자열 값 : 인용하면

      , 당신은 항상 위해 같은 일부 특정 출력을, 텍스트를 인용

    2. mysql 정규식
    3. 각각의 사용이 다른 구문 컨텍스트 내에 존재하기 때문에
    4. PHP는 각각의 경우를 들어 정규 표현식

    , 당신은, 인용 다른 필요합니다. 이것은 또한 인용문을 PHP로 입력하면 안되지만 특정 출력은입니다! magic_quotes_gpc과 같은 기능이 손상된 이유는 무엇입니까 (사용하지 않는 것이 좋습니다).

    그렇다면 이러한 특정 사례에서 인용을 위해 사용하는 방법은 무엇입니까?

    1. mysql_real_escape_string($str)
    2. mysql_real_escape_string(addcslashes($str, "%_"))
    3. htmlspecialchars($str)
    4. json_encode()을 (더 현대적인 방법이있을 수 있습니다, 정정 해줘 자유롭게,하지만 나를 위해 노력하고 있습니다 이러한) - 단지 UTF8을 위해! iso-8859-2에 대한 함수를 사용합니다.
    5. mysql_real_escape_string(addcslashes($str, '^.[]$()|*+?{}')) - 백 슬래시가 두 번 이스케이프되므로이 경우 preg_quote를 사용할 수 없습니다!
    6. preg_quote()
  • 2

    예, 괜찮습니다. You can use prepared statements,하지만

    모든 오류를 숨기려면 @를 사용하지 마십시오!

    +0

    +1을 준비하십시오. SQL 인젝션을 막을뿐만 아니라 특정 쿼리를 훨씬 빨리 수행 할 수 있습니다! –

    1

    해킹과 관련하여 어떠한 것도 방탄하지 않습니다. 그 말은 그렇다. mysql_real_escape_string()은 SQL 삽입 공격을 막는다.

    2

    검색어 문자열에 추가하는 모든 것은 mysql_real_escape_string으로 탈출해야합니다. 대부분의 SQL 주입을 막을 것입니다. 그러나 더 나은 prepared statements

    예를 사용

    $pdo = new PDO($dsn,$username,$pass); 
    $stmt = $pdo->prepare("select * from Table where id=?"); 
    if ($stmt->execute(array(1))){ 
        $content = $stmt->fetchAll(); 
    } 
    

    는 참조

    +0

    @ 존 - 사용 예를 들려 줄 수 있습니까? – Iladarsda

    1

    에 대한 PDO::__construct를 참조하십시오 난 당신의 방법은 SQL 주입 저장라고 생각합니다.

    1

    나는의 sprintf() 함수에서

    sprintf(" SELECT * from table_name WHERE value = '%s'", mysql_escape_string("$var_value")); 
    

    이 %의처럼 뭔가를 할 것이라고는 인수가 문자열로 취급하고 표현을 나타냅니다.

    위의 예와 같은 공격이 이루어진 경우 쿼리는 다음과 같이 표시됩니다. 소스보기 print?

    SELECT * FROM `members` WHERE username='john' AND password='\' OR \'\'=\'' 
    

    빈 결과 집합을 반환합니다. (source)

    1
    당신이 위험한 문자를 탈출, mysql_real_escape_string를 사용할 수 있습니다

    ...

    $sanitized_query = sprintf("SELECT * FROM table WHERE field='%s', mysql_real_escape_string($value)); 
    
    ([PHP에서 SQL 주입을 중지하는 가장 좋은 방법]의