Mysql 如何从用户选择值的表LIKE?中选择所有列

Mysql 如何从用户选择值的表LIKE?中选择所有列,mysql,perl,cgi,parameter-passing,Mysql,Perl,Cgi,Parameter Passing,我正试图设置一个HTML页面来显示我数据库中的“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

我正试图设置一个HTML页面来显示我数据库中的“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\u字符串,但在添加$User\u 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>

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

如果要为表或列名使用变量,则:

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

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

我尝试对我所有的列名设置$column=,但警告指出,“在./snptable.cgi第18行的无效上下文中无用地使用常量(列名)。”对于每一行,它都没有任何作用。请检查DBI方法
quote\u标识符
,这是一种将文本转义为SQL字符串的安全方法。这是处理validate选项的简单方法;i、 例如,您实际上不需要100%验证它,但绝对必须100%确定它不是SQL注入攻击。@StuartWatt-该验证只验证语法(例如有效字符),而不验证语义(例如,列名是DB中的实际有效列)@StuartWatt
quote\u identifier
听起来很有意思,但它们是关于它的好教程吗?我发现一些非常简短的东西对我来说不太合适。@JessLovejoy-不是真正的教程,但现在开始<代码>我的$qcol=$dbh->quote\U标识符($User\U Select)
将引用的版本放入
$qcol
。然后您可以安全地执行
my$sql=“SELECT*FROM snp WHERE$qcol LIKE?”
通常情况下,由于注入攻击,您不会将变量放入SQL语句中,但是
quote_identifier
使值可以安全地嵌入为列或表标识符。是的,正如@DVK所说,这并不能确认它是一个有效的列名,但它是安全的。我经常使用它,虽然为了真正的质量,最好是将字段
抽象为更抽象的过滤器类型。