2017-05-13 11 views
0

このコードの例では、htmlspecialcharはXSSを防止していますが、SQLインジェクションを防ぐPDOの準備文ですか?XSSとSQLインジェクションを防ぐためにPDO準備文とhtmlspecialcharsを使用していますか?

if(isset($_GET['search']) AND !empty($_GET['search']) AND $_GET['search'] != ' ') { 
    $search = htmlspecialchars($_GET['search']); 
    $searchArray = explode(' ',$search); 
    var_dump($searchArray); 

    $videos = $stdb->prepare('SELECT id, title, videoTime FROM videos WHERE title LIKE "%'.$search.'%" OR title LIKE "%'.implode("\" OR title LIKE \"%", $searchArray).'%" ORDER BY id DESC limit '.$start.','.$videosPerPage); 
    $videos->execute(); 
    $totalVideos = $totalVideosReq->rowcount(); 
    $totalPages = ceil($totalVideos/$videosPerPage); 

    $currentPage = 1; 
    if(isset($_GET['page']) AND !empty($_GET['page']) AND $_GET['page'] > 0 AND $_GET['page'] <= $totalPages) { 
     $_GET['page'] = intval($_GET['page']); 
     $currentPage = $_GET['page']; 
    } else{ 
     $currentPage = 1; 
    } 
} 
+1

あなたのコードはSQLインジェクション攻撃に対して脆弱です。準備されたステートメントを実際に使用する方法を学んでください。 –

+1

ここをクリックしてください:http://php.net/manual/en/security.database.sql-injection.php – Bast

+0

また読む価値がある:[SQLインジェクションとは何か](http://stackoverflow.com/documentation/ php/5828/pdo/2685/prevent-sql-injection-with-parameterized-queries)と[なぜ単独でエスケープするだけでは不十分なのですか](http://stackoverflow.com/documentation/php/2784/php-mysqli/12843/escaping-strings) – Machavity

答えて

3

あなたはprepare()を呼び出すことが、ちょうどprepare()を呼び出すと、SQLインジェクションから保護するために魔法の方法ではありませんしています。

パラメータを使用せずに、依然として安全でないリクエストデータをSQLクエリにコピーしています。これがSQLインジェクションの仕組みです。

保護はパラメータを使用することです。また、prepare()と​​を使用する必要がありますが、あなたが覚えておくべきポイントは、それがprepare()ではなく、あなたを保護するパラメータ化であることです。

私はあなたにこれを理解していただきたいと思います。あなたがそれを理解するまで公開用ウェブサイトにコードを載せないように助言します。

あなたはまた、htmlspecialchars()を使用しているHow can prepared statements protect from SQL injection attacks?

P.S:への受け入れ答えでいいの説明をお読みください。これはSQLインジェクションに対する保護ではありません。 htmlspecialchars()を使用すると、別のセキュリティリスク、クロスサイトスクリプティングから保護するのに役立ちますが、SQLクエリを記述しているときではなく、出力をエコーし​​たいときにこれを行います。

+0

あなたの答えをありがとう!ですから、prepare()はクエリを準備するためのもので、複数回実行することができます。私がそれをよく理解していれば、証券化されたクエリを得るためには、クエリ(このコードでは "$ search")内の変数(入力)を証券化する必要があります。 "$ videos-> bindParam( ':検索'、$検索);"を入れて、クエリ内の$ search::searchを置き換えると、変数をセクショリングできますか? –

+0

正しい。パラメータは安全です。 –

関連する問題