首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP -使用占位符MS SQL添加阻止SQL注入的新列

问PHP -使用占位符MS SQL添加阻止SQL注入的新列
EN

Stack Overflow用户
提问于 2018-11-23 15:17:09
回答 1查看 61关注 0票数 0

我正在开发一个基于MS SQL的PHP应用程序,它可以将列添加到表中,可以是bit、int或varchar。我当前的代码类似于以下代码:

代码语言:javascript
复制
$sql = "ALTER TABLE myTable ADD ? ".$type;
$values = array($columnname);
if($type == "varchar")
    $sql = $sql."(".$length.")";
$sql = $sql.";";
sqlsrv_query($conn, $sql, $values);

然而,我只得到一个错误,告诉我在'@P1‘附近有一个不正确的语法。我考虑过将列名直接插入到字符串中,但我害怕SQL注入,因为它是一个文本输入。我并不担心类型和长度,因为它们是select和number输入。

我希望你们中的一位能给我一些建议,如何在不暴露于SQL注入的情况下添加该列。提前谢谢你!

(因为这个问题被标记为“可能的重复”,所以我想澄清的是,我特别想问的是在不将自己暴露于SQL注入的情况下添加一个新列,而不仅仅是将值插入到表中。我希望我已经说得很清楚了。)

EN

回答 1

Stack Overflow用户

发布于 2018-11-25 01:35:10

正如上面的注释所述,您只能使用参数占位符来替换标量值-即,否则您将使用单引号字符串、带引号的日期/时间或数字文字。

参数不适用于诸如表名或列名之类的标识符,也不适用于SQL关键字,也不适用于SQL表达式,也不适用于值列表(列表中的每个标量值必须使用一个占位符)。

如果您想要将列名或SQL关键字设置为动态的,除非您确保将动态部分限制为无害的字符串,否则很容易受到SQL注入的攻击。

例如,您可以使用分隔和转义来实现这一点。

代码语言:javascript
复制
$columnname = str_replace("]", "]]", $columnname);
$sql = "ALTER TABLE myTable ADD [$columnname] $type";

MS SQL Server使用方括号分隔可能包含特殊字符的标识符。str_replace()只是为了防止列名本身包含方括号。有关更多解释,请阅读https://sqlsunday.com/2014/09/21/identifiers-in-tsql/。

那$type呢?我们如何确保这是安全的呢?另一种技术是白名单。要使$type安全,您需要根据允许值列表对其进行检查。

代码语言:javascript
复制
switch ($type) {
case "int":
  // OK, nothing to change
  break;
case "varchar":
  $type = "varchar($length)"
  break;
// ...add cases for other allowed types...
default:
  die("Unrecognized type: $type");
}

您可以在default子句中出现错误而死,也可以将$type设置为合理的默认值。这取决于你想如何处理它。

你可能会问,为什么会有这么多代码?为什么不能简单一点呢?

因为你需要软件做一些动态的事情。不管用户输入什么,你都要让代码做正确的事情。如果您不需要支持用户输入,那么可以将列名和类型设置为fixed,这样就很简单了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53442175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档