gpt4 book ai didi

php - 需要帮助使 PDO 准备好的语句更安全

转载 作者:行者123 更新时间:2023-11-30 22:36:02 24 4
gpt4 key购买 nike

我正在用 PHP 构建一个自定义 CMS,我想到了从数组生成 MySQL。我猜这不是最安全的做法,因为我会将变量直接放入准备好的语句中。我希望更有经验的人可以看看我到目前为止所做的事情,并让我了解如何使它更安全。

这是我在其中存储所有数据操作方法的类

abstract class MySQLData extends MySQLDataHelper {

// connection to database
abstract public function getConn();
// table name from concrete class
abstract public function getTable();

public function insert( $args ) {
try {
$stmt = $this->getConn()->prepare( $this->generateInsertSQL( $args ) );

foreach ($args as $arg => &$value) {
$stmt->bindParam(":{$arg}", $value);
}

$stmt->execute();
} catch (PDOException $e) {
echo "Insert error: " . $e->getMessage();
}
}
//............................................
// More methods below, including delete, select and update, but lets focus on 'insert' only to keep things simple.
}

辅助方法类,包括插入SQL生成器

abstract class MySQLDataHelper {

public function generateInsertSQL( $args ) {
$columns = array_keys( $args );

$placeholders = implode(', :', $columns);
$columns = implode(', ', $columns);

return "INSERT INTO `{$this->getTable()}` ({$columns}) VALUES (:{$placeholders})";
}
}

示例用例

require_once 'core/Pages.php';
$pages = new Pages( $db->conn() ); // Pages extends MySQLData

$args = array(
'name' => 'New page',
'content' => 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quisquam, laboriosam!',
'enabled' => true);

$pages->insert( $args );

请注意,在这种情况下,generateInsertSQL 的输出将是:

INSERT INTO `pages` (name, content, enabled) VALUES (:name, :content, :enabled)

提醒一下,这段代码工作得很好,我只是想知道它是否可以变得更安全。

谢谢。如果这是一个不好的问题或在错误的地方,我很抱歉。

最佳答案

这是一个社区维基答案。任何人都可以编辑它以加入进来。

绑定(bind)变量解决的问题是这样的:SQL 是一种语言,当您通过插入数据(就好像它是文本)来用该语言组装语句时,您就为不受信任的人提供了一种扩充您的 SQL 程序的方法。

因此,您必须努力对所有内容进行 sanitizer 。例如,如果您正在做这种事情:

 id IN (4 5,6,7) 

确保所有数字实际上都是数字并不难。但是你必须每次都这样做,不能失败,否则就会被打败。另一方面,如果你正在做

name IN ('cyanographics', 'Rocket Hazmat', 'Fred -ii-1')

然后有人给你一个恶意的用户名——想想

    cyano'); DELETE FROM TABLE USER CASCADE CONSTRAINTS; //

你最终要求你的 SQL 语言解释器来运行它。

name IN ('cyano'); DELETE FROM TABLE users CASCADE CONSTRAINTS; //', 'Rocket Hazmat', 'Fred -ii-1')

这种事情可能会使您的应用程序变得一团糟。

因此,您需要仔细考虑如何净化文本输入。您可以考虑使用类似 PDO::quote() 的内容来清理您的文本字符串.它在字符串中的危险字符(如 ')周围放置转义序列。

但是你看,你最好使用 PDO 中的内置绑定(bind)变量支持,即使处理你想要处理的列表变得更难。

阅读:What are the best PHP input sanitizing functions?

此外,不要忘记考虑浏览器脚本注入(inject)。如果你得到了这个名字怎么办

 <script>alert('You are pwned, sucka!');</script>

还是更糟?您也需要从输入中清除这些东西。

关于php - 需要帮助使 PDO 准备好的语句更安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32527932/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com