2

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

有人知道吗?我似乎更有可能为您做到这一点,但我宁愿确定。

4

5 回答 5

2

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

于 2013-11-06T16:15:29.950 回答
0

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

他们使用quote()方法来转义用户输入。

虽然 PHP 建议

如果您使用 quote() 构建 SQL 语句,强烈建议您使用 PDO::prepare() 来准备带有绑定参数的 SQL 语句,而不是使用 PDO::quote() 将用户输入插入到 SQL 语句中。带有绑定参数的预处理语句不仅更便携、更方便、不受 SQL 注入的影响,而且执行起来通常比插值查询快得多,因为服务器端和客户端都可以缓存查询的编译形式。

于 2013-11-06T16:21:54.587 回答
0

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

于 2015-02-06T09:51:35.293 回答
0

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

但是,如果您喜欢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();
于 2015-07-31T11:56:14.927 回答
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
于 2019-05-22T14:11:23.713 回答