我试图找出一种方法来清理从 php 进入 sqlite 的输入。我不能使用mysql。简单地使用 sqlite_escape_string 就足够了,还是我需要做其他事情?我也只能使用 sqlite2。
5 回答
避免 SQL 注入的最好方法是强制使用参数查询,并且永远不要通过字符串连接或变量插值手动组装 SQL 语句。
在 PHP 5+ 上,您可以使用 PDO,这是一个支持(以及其他)SQLite 和参数查询的多数据库抽象层。
转义函数确保 SQL 方言使用的特殊字符(主要是引号)被转义,以便您的插入/更新等工作。所有 sqlite_escape_string 所做的就是转义单引号。
然后有一个实质性的担忧,即有人可以制作 SQL 注入。因为您使用的是 v2,所以您不能使用可以保护您的 prepare 和 _bind() 函数。
SQLite 允许您链接由 ';' 分隔的命令 所以那里有一个问题。我建议您首先使用您编写的辅助函数或使用 sprintf 仔细设计您的参数,并确保您正确地输入您的整数、浮点数和字符串。
您应该能够创建自己的转义函数来“转义”您想要注意的事情......最特别是分号,在查询末尾使用 ... ESCAPE '\' ,假设您使用反斜杠作为你的逃生角色。
然后你就会遇到有人故意插入恶意内容 (XSS) 的问题。Grigor 提供了一种解决方案——在你的字符串上使用 htmlentities() 。
有很多方法,但这取决于您输入的目标,请参阅此问题以更好地理解它:What's the best method for sanitizing user input with PHP?
sqlite_escape_string()
应该完成输入字符串所需的所有清理工作。至于输出,如果是输出成HTML,那么htmlspecialcharts()
在输出之前使用它。
SQLitesqlite_escape_string()
为此提供。不过,它仅适用于 PHP 5。
但是,仅仅依靠这些方法并不能使您免于注射。一个必要的措施是始终首先验证用户提供的输入,在将其置于方法之前,您必须依赖 - 但实际上还没有创作。