【问题标题】:Erlang Mysql: How to prevent SQL InjectionsErlang Mysql:如何防止 SQL 注入
【发布时间】:2011-11-03 12:56:12
【问题描述】:

我对 erlang 很陌生,我需要编写一些代码来在 MySQL 数据库中插入行。 如何使用 Erlang 防止 SQL 注入?是否还有其他语言中的准备好的语句或我应该怎么做?

感谢您的回复。

【问题讨论】:

    标签: mysql sql erlang sql-injection


    【解决方案1】:

    此答案取决于您使用的驱动程序。

    Erlang ODBC 有一个函数 param_query,它将一组参数绑定到查询,它还可以转义所有 SQL 特殊字符。

    erlang-mysql-driver 已准备好声明:

    %% Register a prepared statement
    mysql:prepare(update_developer_country,
                  <<"UPDATE developer SET country=? where name like ?">>),
    
    %% Execute the prepared statement
    mysql:execute(p1, update_developer_country, [<<"Sweden">>,<<"%Wiger">>]),
    

    (来自Yariv's blog的代码)

    作为最后的手段,你可以随时escape the characters

     NUL (0x00) --> \0 
     BS  (0x08) --> \b
     TAB (0x09) --> \t
     LF  (0x0a) --> \n
     CR  (0x0d) --> \r
     SUB (0x1a) --> \z
     "   (0x22) --> \"
     %   (0x25) --> \%
     '   (0x27) --> \'
     \   (0x5c) --> \\
     _   (0x5f) --> \_ 
    

    【讨论】:

    • 谢谢!我试试(使用mysql驱动)
    • 转义字符是危险的并且容易出错。作为最后的手段,这是一种非常糟糕的错误安全感。
    • 嗯。不知何故,它不适用于 mysql:prepare/mysql:execute。我调用它时收到 undef 错误。此外,当使用 mysql:quote (我认为这也可以)时,它会记录相同的错误 :( 但我查看了源代码,似乎存在 mysql:quote (但不准备/执行......)
    • 我使用了来自 ejabberd-modules 的 mysql 驱动程序:svn.process-one.net/ejabberd-modules/mysql/trunk/src
    • 它(google-code 中的代码)似乎确实导出了准备和执行,但没有在 mysql.erl 中引用。您是否按照代码示例并使用 mysql::start_link 连接数据库?
    猜你喜欢
    • 2020-02-10
    • 1970-01-01
    • 2015-09-07
    • 2011-06-21
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    相关资源
    最近更新 更多