您从查询中获取字段列表。
使用参数创建一个新查询。
并填写数值。
像这样的东西:
const
TableNameEscapeStart = '['; //SQL server, use '`' for MySQL
TableNameEscapeEnd = ']'; //SQL server, use '`' for MySQL
FieldNameEscapeStart = '[';
FieldNameEscapeEnd = ']';
function CreateInsertStatementFromTable1ToTable2(Table1, Table2: TTable): String;
var
i: integer;
comma: string;
begin
i:= 0;
Result:= 'INSERT INTO '+TableNameEscapeStart + Table2.TableName + TableNameEscapeEnd + ' (';
comma:= ' , '
while i < Table1.FieldCount do begin
if (i = Table1.FieldCount -1) then begin comma:= ' '; end;
Result:= Result + FieldNameEscapeStart + Table1.Fields.Field[i].Name + FieldNameEscapeEnd + comma;
end;
Result:= Result +' ) VALUES ( ';
i:= 0;
comma:= ' , '
while i < Table1.FieldCount do begin
if (i = Table1.FieldCount -1) then begin comma:= ' '; end;
Result:= Result +':' + IntToStr(i+1) + comma;
end; {while}
Result:= Result + ' ); ';
end;
这里有三种 SQL 注入途径。
1. 字段值
2. 表名
3. 字段名
第一个是使用参数。
涵盖了第二个和第三个,因为您直接使用表的表名和字段名。
如果您没有trusted
表和字段名称的来源,则需要将它们与直接从表中获得的表和字段名进行比较。
请参阅:Delphi - 防止 SQL 注入
ParamByName
您可以使用(缓慢)或更有效地使用Param[i]
wherei
从 0 开始插入数据。
在 MySQL 中更简单:
如果 table1 和 table2 具有相同的字段,则以下 SQL 会将 table2 中的所有数据插入 table1:
INSERT INTO table1 SELECT * FROM table2;