3

我每天都使用 erlang 应用程序中间件处理 Oracle 和 MySQL 数据库。在这些中间件应用程序中,我正在运行Nitrogen Web FrameworkYaws Web Server加上几个 erlang 应用程序,例如RabbitMQ. 尽管应用程序容易受到SQL injection.

诸如此处记录的攻击:http://sqlzoo.net/hack/非常能够使这些应用程序无用。是否有库(Erlang)或我可以防止这些攻击的技术?我知道在其他语言中,例如,通过转义用户或攻击者可能插入的任何PHP参数来确保所有参数。 说到字符串参数,我想出了一个函数,但它似乎不能解决我的需求,因为我想我会找到一种方法来用.stringifiedsingle-quotes

escaping all single-quotesreplace_allsingle-quotes (')escaped version of themselves (\')

替换(字符,带,字符串)-> 替换(字符,带,字符串,[])。
替换(_,_,[],完成)-> 列表:反向(完成); 替换(Char,With,[Char|Rest],Buffer)-> 替换(字符,带,休息,[带|缓冲区]); 替换(Char,With,[Any|Rest],Buffer)-> 替换(字符,With,Rest,[Any|Buffer])。
在几个例子上测试它:
3> sql_protect:replace($m,$k,"muzaaya")。
“库扎亚”
4> sql_protect:replace($a,$u,"muzaaya")。
“沐足”
5>
但是我如何使用这个函数来转义所有的单引号。不得不说String = "' OR 1=1'",改为:String = "\' OR 1=1\'"

非常感谢您的帮助。

编辑
您对此有何看法:如果我有一个列表,其中包含所有ORACLE SQL KEYWORDSSQL SERVER KEYWORDSMYSQL KEYWORDS在一个列表中,并且对于每个查询参数,我将其拆分为单词(即如果它包含空格),然后我检查以确保这些都不包含words 是保留字,我会防止许多 sql 注入攻击。

似乎有更好的方法。

4

2 回答 2

2

我不了解 erlang 库,但我假设您可以创建准备好的语句,这些语句在执行时会自动“清理”您的字符串。这甚至是 php 领域的首选方法,带有 PDO 和 mysqli。不推荐使用 escape_strings 和 mysql 驱动程序。

于 2013-02-28T08:04:14.893 回答
2

您不仅需要转义,还需要转义'特殊符号,例如\,\0等等。所以引用函数看起来像(从我们的 mysql 驱动程序中获取):

quote(String) when is_list(String) ->
    [39 | lists:reverse([39 | quote(String, [])])]; %% 39 is $'
quote(Bin) when is_binary(Bin) ->
    list_to_binary(quote(binary_to_list(Bin))).

quote([], Acc) ->
    Acc;
quote([0 | Rest], Acc) ->
    quote(Rest, [$0, $\\ | Acc]);
quote([10 | Rest], Acc) ->
    quote(Rest, [$n, $\\ | Acc]);
quote([13 | Rest], Acc) ->
    quote(Rest, [$r, $\\ | Acc]);
quote([$\\ | Rest], Acc) ->
    quote(Rest, [$\\ , $\\ | Acc]);
quote([39 | Rest], Acc) ->        %% 39 is $'
    quote(Rest, [39, $\\ | Acc]); %% 39 is $'
quote([34 | Rest], Acc) ->        %% 34 is $"
    quote(Rest, [34, $\\ | Acc]); %% 34 is $"
quote([26 | Rest], Acc) ->
    quote(Rest, [$Z, $\\ | Acc]);
quote([C | Rest], Acc) ->
    quote(Rest, [C | Acc]).
于 2013-02-28T08:26:42.030 回答