0

基本的なブログを作成しており、次のコードを使用しています。

URLからID(常に数字)を収集していますが、使用する前に、誰かがコードのセキュリティをチェックして、大丈夫かどうか教えてくれるのではないかと思いましたか?

注射などは本当はしたくないですし、できるだけ安全に保ちたいと思っています。

<?php
    if(is_numeric($_GET['id']) && $_GET['id'] > 0){

        include("connectionfile.php");

        $ia = intval($_GET['id']);
        $ib = mysql_real_escape_string($ia);
        $ic = strip_tags($ib);

        $qProfile = "SELECT * FROM #### WHERE id='$ic'  ";
        $rsProfile = mysql_query($qProfile);
        $row = mysql_fetch_array($rsProfile);
        extract($row);
        $title = trim($title);
        $post = trim($post);
        $date = trim($date);
        mysql_close();
    }else{
       echo 'hack error here';
    }
?>
4

3 に答える 3

0

このコードはめちゃくちゃです;-)

  1. if ステートメントは単純化できます "if (($id = (int)$_GET['id']) > 0) {"
  2. 1. 私の指摘を了承していただければ、$ia、$ib、$ic を削除できます。
  3. データベースのデータを trim() しないでください! データベースに INSERT する前に、データをトリミングする必要があります。
  4. @FilmJがあなたに答えたことを読んでください
于 2012-09-09T10:57:20.303 に答える
0
$ia = intval($_GET['id']);
$ib = mysql_real_escape_string($ia);
$ic = strip_tags($ib);

strip_tagsHTML コンテキストでのみ関連するため、役に立ちません。SQL インジェクションを防ぐには、他の 2 つの方法のいずれかで十分です。一般に、扱っている言語に適したエスケープ メカニズムを使用してください。この場合、SQL を扱っているので、mysql_real_escape_string単独で問題ありません。エスケープの段階的なアプローチについては、 The Great Escapism (または、テキスト内のテキストを操作するために知っておくべきこと)を参照してください。

さらに良いことに、廃止されたmysql_関数の代わりに準備されたステートメントを使用して PDO を学び、SQL インジェクションの問題をより適切に解決します。

于 2012-09-09T10:36:54.583 に答える
0
  1. 関数を使用しないでくださいmysql_。それらは非推奨です。mysqli または PDO を使用します。
  2. パラメータ化されたクエリを使用する
  3. ローカルスコープを汚染するため、「抽出」を使用しないでください。安全であるまれなケースがあり、通常はオブジェクト内にある ORM の内部にあります。特にSQLインジェクションが成功した場合、あらゆる形式の厄介な変数名が導入される可能性があるため、これは危険です。
  4. データベース エラーによってページが完全に壊れないように例外処理を行います。また、SQL インジェクションによって強制的に実行された不適切なクエリの場合、クエリが壊れていることを示すものは何も表示されません。
  5. 上記のすべてを実行した後でも、htmlentities()表示する前に、データを使用するか、データが期待どおりであることを確認してください。
于 2012-09-09T10:37:35.007 に答える