我在plpgsql中有这个功能:
CREATE OR REPLACE function login_v(em varchar, passwd varchar)
RETURNS users AS $$
DECLARE
cu users;
BEGIN
SELECT * into cu
FROM users where email = em
AND encrypted_password = crypt(passwd, encrypted_password);
return cu;
END
$$ LANGUAGE plpgsql;
当我提供这样的输入:select login_v('test@test.com'' OR 1=1;--','la la la');
时,我认为我的方法应该向用户发送电子邮件test@test.com
。我做错了什么?
这里需要执行SQL注入来演示练习的概念,但我是一个SQL注入和plpgsql boob。 :|
答案 0 :(得分:4)
PL / pgSQL中的SQL查询计划类似于预处理语句。只要您像传入 值 一样,SQL注入通常 不可能 。详细说明:
将动态SQL与EXECUTE
一起使用,并且没有正确的参数处理来实际演示SQL注入。
喜欢(这是 不 的方式!):
CREATE OR REPLACE FUNCTION login_v(em varchar, passwd varchar)
RETURNS SETOF users AS
$func$
BEGIN
RETURN QUERY EXECUTE
'SELECT *
FROM users
WHERE email = $1
AND encrypted_password = crypt(''' || passwd || ''', encrypted_password)'
USING em;
END
$func$ LANGUAGE plpgsql;
第一个变量em
与USING
子句一起正确传递为 值 ,因此不能滥用SQL注入。
但第二个变量passwd
在没有正确转义的情况下连接不正确。因此,用户输入可以转换为SQL代码。 SQL注入。
永远不要使用此功能!除非在演示如何不这样做时使用。
在客户端不正确地连接SQL字符串时,可能会发生类似的恶作剧。