node-oracledb是否可以逃避/清理查询?它通过绑定参数化查询:
connection.execute(
"INSERT INTO countries VALUES (:country_id, :country_name)",
[90, "Tonga"],
function(err, result)
{
if (err)
console.error(err.message);
else
console.log("Rows inserted " + result.rowsAffected);
});
我查看了文档并快速了解了源代码,但是它没有说明它也没有表明它逃脱了查询。
如果没有,我在考虑在传递给connection.execute
方法之前对用户输入和查询使用node-mysql和大量predicates的组合。
答案 0 :(得分:1)
驱动程序不会执行转义,数据库会执行转义,但仅限于使用绑定变量而不是字符串连接时。
您展示的示例是正确和安全的。
以下是一个如何使用WRONG方式进行SQL注入的示例:
CFBundleURLTypes
答案 1 :(得分:0)
要添加丹刚刚说的话,这里(或多或少) 正确的方式:
SQL查询字符串现在看起来像这样:
'INSERT INTO countries VALUES(?,?)'
(注意!引号中的问号不!)
此SQL指定要插入的两个值是"参数。"因此,每次执行语句时,特定值必须"绑定到" 这两个参数。
SQL引擎将从绑定到它们的任何数据源"此时间直接直接检索每个参数的值。"因此,无论"它们碰巧包含什么(文本)," SQL永远不会认为它们是SQL语句本身的一部分。"
(所以,如果您偶尔发现countries
表中的一列或另一列包含:"foo; drop table countries"
,那么毫无疑问他们会,你会知道... ; - ) 完全 做什么 ["很好的尝试,的失败者强>&#34!; ......] 行。)
编辑:正如Christopher Jones在回复此帖时所指出的那样,Oracle使用不同的语法来识别参数。然而,基本的想法仍然是相同的:提交给引擎的“SQL查询”包含调用输入值的规范,这些输入值必须在运行时提供,每次执行语句。这些值完全独立于SQL语句本身,永远不会被误解为其中的一部分。使用您正在使用的任何SQL引擎调用的语法。