1

textarea改行を保持しながらMySQLデータベースにデータを保存および取得するにはどうすればよいですか? ユーザーがクロスサイト スクリプティングや SQL インジェクション攻撃を実行できない最も安全な方法でそれを行うにはどうすればよいですか?

mysql_real_escape()最初に関数を介してユーザーの入力データをフィルター処理しINSERT INTO、次にデータベースをフィルター処理し、取得時にhtmlspecialchars()関数を使用する必要がありますか?

データを安全に保存し、改行を維持する方法を知りたいだけです。誰かが私に次のような例を教えてくれることを願っています:

<?php
    $con = mysql_connect(host,username,password);
    mysql_select_db(contents_db);

    //Filtering process to prevent SQL-Injection
    $content = mysql_real_escape($_POST['content']);

    mysql_query('INSERT INTO contents_db (content, time) VALUES ({$content},{time()}');

    if(mysql_insert_id() > 1){
        $query = mysql_query('SELECT * FROM contents_db ORDER BY time DESC LIMIT 1');
        $text = mysql_fetch_object($query);

        //Outputting process to preserve line-breaks
        echo htmlspecialchars($text->content);
    }

    mysql_close($con);
?>

私の例がすでに正しい場合、それをさらに良く安全にする方法を誰か教えてもらえますか?

4

1 に答える 1

3

を使用した完全な例ですPDO。ほんの一例ですが、さまざまな方法で改善できます (たとえば、getDatabaseResult($query)クエリの例外チェックを簡単にするような単一の関数を作成するなど)。

try{
    $PDO = new PDO("mysql:host=".$db_host.";dbname=".$db_name, $db_user, $db_pass);
}
catch(PDOException $e){
    die('mysql connection error');
}

// if post data is set - add new row
if(isset($_POST['content']))
{
    try{
        $query = $PDO->prepare('INSERT INTO contents_db (content, time) VALUES ?,?');
        $res   = $query->execute(array($content,time()));
    }
    catch(PDOException $e){
        die('insert query failed');
    }
}

// if last query was executed - select data
// or you can call for "$PDO->lastInsertId();"
if($res){
    try{
        $query = $PDO->prepare('SELECT * FROM contents_db ORDER BY time DESC LIMIT 1');
        $res   = $query->execute();
        $res   = $query->fetchAll(PDO::FETCH_ASSOC);
    }
    catch(PDOException $e){
        die('select query failed');
    }

    //Outputting process to preserve line-breaks
    echo nl2br($text['content']);
}
于 2012-12-06T07:35:03.777 に答える