-2

この関数を以下に記述して、PDO ステートメントで使用できる $_POST グローバルから値を返します。これが良い方法である場合は、提案が欲しいだけです。「内破」の部分はあまり柔軟ではないかもしれませんが、これをどのように改善できるか知りたいです。ロジックと機能の改善に関するヘルプは、深く感謝しています。ありがとう。

/**
 * This function loops through the $_POST global and returns parameters that can be used in
 * a PDO statement directly. Note : For this function to work properly the 
 * PDO::ATTR_EMULATE_PREPARES should be set to "false"
 * like so "$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false)".
 * @param  Array $exclude This is an array of keys in $_POST that you want the function to ignore
 * @return Array The function returns an array that can be used as parameters for the PDO statement
 */
function get_params($exclude = array()) {
    $keys = array();
    $values = array();
    $placeholder_keys = array();
    $params = array();

    foreach ($_POST as $key => $value) {
        if(!in_array($key, $exclude)) {
            $keys[]             = $key;
            $placeholder_keys[] = ":" . $key;
            if(is_array($value)){
                $value = implode(",", $value);
            }
            $values[] = $value;
        }
    }

    $comma_sep_keys = implode(",", $keys);
    $comma_sep_placeholder_keys = implode(",", $placeholder_keys);

    $params['keys'] = $keys;
    $params['values'] = $values;
    $params['placeholder_keys'] = $placeholder_keys;
    $params['comma_sep_keys'] = $comma_sep_keys;
    $params['comma_sep_placeholder_keys'] = $comma_sep_placeholder_keys;

    return $params;
}
4

2 に答える 2

4

キーをまったく消毒していません。配列要素が次の場合:

array(
    "foo = ''; DROP TABLE users; --" => 'baz'
)

これにより、SQL インジェクションに対して無防備になります。をプレースホールドしていますが、その見返りに、サニタイズされていないキーをやみくもにクエリに連結しています。

また、配列値を単一の文字列に内破しています。"foo,bar,baz"元は配列だったのに、本当に単一の値として挿入しますか?

于 2013-06-09T13:15:25.437 に答える
1

明確でない場合に備えて少し拡張して(そしてそれが私が最初に考えたので)、ユーザーはフォームを次のように変更できます。

<input name = "foo = ''; DROP TABLE users; --" value = 'baz'>

また、XSS 攻撃に対して非常に脆弱です。誰かが値としてこれを入力した場合:

<SCRIPT SRC=http://ha.ckers.org/xss.js></SCRIPT>

次に、そのユーザーの入力を読み取ることができるページに入るすべての人 (最も重要なのはあなた) は、それをロードしxss.jsます。これは非常に危険です。厳密な消毒規則を設けることをお勧めします。編集:通常はhtmlentities()を使用する必要がありますが、 SOのこの質問でわかるように、データを出力するときにのみ使用してください。ただし、html を受け入れる場合、そのための適切なライブラリはHTML Purifierです。

于 2013-06-09T13:35:00.223 に答える