Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从SQL注入生成的查询有多安全?_Sql_Sql Server_Node.js_Express_Sql Injection - Fatal编程技术网

从SQL注入生成的查询有多安全?

从SQL注入生成的查询有多安全?,sql,sql-server,node.js,express,sql-injection,Sql,Sql Server,Node.js,Express,Sql Injection,我正在尝试制作一个可以处理多个单词的搜索栏,但我担心SQL注入 我正在将node express与软件包一起使用 下面是获取条件、生成SQL并运行SQL的代码: router .get('/search/:criteria', function (req, res) { var criteria = req.params.criteria; var words = criteria.split(" "); var x = "" words.map(word =&

我正在尝试制作一个可以处理多个单词的搜索栏,但我担心SQL注入

我正在将node express与软件包一起使用

下面是获取条件、生成SQL并运行SQL的代码:

router
.get('/search/:criteria', function (req, res) {
    var criteria = req.params.criteria;
    var words = criteria.split(" ");

    var x = ""
    words.map(word => x += `name like '%${word}%' and `);
    x = x.substring(0, x.length - 5); // Remove trailing 'and'

    var query = `SELECT * FROM table WHERE ${x}`

    new sql.ConnectionPool(db).connect().then(pool => {
        return pool.request().query(query)
    }).then(result => {

    })
});
搜索要搜索的内容将导致以下查询:

SELECT * FROM table 
WHERE 
    name like '%something%'
    and name like '%to%'
    and name like '%search%'
我自己也尝试过一些SQL注入,但似乎都不起作用


注意:我意识到我们应该始终使用输入。它对一个单词很好,但我不知道如何对许多单词使用输入。例:

new sql.ConnectionPool(db).connect().then(pool => {
        return pool.request()
        .input('input', '%'+criteria+'%')
        .query(query)
    })

答案是:这不安全。你的代码也不能保证它的安全。不要通过将用户提供的数据连接/插入到语句中来构建SQL

此外,您也不会像本身那样为
进行任何转义,因此这同样是不干净的

如果需要动态SQL,请使用预期数量的占位符构建准备好的SQL语句,然后将用户提供的值绑定到这些占位符

router.get('/search/:criteria', (req, res) => {
    const ps = new sql.PreparedStatement();
    const sqlConditions = [];
    const escapedValues = {};

    // set up escaped values, safe SQL bits, PS parameters
    req.params.criteria.split(" ").forEach((v, i) => {
        const paramName = 'val' + i;
        escapedValues[paramName] = v.replace(/[\\%_]/g, '\\$&');
        sqlConditions.push(`name LIKE '%' + @${paramName} + '%' ESCAPE '\'`);
        ps.input(paramName, sql.VarChar);
    });

    // build safe SQL string, prepare statement
    const sql = 'SELECT * FROM table WHERE ' + sqlConditions.join(' AND '); 
    ps.prepare(sql);

    // connect, execute, return
    ps.execute(escapedValues).then(result => {
        res(result)
    });
});

(免责声明:代码未经测试,因为我现在没有可用的SQL Server,但您知道了。)

答案是:它不安全。你的代码也不能保证它的安全。不要通过将用户提供的数据连接/插入到语句中来构建SQL

此外,您也不会像
本身那样为
进行任何转义,因此这同样是不干净的

如果需要动态SQL,请使用预期数量的占位符构建准备好的SQL语句,然后将用户提供的值绑定到这些占位符

router.get('/search/:criteria', (req, res) => {
    const ps = new sql.PreparedStatement();
    const sqlConditions = [];
    const escapedValues = {};

    // set up escaped values, safe SQL bits, PS parameters
    req.params.criteria.split(" ").forEach((v, i) => {
        const paramName = 'val' + i;
        escapedValues[paramName] = v.replace(/[\\%_]/g, '\\$&');
        sqlConditions.push(`name LIKE '%' + @${paramName} + '%' ESCAPE '\'`);
        ps.input(paramName, sql.VarChar);
    });

    // build safe SQL string, prepare statement
    const sql = 'SELECT * FROM table WHERE ' + sqlConditions.join(' AND '); 
    ps.prepare(sql);

    // connect, execute, return
    ps.execute(escapedValues).then(result => {
        res(result)
    });
});

(免责声明:代码未经测试,因为我现在没有可用的SQL Server,但您知道了。)

您的问题是什么?如果您要求的只是代码检查,我想让您参考@InzeNL,我想知道如何进行SQL注入,或者是否可能。我不认为我在寻找代码检查。任何盲目地将用户输入附加到字符串并执行它的操作都容易受到SQL注入的攻击(例如,用户传入
%search''或1=1--
)。我不知道你的框架是否支持复杂的数据结构,比如DataTable/表值参数,但是如果你关心SQL注入,那可能是你想要做的一个改变。你的问题到底是什么?如果您要求的只是代码检查,我想让您参考@InzeNL,我想知道如何进行SQL注入,或者是否可能。我不认为我在寻找代码检查。任何盲目地将用户输入附加到字符串并执行它的操作都容易受到SQL注入的攻击(例如,用户传入
%search''或1=1--
)。我不知道你的框架是否支持复杂的数据结构,比如DataTable/表值参数,但是如果你关心SQL注入,那可能是你想要做的一个改变。谢谢你的精彩解释!天才谢谢你的精彩解释!天才