2

重複の可能性:
PHPでSQLインジェクションを防ぐための最良の方法

私のウェブサイトは無防備であることがわかりました。

DBに接続されており、登録、パスワードの変更、通知などの機能を備えているため、完全に脆弱であると想定しています。

安全を確保するために、コードを調べる必要がありますか?

つまり、私はいくつかの調査を行いましたが、どこでも、セキュリティについては誰もが異なることを言っています。

「PDOを使用してください。」

「mysql_real_escape_stringを使用してください。」

「addslashesを使用してください。」

正確に何を探すべきですか?

"$_POST" and "$_GET" variables??
"$_SESSION" variables?

SQLクエリ?

$sql = "select * from user";
$sql = "update user set user="new_user_name";
$sql = "insert into user (user) values ('userid')";

いずれの場合もどうすればよいですか?何をどこに行かなければならないかを知るのを手伝ってください。

ありがとうございました。

4

4 に答える 4

5

以下は、安全なphpアプリケーションを作成するための考慮事項です。

  1. PDO または mysqli を使用
  2. 入力を信頼しないでください。すべての変数、つまり $_POST、$_GET、$_COOKIE、$_SESSION、$_SERVER が汚染されているかのように考えてください。これらの変数に対して適切なフィルタリング手段を使用します。
  3. XSS 攻撃を回避するには、ユーザー入力データをデータベースに挿入する際に、php の組み込み関数 htmlentities、strip_tags などを使用します。
  4. PHP.INI で登録グローバルを無効にする
  5. PHP.INI で「allow_url_fopen」を無効にする
  6. ユーザーが必要以上のデータを入力できないようにします。最大文字数を許可するように入力を検証します。また、関連するデータ型について各フィールドを検証します。
  7. 開発期間後にエラー報告を無効にします。ハッカーに役立つデータベースに関する情報を提供する可能性があります。
  8. フォームの投稿中に 1 回限りのトークンを使用します。トークンが存在し、フォームの投稿と一致する場合は有効です。それ以外の場合は無効です。
  9. パラメータ化されたデータベース クエリを使用する
  10. ストアド プロシージャを使用する

詳細については、各ポイントをググることができます。お役に立てれば

于 2012-08-07T05:08:01.470 に答える
1

探すべきもの:クライアント/ユーザーから送信されたデータ。このデータをサニタイズ/エスケープします。

PDOは ( PDO::prepareを使用して) クエリをサニタイズでき、複数の SQL システムをサポートします。

MySQL の場合は、MySQLiを使用します。mysqli_real_escape_stringMySQL を使用している場合、データのサニタイズに使用する関数です。

于 2012-08-07T05:06:40.720 に答える
1

あなたが提供した SQL クエリはどれも、実際には SQL インジェクションに対して脆弱ではありません。

SQL 入力が適切にエスケープされないため、SQL インジェクションの脆弱性が発生します。

例えば:

$sql = "select * from users where user_id ="  . $_GET['user_id'];

以下を渡したかどうかを検討してください。

http://some_server.com/some_page.php?user_id=123%20or%201=1

実行時のクエリは次のようになります。

select * from users where user_id = 123 or 1=1

これを修正するには、パラメーター化されたクエリを使用します。

$query = "select * from users where user_id = ?"

user_id 値をクエリにバインドすると、データ アクセス レイヤーは入力文字列を適切にエスケープし、次の処理が実行されます。

select * from users where user_id = '123 or 1=1' which would not return any rows, preventing the injection

PHP と mysql 拡張機能を使用している場合:

$sql = "select * from users where user_id = '" . mysql_real_escape_string($_GET['user_id']) . "'";

SQL クエリに入るすべての入力をエスケープする必要があることに注意してください。

$sql = "select id_column from some_table where id = 1";
$stmt = mysqli_query($conn, $sql);
if($stmt === false) die(mysqli_error($conn) . "\n");
while($row = mysqli_fetch_assoc($conn, $stmt) {
    $sql = "update some_other_table set some_value = 'new value' where some_column = '" . mysqli_real_escape_string($conn, $row['id_column']) . "'";
    ....
}

これは、データベースから選択した値に、"O'Hara" という名前や例など、SQL ステートメントで実行するのに安全ではない文字が含まれている可能性があるためです。}

于 2012-08-07T05:10:16.557 に答える
0

私はPDOを使用しています。

あなたの場合の例:

<?php
   $stmt = $dbh->prepare("insert into user (user) values (?)");
   $stmt->bindParam(1, $name);
   $name = 'ValueHere';
   $stmt->execute();
?>
于 2012-08-07T05:25:02.897 に答える