Sterilize GET, POST ve COOKIE ile loop?

6 Cevap php

Herkes her zaman User Data hakkında endişeli (ve haklı) olduğunu düşünürsek) bunu elde zaman, her harici dizi yoluyla sadece döngü için yeterli olacaktır, ve (bir mysql_real_escape_string uygulanır.

Ben bu kötü bir fikir olup olmadığını merak ediyorum.

Gibi bir şey:

function getExternalData($type='GET')
{
    $type = strtoupper($type);
    $data = $_$type;
    foreach($data as $key => $value)
    {
        $clean[$key] = mysql_real_escape_string($value);
    }
    return $clean;
}

Bu veritabanları kullanmak için tüm veri güvenli olur. Ancak, bu şekilde yapmanın eksileri nelerdir?

6 Cevap

Ana con biçimlendirme ayrıştırmak için örneğin girişini işlemek için varsa, o zaman yeniden kaçmak onu unutma giriş Unescape gerekir olduğunu. Ayrıca, oldukça verimsiz. Sorgu tutucular SQL enjeksiyonu önlemek için çok iyi bir yoldur.

Sıhhileştirilmesinde kendisi gibi (sadece SQL için) 5.1 için PHP 5.2 ve PECL'de varsayılan olarak kullanılabilir Filter extension bakmak, almalıdır.

mysql_real_escape_string Tüm superglobal değişkenler üzerinde ya size mysql_real_escape_string için neyin iyi olduğunu hiçbir ipucu olduğunu MySQL sorgularında sadece bunları kullanmak istiyorsanız ya da izlenime uygulanması.

Eksileri:

You might forget there are other types of user input and so, not clean them.
And, of course, The excess loops.
And, I think DB cleaning should be done the latest as possible, just before you enter the data into the DB in your DL.
Cleaning data for presentation should be done just before presenting the data, etc.

Bu yaklaşımı çalışacağız kadar insanlar usualy kendileri (:-) yukarıya bakınız) yok yaklaşımlara katılmıyorum eğilimi olarak söyledi, sen bilmeyeceksin

Veri sterilize kalkmayın. Tutucular ile sorguları kullanın. Bkz bobby-tables.com

Ben doğrulama ve filtreleme mantığı genelleştirmek için kötü bir fikir olduğunu düşünüyorum. Bu artık evrensel mahkum edildikten sonra tüm sihirli tırnak arkasındaki fikir oldu.

Bunun yanı sıra, alan girişlerini doğrulayarak genellikle özel önemsiz bir sürü içerir. Genel kurallar uygulamalar büyüklüğü ve karmaşıklığı içinde büyümeye, özellikle de doğrulama oldukça küçük bir parçası haline gelmek.

Eğer aynı yerde genel ve özel hem de doğrulama işlemek için izin verir mini çerçeve ile gelip daha iyi bir fikir olacaktır. Bu gibi bir şey ...

class BrokenRules extends Exception {
    protected $errors;
    function __construct($errors) {
        $this->errors = $errors;
    }
    function getErrors() {
        return $this->errors;
    }
}

class Foo {
    protected $db;
    function __construct(PDO $db) {
        $this->db = $db;
    }
    function loadNew() {
        return array('bar' => 'new foo', 'baz' => 5);
    }
    function loadById($id) {
        $stmt = $this->db->prepare('SELECT * FROM foo WHERE id = ?');
        $stmt->bindValue(1, $id, PDO::PARAM::INT);
        $stmt->execute();
        return $stmt->fetch();
    }
    function save($data) {
        return isset($data['id']) ? $this->update($data) : $this->insert($data);
    }
    protected function validateForInsert($data) {
        if ((int)$data['baz'] <= 3) $errors['baz'][] = 'Baz must be greater than 3';
        if (isset($errors)) throw new BrokenRules($errors);
    }
    protected function validateForUpdate($data) {
        // TODO: validateForUpdate
    }
    protected function insert($data) {
        $this->validateForInsert($data);
        $stmt = $this->db->prepare('INSERT INTO foo (x, y) VALUES (?, ?)');
        $stmt->bindValue(1, $data['bar'], PDO::PARAM_STR);
        $stmt->bindValue(2, $data['baz'], PDO::PARAM_INT);
        $stmt->execute();
        return $this->db->lastInsertId();
    }
    protected function update($data) {
        $this->validateForUpdate($data);
        $stmt = $this->db->prepare('UPDATE foo SET x = ?, y = ? WHERE id = ?');
        $stmt->bindValue(1, $data['bar'], PDO::PARAM_STR);
        $stmt->bindValue(2, $data['baz'], PDO::PARAM_INT);
        $stmt->bindValue(3, $data['id'], PDO::PARAM_INT);
        $stmt->execute();
        return $data['id'];
    }
}

try {
    $foo = new Foo($pdo);
    if ($_POST) {
        $id = $foo->save($_POST);
        redirect("edit_foo.php?id=$id");
    } else if (isset($_GET['id'])) {
        $data = $foo->loadById($_GET['id']);
    } else {
        $data = $foo->loadNew();
    }
} catch (BrokenRules $e) {
    $errors = $e->getErrors();
}

include 'templates/foo.php';

i aslında array_map() arıyoruz düşünüyorum. Bu bir döngü için gereksinimini ortadan kaldırır. Ve evet, bu veritabanı için istekleri güvenli yapmak için kabul edilebilir.

Bir şey olsa, burada $_SERVER['REQUEST_METHOD'] kullanmak isteyebilirsiniz. (Sürece bu fonksiyona parametre olarak geçmek için kullanıyoruz.)