0

今後数日で、サイトを保護する必要があります(これは私が行いました)config.phpファイル(すべてのphpページで呼び出されます)に書き込むと思いました

while($value = current($_POST)){
    $_POST[key($_POST)]=htmlentities($value);
    next($_POST);
}

config.phpで、私はさまざまなxxsとsqlインジェクションからsiscuroになると思いますか?各フィールドはさまざまな方法で検証する必要があり、データベースにはhtmlエンティティを含めない方がよいことを私は知っています。

1)投稿するだけでなく、他にどのような変数をフィルタリングする必要がありますか?2)このメソッドは、コードの複数のインジェクション(xxs、sqlインジェクションなど)から私を安全にしますか?

編集:そして、htmlentitiesの代わりにmysql_real_escape_stringを配置した方が良いでしょうか?データ検証などでセキュリティが完全ではないことを確認したいのですが、次のようにインジェクションから保護します:sqlとxxsおよびその他のインジェクション

編集:もちろん、「ddd」を使用すると、phpタグを削除する機能も提供されます(サイトは実行されないと確信していますが)

ありがとう :)

4

4 に答える 4

2

「セキュリティ」と「迅速」という言葉を同じ意味で使用しないでください。それはおそらくうまく終わらないでしょう... :)

すでに述べたように、HTML エンティティをデータベースに保存するのではなく、htmlentities出力を表示するときに適用する方が「クリーン」になります (または、エスケープを処理するテンプレート エンジンを使用します)。

htmlentitiesSQL インジェクションに対しては役に立ちませhtmlentities("' OR 1=1 --")(想像してみてください)。mysql_real_escape_stringまたはそのようなものが必要です$pdo->quote-ただし、準備されたステートメントが最善の方法です。

ただし、これをオントップ アプローチで適用することは (不可能ではないにしても) 非常に困難です。使用する SQL ステートメントを調べて、準備済みステートメントに置き換えるか、少なくともこれらのクエリで使用する入力パラメーターをエスケープしてください。

于 2013-01-23T11:20:22.207 に答える
2

そんな簡単なことならみんなやってるでしょ。そうすれば、安全なコードを書くために良い方法を使用するようにアドバイスする人は誰もいません。これは行く方法ではありません。「キャッチオール」コードによって誤って変更される可能性のあるデータベースの値が本当に必要な場合があります。キャッチオールは、安全な検証メカニズムを実現するための方法ではありません。

数日以内にサイトを保護する必要があります

この方法でサイトを保護しようとしても、最高の状態で数日しか安全に保たれません.

于 2013-01-23T11:20:36.830 に答える
1

通常、サイトを構築するときにこの種のことを行うのは良い考えです. Web サイトごとに異なるレベルのセキュリティが必要であることは当然です。自分だけがアクセスするローカル Web サイトには何も必要ないかもしれませんが、小さな「イントラネット」スタイルのサイトには基本的なセキュリティしか必要ないかもしれません。

このサイトが数日で実装できるレベルのセキュリティしか必要としないと思われる場合. 次に、最初のステップは、APIに応じて、すべてのユーザー入力がmysql_real_escape_string()関数または同様のものを介して実行されることを確認することです(この関数は現在、実際には減価償却されているようです)。この関数は特殊文字をエスケープして、MySQL クエリに安全に配置できるようにします。

次に、場合によってはpreg_match()、文字列が予想される入力と一致するかどうかを確認するような関数を使用できます。これは、住所が住所形式に一致し、名前や電話番号などと同じであることを確認できることを意味します。これは、長さとデータ型を簡単に制限できることを意味します。

これは、サイトを保護するための最初のステップであり、ユーザーがデータベースに好きなものを (自明に) 保存できないことを意味します。

于 2013-01-23T11:55:08.217 に答える
0

最良のアプローチは、提案したようにすべての入力データをグローバルにフィルタリングするだけでなく、各入力のデータ型を定義することです。例: 次のフィールドを検討してください: 名前: 電子メール: 年齢: 国: 住所: 電話番号: プレーン テキスト (テキストエリア): ファイル (ファイルのアップロード):

これらのフィールドを保護したい場合は、それぞれを個別に処理する必要があります。1- 名前: 最大文字長とデータ型 (形式) を定義します。通常、名前は (Az とスペース) のみで構成され、1 つのクォータ (') か、誰かが Eng のようなタイトルを入力した場合はドット (.) が含まれます。 . Mr.さあ、その欄を確認して考えてみましょう

<?php
$name = $_POST['name'];
$name_max_length = 30;
$name_min_length = 5;
$name_pattern = "/[a-zA-Z'\.\ ]{$name_min_length, $name_max_length}/";
if(!preg_match($name_pattern, $name)){
 $error[] = "Please enter valid character for name field";
}else{
 //lets now filter it for safe input
 //above check not passes any kind of XSS, but it passes SQL injection
 //we need to clear it from SQL injection 
 $name = htmlentities($name, ENT_QUOTES);
 //ENT_QUOTES: Will convert both double and single quotes.
}
?>

2- 年齢: 整数である必要があります。組み込みの PHP 関数で簡単に確認できます。

<?php
$age = $_POST['age'];
if(!is_int($age)){
$error[] = "Please enter valid number in Age field";
}
?>

3- プレーン テキスト: ここでも、htmlentities($name, ENT_QUOTES) を使用します。 4- ファイルのアップロード: - ファイル拡張子を確認します。ホワイト拡張子のリストを作成し、アップロードされたファイル拡張子をホワイト リストと比較する必要があります。例:

<?php
$extensions = array('png', 'jpeg', 'gif');
if(!in_array($current_file_ext, $extensions)){
 $error[] = "Please select valid file type! (".implode(", ", $extensions);
}
?>

最後に、これらのデータを入力する前に、そのようなエラーが発生した場合に配列である $error を確認してください

<?php 
if(count($error) > 0){
 //means $error contains errors
 //print error values
}else{
 //start inserting your data into database
}
?>
于 2013-01-23T11:43:13.143 に答える