【问题标题】:How to SELECT all columns FROM table LIKE ?, where user selects values如何从表 LIKE 中选择所有列?,用户在其中选择值
【发布时间】:2013-07-25 11:43:36
【问题描述】:

我正在尝试设置一个 HTML pg 来显示我的数据库中的“snp”表。 我已经把所有东西都启动并运行得很好,但我想添加一个功能,而不是:

my $sql = "SELECT * FROM snp WHERE cid LIKE ? ORDER BY pos LIMIT 10";

我可以做一些事情,允许用户输入任何关键字,它会从正确的表格中提取出来。这是我想做的:

sub get_snp{
    my $sql = "SELECT * FROM snp WHERE ? LIKE ? ORDER BY pos LIMIT 10";
    $snp_sth = $dbh->prepare($sql);
    $snp_sth->execute("$User_Select","%$Search_String%");

更清楚地说,我的代码只使用了 $Search_String 而不是在之后添加 $User_Select 时。 这是我的参数:

my $Search_String = param("search_for");
my $User_Select = param("columns");

这两个参数稍后在 HTML 部分调用如下:

<TR BGCOLOR="#c0c0c0">
           <TD><INPUT TYPE="text" NAME="search_for"
                STYLE="color:#787878;"
                VALUE="enter keyword | select option"
           </TD>
            <SELECT NAME="columns">
             <OPTION SELECTED> --select option--</OPTION>
             <OPTION VALUE ="cid"> cid</OPTION>
             <OPTION VALUE ="pos"> Position #</OPTION>
             <OPTION VALUE ="cdspos"> CDS Position</OPTION>
             <OPTION VALUE ="m82base"> M82 base</OPTION>
             <OPTION VALUE ="il"> Introgression Line</OPTION>
             <OPTION VALUE ="ilbase"> IL base</OPTION>
             <OPTION VALUE ="snptype"> SNP Type</OPTION>
             <OPTION VALUE ="aachange"> SNP</OPTION>
            </SELECT>
           <TD><INPUT TYPE="submit" VALUE="Search"></TD>
           <TD><INPUT TYPE="reset" VALUE="Reset"></TD>
         </TR>

所以在上面你可以看到我为 8 个不同的表的 8 个不同的选择设置了一个下拉列表。同样,如果用户输入 SL2.40ch12 并选择染色体 ID(或 cid),那么我希望显示该数据,或者如果他们输入 IL10-1 并选择基因渗入线(或 il),则应提取该数据。

我可能没有以正确的方式进行,所以任何建议都会非常有帮助!如果需要更多代码或一般信息,请告诉我:)

【问题讨论】:

    标签: mysql perl cgi parameter-passing


    【解决方案1】:

    绑定参数(? doohikey)仅适用于参数值,不适用于表名或列名。

    如果你想为表名或列名使用变量,那么:

    • 验证它(确保它是数据库中的有效表或有效列)
    • 使用常规插值将其插入到您的 SQL 字符串中:

      my $sql = qq[SELECT * FROM snp WHERE $my_col LIKE ? ORDER BY pos LIMIT 10];
      

    【讨论】:

    • 我尝试将 $column = 设置为我所有的列名,但警告说:“在 ./snptable.cgi 第 18 行的 void 上下文中无用使用常量 (column_name)。”对于每个,它什么也没做
    • 查看 DBI 方法 quote_identifier 作为转义文本以放入 SQL 字符串的安全方法。这是处理 validate 选项的简单方法;也就是说,您实际上并不需要 100% 验证它,但您绝对必须 100% 确定它不是 SQL 注入攻击。
    • @StuartWatt - 验证只验证语法(例如有效字符),而不是语义(例如,列名是数据库中的实际有效列)。
    • @StuartWatt quote_identifier 听起来很有趣,但它们是否是关于它的任何好的教程,我发现真的很短的东西对我来说不太适合。
    • @JessLovejoy - 不是真正的教程,但这里有。 my $qcol = $dbh-&gt;quote_identifier($User_Select); 将引用的版本放入 $qcol。然后你可以安全地做my $sql = "SELECT * FROM snp WHERE $qcol LIKE ?..."; 通常你不会因为注入攻击而将变量放入 SQL 语句中,但是quote_identifier 使值可以安全地嵌入为列或表标识符。是的,正如@DVK 所说,这并不能确认它是一个有效的列名,但它是安全的。我经常使用它,尽管为了真正的质量,最好将字段 columns 抽象为更抽象的过滤器类型。
    猜你喜欢
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    • 2022-07-26
    • 2011-11-06
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多