使用Medoo清理用户输入

时间:2013-11-06 16:14:24

标签: php mysql database frameworks sanitization

Medoo是一个PHP数据库框架。有没有人知道在使用insert()函数之前是否需要清理用户输入?在“Why medoo?”下的主页(http://medoo.in/)上然后它只是简单地说“防止SQL注入”,但我不知道这是否意味着它为你做了或者它更容易这样做。

有谁知道吗?我似乎更有可能为你做这件事,但我肯定知道。

5 个答案:

答案 0 :(得分:2)

似乎他们正在过滤SQL注入你不必担心它。 [他们已将其列为其主要功能之一]

答案 1 :(得分:0)

快速查看代码,对于多种数据库类型,该类基本上是CRUD

他们使用quote()方法来逃避用户输入。

虽然PHP建议

  

如果您使用quote()来构建SQL   声明,强烈建议您使用PDO :: prepare()   使用绑定参数而不是使用来准备SQL语句   PDO :: quote()将用户输入插入到SQL语句中。准备   带有绑定参数的语句不仅更具可移植性   方便,免于SQL注入,但通常要快得多   执行比内插查询,作为服务器端和客户端   可以缓存查询的编译形式。

答案 2 :(得分:0)

实际上,查看代码时,他们似乎并没有使用PDO准备方法来构建他们的代码,这意味着即使使用引用,也可能使用奇怪的宽字符进行破解。见https://security.stackexchange.com/questions/9908/multibyte-character-exploits-php-mysql

答案 3 :(得分:0)

Medoo放弃了对PDO准备的支持,因为当前的序列化数组数据的准备报价过程并不好,并且存在一些兼容的问题。

但是,如果您喜欢http://medoo.in/api/pdo

,可以使用它
$calories = 150;
$colour = 'red';

$sth = $database->pdo->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');

$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);

$sth->execute();

答案 4 :(得分:0)

默认情况下,版本1.6.1似乎没有转义。

$database = new Medoo([
    "database_type" => "mysql",
    "database_name" => "database",
    "server" => "localhost",
    "username" => "user",
    "password" => "1234",
    "charset" => "utf8"
]);


// Original proper query and injection

$table_proper_plain = 'TAB_1';
$table_inject_plain = 'TAB_1" UNION SELECT username, password FROM TAB_2;#';

$database->select($table_proper_plain, ["COL_1","COL_2"]);
// SELECT `COL_1`,`COL_2` FROM `TAB_1`
// valid, returns rows from TAB_1
// works as expected

$database->select($table_inject_plain, ["COL_1","COL_2"]);
// SELECT `COL_1`,`COL_2` FROM `TAB_1` UNION SELECT username, password FROM TAB_2;#"
// valid(!), returns rows from TAB_1 AND TAB_2(!)
// bad, injection successful


// Using method quote on proper and injection query

$table_proper_quote = $database->quote($table_proper_plain);
$table_inject_quote = $database->quote($table_inject_plain);

$database->select($table_proper_quote, ["COL_1","COL_2"]);
// SELECT `COL_1`,`COL_2` FROM "'TAB_1'"
// not valid, error 1146: Table 'database.'TAB_1'' doesn't exist
// bad, quoting broke query

$database->select($table_inject_quote, ["COL_1","COL_2"]);
// SELECT `COL_1`,`COL_2` FROM "'TAB_1\" UNION SELECT username, password FROM TAB_2;#'"
// not valid, error 1146: Table 'database.'TAB_1'' doesn't exist
// good, injection not successful