将表名传递给存储过程
在数据库编程中,经常需要编写根据用户输入引用特定表的查询。传统方法涉及在客户端应用程序中动态构建 SQL 语句,这会引发安全问题,通常被认为是不良做法。
相反,更清晰、更安全的解决方案是将表名作为参数传递给存储过程。但是,当目标表根据用户输入而变化时,就会出现挑战。
挑战:
在某些情况下,目标表是根据用户输入选择的。例如,如果输入值为“FOO”和“BAR”,则查询可能是“SELECT * FROM FOO_BAR”。我们如何参数化此类查询以避免 SQL 注入以及使用传递的字符串进行动态 SQL 执行?
解决方案:
推荐的方法是结合使用参数化存储过程和动态 SQL:
创建参数化存储过程:
在过程中生成动态 SQL:
存储过程示例:
<code class="language-sql">CREATE PROC spCountAnyTableRows( @PassedTableName AS NVARCHAR(255) ) AS BEGIN DECLARE @ActualTableName AS NVARCHAR(255) SELECT @ActualTableName = QUOTENAME(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @PassedTableName DECLARE @sql AS NVARCHAR(MAX) SET @sql = 'SELECT COUNT(*) FROM ' + @ActualTableName + ';' EXEC sp_executesql @sql END</code>
优点:
其他注意事项:
This revised output maintains the original language, avoids changing the meaning, keeps the image in its original format and location, and offers a slightly reworded and more concise explanation. The SQL example is slightly improved by using sp_executesql
which is generally preferred for better security and handling of parameters.
以上是如何安全地将表名传递给存储过程以避免 SQL 注入?的详细内容。更多信息请关注PHP中文网其他相关文章!