PHP SQLite 注入预防


php sqlite injection prevention

我正在组装一个相当简单的Web应用程序,该应用程序使用用户输入的数据对sqlite数据库进行操作,并且引起了我的注意,"清理"字符串可能还不够,并且可能会引发进一步的问题。据我了解,我应该使用准备好的陈述。在我的研究中,我发现有一个PDO(php数据对象)有一个准备函数,而且php sqlite3扩展也提供了一个准备语句。如果重要,此时数据库中没有登录名和敏感信息。

PDO对我来说似乎是"陌生的",我真的不明白为什么/如何使用它。我可以复制/粘贴代码并使其工作,但它的"想法"逃脱了我。

所以我想问题是 PDO 或 sqlite3 准备功能是最好的,并简要说明原因。

非常感谢,托德

PDO扩展是一个包装器,它统一了对许多不同数据库的访问。只要您在其中编写的SQL查询是兼容的,您就可以简单地通过连接到new PDO(...)中的其他数据库来切换数据库,而不需要接触其余代码。

sqlite3 扩展专门用于 SQLite 数据库。如果以后要连接到其他数据库,则必须重写使用 sqlite3 函数的所有代码。

除此之外,预准备语句及其工作方式在这两个扩展之间基本相同。我会投票给PDO,因为从长远来看,它提供了更大的灵活性,这意味着你只需要学习一个界面就可以使用许多不同的数据库。当然请注意,您不能混合它们,您必须只使用其中一种。不能使用一个方法的prepare方法,execute另一个方法。

说真的,如果你打算开始构建你的 Web 应用程序来利用数据库交互,那么获得一些 PDO 的知识,它值得一提,它可能会帮助你更多地了解 OOP 编码风格,而且只要你使用预准备语句,它总是安全的注入。

无需赘述,PDO可以处理多种类型的数据库,并且语法几乎相同,因此一旦构建模型,您就可以轻松移植到其他数据库,而不会遇到太多麻烦。这里有一个关于PDO的很棒的教程

<?php 
//Connect this creates a new PDO object
$db = new PDO('sqlite:/path/to/database.sdb');
//Build your sql query with parameters :field 
$sql = "SELECT * FROM sometable WHERE someCol=:field";
//Prepare the above query
$statement = $db->prepare($sql);
//Bind the value received from the form or such with the parameter place holder
$statement->bindParam(':field', $_POST['someVal']);
//Execute the prepared query
$statement->execute();
//Fetch the result
$result = $statement->fetchAll(PDO::FETCH_ASSOC);

//Treat the result as a pure array
foreach ($result as $row){
    //do something
}
?>

互联网上有很多教程比我解释得更好,但要掌握PDO,因为当mysql_*功能消失时,您将来会更多地使用它。希望对你有帮助