1

私は自分のウェブサイトでこのコードを長い間使用しており、PHP 入力を正しくサナタイズしていることを確認したいだけです$_POST...

foreach($_POST as $key=>$val) //this code will sanitize your inputs.
  $_POST[$key] = mysqli_real_escape_string($connection, $val);

$_POST['comment']たとえば、データベースに追加したいPOST 値があるとします。これは、データベースに入る前にサナタイズするための適切で安全な方法でしょうか?

foreach($_POST as $key=>$val) //this code will sanitize your inputs.
  $_POST[$key] = mysqli_real_escape_string($connection, $val);

  //is this safe? or is there another step?
  $comment = $_POST['comment'];

  if($comment != ""){
  //add $comment to database
  }

$commentMYSQL データベースに追加する前に、まだやらなければならないことはありますか? それとも、上の 2 行だけで魔法のように機能しますか? これが安全な方法なのか、それとももっと良い方法があるのか​​教えてください! ありがとう!

4

6 に答える 6

2

可能な複製: https://stackoverflow.com/questions/15664021/php-escaping-vars-posted-through-var-and-got-by-postvari-with-a-meth

私はすでにあなたの方法を試しました。魔法の機能はないようです。ただし、古典的な MySQL インジェクションから、投稿された各値に mysqli_real_escape_string を追加し、データベースで文字列 (引用符付き) として使用する場合は安全ですが、これは悪い習慣と見なされ、最も安全な方法ではありません。

MySQLi はパラメーター化されたクエリを提供するため、それらに慣れ、データベース ドライバーに対応する実数をライブラリに任せる必要があります。

于 2013-05-20T22:31:11.197 に答える
1

そうではありません。これらすべてのサニタイザーをバイパスするマルチバイト攻撃を使用できます。

さらに、

この回答によると、サニタイズされたコードをサニタイズされていない状態から遠ざけることができるように、投稿への書き込みを避ける必要があります。すべてを「サニタイズ」しても、それは悪い習慣につながります。

于 2013-05-20T22:32:43.433 に答える
0

安全な PHP コーディングにとって最も重要なことのいくつかが欠けています。

最初から始めましょう。

これらのリンクから始めてください : コードのコメントを読んでください

この最初の//そしてこの 2 番目!

1) 検証に合格した場合は、データを検証してフィルター処理します。

これで、電子メールを受け取る登録フォームができました。次に、電子メールを検証します。

$email = $_POST['email']; // Declare the variable
if (filter_var($email, FILTER_VALIDATE_EMAIL)) { // If validation passes ... 
    $safe_email = filter_var($email, FILTER_SANITIZE_EMAIL) // Sanitize the email
} else { // Validation fails no need to sanitize
    echo "WRONG EMAIL PUNK!!!!";
}

2)MysqliまたはPDO(私はPDOが好きです)のいずれかを使用して、次のことを行います。

$dbh = new PDO("mysql:host=xxxxxx;dbname=xxxxxx;charset=utf8", USERNAME(XXXXXXXXX), PASSWORD(XXXXXXXX); // Set up the PDO instance PLEASE DO NOT FORGET TO EXPLICETELY STATE A CHARSET!!!!
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Set up error mode
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE); // I prefer emulate prepares to be false

$sql = INSERT INTO ..... (........., email) VALUES (............, :email); // Set up our named parameter
$query -> $dbh -> prepare($sql); // Prepare the query 
$query -> bindParam (':email', $email);
$query -> execute() // Yay!

PDO と MysqlI を使用すると、すべて問題なくダンディになりますが、次の式があります。

Its not the wand, its the wizard. 

PDO / Mysqlすべてを解決することはできません! 必ず

PDO の設定方法については、他の質問を参照してください

1) 検証 2) サニタイズ 3) より安全なクエリのためにパラメータを使用! 4) 外部からの脱出 (信頼できないデータ)

より安全な PHP コーディングのために、これらのセキュリティ PHP プラクティスに従ってください。

楽しみ

于 2013-05-20T22:47:07.760 に答える
0

_real_escape_stringユーザー入力を完全にサニタイズしません。準備済みステートメントを使用する必要があります。

オブジェクト指向スタイル

$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
$stmt->bind_param('sssd', $code, $language, $official, $percent);

$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;

手続き型スタイル

$stmt = mysqli_prepare($link, "INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt, 'sssd', $code, $language, $official, $percent);

$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;

パラメータの種類

キャラクター説明
i 対応する変数は整数型です
d 対応する変数の型は double です
s 対応する変数は文字列型です
b 対応する変数は blob であり、パケットで送信されます

ドキュメンテーション

于 2013-05-20T22:30:02.660 に答える
0

欠点は、投稿変数を無効にするため、クエリ以外の目的で使用できないことです。たとえば、いくつかの投稿変数をまだエコーアウトしたい場合はどうしますか?

新しい配列にエスケープすることをお勧めします

さらに良いのは、エスケープせずにパラメーター化されたクエリを使用することです。

于 2013-05-20T22:31:54.700 に答える