ホームページ >データベース >mysql チュートリアル >SQL インジェクション攻撃から Web サイトを保護するにはどうすればよいですか?

SQL インジェクション攻撃から Web サイトを保護するにはどうすればよいですか?

黄舟
黄舟オリジナル
2017-05-20 17:21:031468ブラウズ

SQL インジェクション攻撃から Web サイトを保護するにはどうすればよいですか?

SQL インジェクション攻撃とは、攻撃者がサイト内の正規ユーザーの入力メカニズムを使用して SQL コードをデータベースに送信して実行することを意味します。SQL インジェクション攻撃を回避するための黄金律は、外部ソースに到達する前にすべてのデータをエスケープすることです。データベース。このルールは、INSERT ステートメントと UPDATE ステートメントだけでなく、SELECT クエリにも適用されます~

スクリプト クエリでプリコンパイルされたステートメントを使用すると、すべての SQL インジェクション攻撃の問題をほぼ排除できますが、query() メソッドの使用を選択した場合は、この保護には、クエリに追加されたユーザー入力を手動でエスケープする必要があります。コードは次のとおりです:

<?php
    $dbms = "mysql";                                  // 数据库的类型
    $dbName ="php_cn";                                //使用的数据库名称
    $user = "root";                                   //使用的数据库用户名
    $pwd = "root";                                    //使用的数据库密码
    $host = "localhost";                              //使用的主机名称
    $dsn  = "$dbms:host=$host;dbname=$dbName";
    $name =&#39;mr&#39;;
    $name ="&#39;or Name LIKE&#39;%";
    $query="select * from user where username = &#39;".$name."&#39;";//sql语句
try {
    $pdo = new PDO($dsn, $user, $pwd);//初始化一个PDO对象,就是创建了数据库连接对象$pdo
    $result = $pdo->query($query);    //输出结果集中的数据
    foreach ($result as $row){        //输出结果集中的数据
        ?>
<tr>
    <td bgcolor="#FFFFFF"><div align="center"><?php echo $row[&#39;username&#39;];?></div></td>
</tr>
<?php
    }
}catch (Exception $e){
    echo "ERROR!!".$e->getMessage()."<br>";
}
?>

この例では、SQL ステートメントの $name 変数がユーザーによって送信されたフォームから取得されたものであると想定されています。通常、ユーザーは「mr」のようなものを送信し、次の SQL ステートメントを生成します:

select * from user where username = &#39;mr&#39;

これはスクリプトに問題を引き起こしませんが、「賢い」攻撃者は「'OR Name LIKE'%」と入力する可能性があります。その結果、次の SQL ステートメントが生成されます:

select * from user where username = &#39;mr&#39;

これによってスクリプトに問題が発生することはありませんが、「賢い」攻撃者は「'OR Name LIKE'%」を入力し、次の SQL ステートメントが生成される可能性があります:

select * from user where username ="OR Name LIKE&#39;%&#39;

This kind入力の割合が増えると、テーブル全体が攻撃者に公開され、非常に機密性の高いデータの場合は完全に公開されてしまいます。では、この問題を解決するにはどのような方法が考えられるでしょうか?

解決策

この問題を解決するには、PDO の quote メソッドを使用して、SQL 文字列に渡されるデータをエスケープすることができます。SQL コードを次のように変更するだけです。 SQL クエリを引用する prepare() メソッドとexecute() メソッドの使用を考慮しない限り、この中で使用される各データのショートカットはありません。

注:

PDO->query() メソッドを使用している場合、ユーザーの入力を引用するには常に quote() メソッドを使用する必要があります。これは「常に必須」であることに注意してください。

prepare() メソッドとexecute() メソッドの使用を選択した場合、プリコンパイルされた SQL にバインドする必要がある値 (例:データベースに挿入される場合)、ドライバーはユーザーに代わってすべての作業を実行します。ただし、動的 ​​SQL ステートメントを作成している場合、変数をプリコンパイルされた SQL ステートメントにバインドできない場合があります。バインドできない使用済みの値をすべて引用符で囲みます (例: GROUP BY 句、ORDER BY、またはテーブル名)。 SQL インジェクション攻撃から Web サイトを保護する方法に関する解決策はこれですべてです。このセクションの知識ポイントは誰でも簡単に習得できると思います~

以上がSQL インジェクション攻撃から Web サイトを保護するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。