mysql - Erlang 和 SQL 注入(inject)攻击

标签 mysql sql-server oracle erlang

<分区>

我每天从 erlang 应用程序中间件使用 Oracle 和 MySQL 数据库。在这些中间件应用程序中,我正在运行 Nitrogen Web FrameworkYaws Web Server 以及一些 erlang 应用程序,如 RabbitMQ 。尽管应用程序容易受到 SQL injection 的攻击,但它们在受信任的内部网中运行。

此处记录的攻击如: http://sqlzoo.net/hack/ 非常能够使这些应用程序变得无用。是否有图书馆(Erlang)或我如何防止这些攻击的技术?我知道在 PHP 等其他语言中,通过转义任何可能由用户或攻击者插入的 stringified 来确保所有参数都是 single-quotes

说到字符串参数中的 escaping all single-quotes,我想出了一个 replace_all 函数,但它似乎无法解决我的需求,因为我想我会找到一种方法将所有 single-quotes (') 替换为 escaped version of themselves (\')

replace(Char,With,String)-> replace(Char,With,String,[]).
replace(_,_,[],Done)-> lists:reverse(Done); replace(Char,With,[Char|Rest],Buffer)-> replace(Char,With,Rest,[With|Buffer]); replace(Char,With,[Any|Rest],Buffer)-> replace(Char,With,Rest,[Any|Buffer]).
在几个例子上测试它:
3> sql_protect:replace($m,$k,"muzaaya").
"kuzaaya"
4> sql_protect:replace($a,$u,"muzaaya").
"muzuuyu"
5>
但是我如何使用这个函数来转义所有单引号。说 String = "' OR 1=1'" ,更改为:String = "\' OR 1=1\'"

非常感谢您的帮助。

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

似乎有更好的方法。

最佳答案

您不仅需要转义',还需要转义\\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]).

关于mysql - Erlang 和 SQL 注入(inject)攻击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15129443/

相关文章:

c# - 尝试在 sql server 中插入日期和时间但出现错误

使用 XML 标签的 SQL 查询 XML 列?

sql - 查询以返回与电影租赁数据库中观看次数最多的导演配对的用户

mysql - 如何对从mysql中的一列检索到的结果进行分组

php - Codeigniter 多数据库连接速度慢

php - 具有多个子字符串的 Laravel DB 查询

java - c3p0 - 设置 initialPoolSize = minPoolSize = maxPoolSize 有任何问题吗?

javascript - 发送表单而不显示结果

sql - azure 函数: GET data from API and POST it in a sql database

sql-server - Oracle Gateway、SQL Server 和 Application Express 的字符集问题