示例:
$user_input = $_POST['input'];
'SELECT '.$user_input.' FROM table_name'
因此,它基于安全(此示例显然不安全)值选择数据库中的列。这是实用/允许的代码吗?
答案 0 :(得分:1)
在SQL中,您只需将string
发送到DBMS(如MySQL)。因此,您可以构建所需的任何string
并将其提交给DBMS。
您只需确保生成的SQL查询有效。这意味着,例如列存在,并且不会出现无效符号。
答案 1 :(得分:1)
就此而言,此代码有效,假设$user_input
必须是有效的列名,这意味着它必须存在且不得包含任何特殊字符,保留字等(除非它们是转义)。
然而,正如您所说,此代码并不安全,但只要您计划安全地构建查询并使用PDO或MySQLi(没有弃用mysql_*
函数...),您应该没问题。如果您需要一个不使用已弃用函数的示例(包括mysql_real_escape_string
,也被弃用),我将提供一个。
我知道你说你知道这段代码不安全,但如果你好奇,这是另一个例子。正如评论和this question中所讨论的,这个输入:
$user_input = '; DELETE FROM table_name ; *';
'SELECT '.$user_input.' FROM table_name'
将删除表table_name
的全部内容。即使此代码引发语法错误,MySQL仍将继续执行它,从而有效地截断table_name
。