MySQLSQLインジェクションを防ぐには? SQL インジェクションの原則と防止
MySQL および SQL インジェクション
ユーザーが Web ページから入力したデータを取得して、MySQL データベースの場合、SQL インジェクションのセキュリティ上の問題が発生する可能性があります。
この章では、SQL インジェクションを防止し、スクリプトを使用して SQL に挿入された文字をフィルタリングする方法を紹介します。
いわゆる SQL インジェクションとは、Web フォームに SQL コマンドを挿入してドメイン名やページ リクエストのクエリ文字列を送信または入力することで、サーバーをだまして悪意のある SQL コマンドを実行させることです。
ユーザー入力を信用してはいけません。ユーザー入力データは安全ではないと想定する必要があり、ユーザー入力データをフィルタリングする必要があります。
次の例では、入力するユーザー名は文字、数字、およびアンダースコアの組み合わせである必要があり、ユーザー名の長さは 8 ~ 20 文字である必要があります。
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) { $result = mysqli_query($conn, "SELECT * FROM users WHERE username=$matches[0]"); } else { echo "username 输入异常"; }
特殊文字がフィルタリングされていない場合に発生する SQL の状況を見てみましょう。
// 设定$name 中插入了我们不需要的SQL语句 $name = "Qadir'; DELETE FROM users;"; mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");
上記のインジェクション ステートメントでは、$name の変数をフィルター処理しませんでした. 必要のない SQL ステートメントが $name に挿入され、users テーブル内のすべてのデータが削除されます。
PHP の mysqli_query() は複数の SQL ステートメントを実行できませんが、SQLite と PostgreSQL は同時に複数の SQL ステートメントを実行できるため、これらのユーザーのデータを厳密に検証する必要があります。
SQL インジェクションを防ぐには、次の点に注意する必要があります。
- 1. ユーザー入力を信用しない。ユーザーの入力を確認してください。正規表現を使用したり、長さを制限したりできます。一重引用符や二重 "-" などを変換してください。
- 2.動的アセンブリSQLを使用しないでください。パラメータ化されたSQLを使用するか、ストアドプロシージャを直接使用してデータのクエリとアクセスを行うことができます。
- 3. 管理者権限でデータベース接続を使用しないでください。アプリケーションごとに権限が制限された別のデータベース接続を使用してください。
- 4. 機密情報を直接保存したり、パスワードや機密情報を暗号化またはハッシュ化したりしないでください。
- 5. アプリケーションの例外情報は、ヒントをできるだけ少なくする必要があります。また、カスタム エラー情報を使用して元のエラー情報をラップすることをお勧めします。
- 6. SQL インジェクションの検出方法は、一般的に補助的な方法を採用しています。ソフトウェアまたは検出する Web サイト プラットフォーム、ソフトウェアは一般的に sql インジェクション検出ツール jsky を使用し、Web サイト プラットフォームには Yisi Web サイト セキュリティ プラットフォーム検出ツールがあります。 MDCSOFT SCAN 他MDCSOFT-IPS を使用すると、SQL インジェクションや XSS 攻撃などを効果的に防御できます。
SQL インジェクションを防ぐ
PerlやPHPなどのスクリプト言語では、ユーザーが入力したデータをエスケープしてSQLインジェクションを防ぐことができます。
PHP の MySQL 拡張機能は、特殊な入力文字をエスケープする mysqli_real_escape_string() 関数を提供します。
if (get_magic_quotes_gpc()) { $name = stripslashes($name); } $name = mysqli_real_escape_string($conn, $name); mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");
like ステートメントへの挿入
ユーザーが "_" と "%" で値を入力すると、次のようにクエリが実行されます: ユーザーは最初に "abcd_" をクエリしたかったのに、クエリ結果に "abcd_"、"abcde"、"abcdf" が含まれています。など。ユーザーが「30%」(注: XNUMX%) を照会したい場合にも問題が発生します。
PHP スクリプトでは、次の例のように addcslashes() 関数を使用して上記の状況を処理できます。
$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_"); // $sub == \%something\_ mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%'");
addcslashes() 関数は、指定された文字の前にバックスラッシュを追加します。
構文形式:
addcslashes(string,characters)
参数 | 描述 |
---|---|
文字列 | 必須。チェックする文字列を指定します。 |
文字 | オプション。addcslashes() によって影響を受ける文字または文字の範囲を指定します。 |
Hope Chen Weiliang ブログ ( https://www.chenweiliang.com/ ) 共有 "MySQL は SQL インジェクションをどのように防止しますか? sqlインジェクションの原理と予防」、参考になります。
この記事のリンクを共有することを歓迎します。https://www.chenweiliang.com/cwl-500.html
Chen WeiliangのブログのTelegramチャンネルへようこそ。最新のアップデートを入手できます!
📚 このガイドには非常に価値のある内容が含まれています。🌟これはめったにない機会です、お見逃しなく! ⏰⌛💨
気に入ったらシェア&いいね!
あなたの共有といいねは、私たちの継続的な動機です!