2

「get_magic_quotes_gpc」の後方互換性がない php 5.3 から 5.4 にアップグレードしています。コードが機能することは理解していますが、毎回 FALSE を返すだけです。

しかし、コードからこれを削除する時が来たと思います。

典型的な例を次に示します。

     $product_id = "0";
        if (isset($HTTP_GET_VARS["id"])) {
          $rid = (get_magic_quotes_gpc()) ? $HTTP_GET_VARS["id"] : addslashes($HTTP_GET_VARS["id"]);
        }

       //then $product_id gets used all over the place in many different queries

これを修正する方法を研究してきましたが、これが私が思いついたものです:

    $rid = "0";
    if (isset($HTTP_GET_VARS["id"])) {
    $rid = addslashes($HTTP_GET_VARS["id"]);
    }

私はここで頭を少し超えています。これはすべてSQLインジェクションなどに関係していることを私は知っています。私の解決策は合理的/容認できるものですか?

前もって感謝します。

<<<< 編集 - 追加情報 >>>>

返信ありがとうございます。実際、約 18 か月前に PDO への変換を多数行いました (主に、この種のスタックオーバーフローに関するアドバイスによるものです :)

そのため、冗長で無意味なコードが実行されている可能性があります。これは、URL から変数を取得する、上に投稿したコードの下で何が起こっているかの全体像です。

以前はそこにあった (get_magic_quotes_gpc) が、コメント アウトされて (addslashes) に置き換えられていることがわかります。しかし、その変数は PDO クエリに渡されます。

$product_id = "0";
if (isset($HTTP_GET_VARS["id"])) {
  //$product_id = (get_magic_quotes_gpc()) ? $HTTP_GET_VARS["id"] : addslashes($HTTP_GET_VARS["id"]);
  $product_id = addslashes($HTTP_GET_VARS["id"]);
}

// NEW QUERIES - BEG xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

try {  
    # MySQL with PDO_MYSQL  
    $pdo = new PDO("mysql:host=$hostname_db;dbname=$database_db", $username_db, $password_db);  
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

    // Query 1:  product details
    $stmt = $pdo->prepare('SELECT 
    [a bunch of stuff here, fields, joins, etc]
    WHERE product_id = ? ');  
    $stmt -> execute(array($rid));
    $row_count_resto_details = $stmt->rowCount();
    $row_resto_details = $stmt->fetch(PDO::FETCH_ASSOC);


}  
// Error message for pdo
catch(PDOException $e) {  
    echo $e->getMessage();  
}  


// END QUERY xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

最初の 4 ~ 5 行のコードをすべて削除して、次のようにすることはできますか。

$product_id = $HTTP_GET_VARS["id"];
4

1 に答える 1

5

いいえ、それは合理的ではありません。

問題は、「マジック クォート」機能はそもそも悪い考えだったということです。そのため、それを複製しようとしても、これまで壊れたソリューションに依存していたことを意味するだけであり、アプリケーションは間違いなく SQL インジェクション攻撃に対して脆弱です。 .

「なぜ魔法の引用符は壊れた解決策なのですか?」、おそらくあなたは尋ねるでしょう。その答えは、質問自体に隠されているようなものです。セキュリティと IT 全般は、魔法ではありませんし、魔法になることもできません。自分自身を宣伝する、または少なくとも「魔法の」ように機能するように見えるソリューションを目にするときはいつでも、それは悪いことであり、決して信頼すべきではないことを知ってください.

代わりに必要なのはコンテキスト認識ソリューションであり、SQL インジェクションを防止する場合は、パラメーター化されたクエリです。詳細については、こちらをお読みください: How can I prevent SQL-injection in PHP?

また、PHP 5.6 に直接アップグレードすることを強くお勧めします。これには主に次の 2 つの理由があります。

  • PHP 5.4 はあと 1 か月でサポートが終了しますが、それだけでセキュリティ リスクが生じる可能性があります。
  • そうしない理由はありません。正直なところ、アップグレード パスは簡単で、下位互換性に関する懸念があったとしてもほとんどありません。PHP は現在、はるかに安定しており、5.3 から 5.4 への大幅な変更はほとんどありません。

更新(拡張された質問に答えるために):

addslashes()ロジックを削除できるだけでなく、それを行う必要があります。そのままにしておくと、入力データの一部にスラッシュが追加され、これらのスラッシュがデータ自体の一部になります
代わりにやりたいことは、入力データを検証することです-最初に適切な形式であるかどうかを確認してください。たとえば、数値の ID が必要な場合は、使用する前に数字のみが含まれているかどうかを確認してください。

また、PHP 4.1 以降は非推奨$HTTP_GET_VARSとなっているため、代わりに使用する必要があります。$_GET

于 2015-08-05T19:14:01.097 に答える