0

INSERT'ing INTO MySql 中の私のアプローチ

私はstackoverflow.comで「エスケープまたは同様のアクションが必要な場合は、必要なときにそれを実行してください」と読んだと思うので、検証ページでユーザー入力を検証します(nullかどうかのチェック、長さのチェック、および構造チェック(例: メール構造、カスタム タグ構造); 入力として変数を使用します. 検証中、カスタム エラー印刷部分であっても、エラー メッセージにはメッセージ テキスト$_POST['']に値が含まれていません. 暫定的な注意として:準備されたステートメントとphp-MySql インタラクション中のパラメータ化されたクエリ入力が検証された場合; MySql に INSERT する直前に、カスタム構造化タグ以外の html タグを許可しないため、入力からタグを削除します (たとえば、$_POST['']

**bold text** === <strong>bold text</strong>) 次に、ユーザー入力を MySql db に挿入します。

MySqlからフェッチし、出力を画面に出力する際の私のアプローチ

MySql db から画面に出力するには、htmlspecialchars() コマンドのみを適用します。

私の質問

私は自分自身に自信がありません。私のアプローチに明らかな、または隠れた弱点はありますか? PHPの達人から貴重なコメントをいただき、ありがとうございます。ブラジル

アップデート

MySql db への挿入中にタグを削除しません。理由については、以下の ÁlvaroG.Vicario のコメントを参照してください。BR。

4

2 に答える 2

1

ここまでの議論は、SQL インジェクションと永続的なクロス サイト スクリプティングからの保護についてでした。正しい軌道に乗っているようですね。

  • 準備済みステートメントの使用は、SQL インジェクションに対抗するための「ベスト プラクティス」です。
  • htmlspecialchars() は XSS を防止するための良い出発点ですが、データを出力する場所に適したエンコード方式でデータをエスケープする必要があります。OWASP には、これについて説明する包括的なページがあります: XSS (クロス サイト スクリプティング) 防止のチート シート。簡単な答え: " the escape syntax for the part of the HTML document you're putting untrusted data into."を使用していることを確認してください。
于 2013-04-01T15:44:35.987 に答える
0

私はtrial.phpで以下のコードを試しました

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="tr"> 
<head> 
<title>trial</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<meta http-equiv="Content-Language" content="tr" /> 
<meta name="Description" content="trial page." /> 
<meta name="Robots" content="noindex, nofollow" />
</head>
<body>
<?php
$str1 = '<script>alert(\'inside of input with quote\')</script>';
$str2 = '<script>alert("inside of input with quote")</script>';
$str3 = "<script>alert(\"inside of input with quote\")</script>";
$str4 = '<script>alert("outside of form")</script>';
?>
<form method="post" action="">
    <fieldset>
        <legend>alert attempts inside form inputs</legend>
        <label for="input1">label 1:</label><br />
        <input type="text" value="<?php echo htmlspecialchars($str1) ; ?>" name="input1" id="input1" /><br /><br />

        <legend>attempt 2</legend>
        <label for="input2">label 2:</label><br />
        <input type="text" value="<?php echo htmlspecialchars($str2) ; ?>" name="input2" id="input2" /><br /><br />

        <label for="input3">Label 3:</label><br />
        <input type="text" value="<?php echo htmlspecialchars($str3) ; ?>" name="input3" id="input3" />
    </fieldset>
</form>    
<?php echo htmlspecialchars($str4) ; ?>
</body>
</html>

Trial.php の結果

  1. ユーザーが気にかけていたこと タイピングが壊れていないため、ユーザーデータが破損していません
  2. ユーザーが画面上で入力した内容を正確に見ることができます
  3. スクリプト アラートが機能しませんでした

MySQL に INSERT を実行し、MySQL からフェッチし、出力を画面に出力する際の結果のプロシージャ

  1. PHP と MySQL の対話中に、準備されたステートメントとパラメトリック クエリを利用します。MySQl db に INSERT を実行している間、このアプローチは SQL インジェクションをすでに防止しているため、余分なエスケープは必要ありません。のような余分な努力は、 ORが行うのとstrip_tags()同じように、ユーザーが正確に入力を気にかけていることを混乱させます。htmlspecialchars()htmlentities()
  2. MySQL db からのフェッチ中にも、準備されたステートメントとパラメトリック クエリを利用する
  3. ユーザーが入力したデータを画面に出力する htmlspecialchars()際に​​、ユーザーが正確に入力した内容が壊れず、悪意のある可能性のある特殊文字が対応する HTML エンティティに変換されるように使用します。
于 2013-04-01T12:23:53.590 に答える