关于报价// SQL // PHP

时间:2015-08-20 01:29:05

标签: php sql sql-server

我有两个3变量,用于$ sql string

#region 

public void SomeMethod()
{
//...
}

#endregion 

我已经像这样编码了

$bikeid = xxxxx
$st_char = column name
$st_tab = table name

就像这样

$sql = "select $st_char
        from $st_tab
        where bike_id like '$bike_id'";

要从我的数据库中选择数据,结果是相同的,他们可以从数据库中获取数据

我的问题是哪一个是正确的,哪一个是错的 如果没有错,哪一个更好,为什么?

由于

1 个答案:

答案 0 :(得分:0)

两者都不好,因为they are vulnerable to SQL injection

使用预准备语句也可能带来性能提升。所以至少,您的查询应该如下所示:

select $st_char from $st_tab where bike_id like :bike_id

不幸的是,您无法在某些情况下使用参数,例如列名和表名。在这种情况下,您需要进行手动字符串连接,但白名单允许输入。例如:

$allowed_cols = array('col1', 'col2', 'col3');
$allowed_tables = array('t1', 't2', 't3');

if(in_array($st_char, $allowed_cols, true) && in_array($st_tab, $allowed_tables, true))
{
    $query = "select $st_char from $st_tab where bike_id like :bike_id";
    // perform execution here
}
else
{
    // invalid or malicious input
}

您可能还希望将表/列名称包装在方括号([])中,以避免与任何保留关键字冲突:

$query = "select [$st_char] from [dbo].[$st_tab] where bike_id like :bike_id";