在PHP中,当使用带有参数化查询的PDO访问MySQL数据库时,如何检查最终查询(在替换所有令牌之后)?
有没有办法检查数据库真正执行的是什么?
我听说"每个人"都在使用参数化SQL查询来防止SQL注入攻击,而不必为每一条用户输入进行操作.
你怎么做到这一点?使用存储过程时是否自动获得此信息?
所以我理解这是非参数化的:
cmdText = String.Format("SELECT foo FROM bar WHERE baz = '{0}'", fuz)
Run Code Online (Sandbox Code Playgroud)
这会参数化吗?
cmdText = String.Format("EXEC foo_from_baz '{0}'", fuz)
Run Code Online (Sandbox Code Playgroud)
或者我是否需要做更广泛的事情以保护自己免受SQL注入?
With command
.Parameters.Count = 1
.Parameters.Item(0).ParameterName = "@baz"
.Parameters.Item(0).Value = fuz
End With
Run Code Online (Sandbox Code Playgroud)
除安全考虑因素外,使用参数化查询还有其他优点吗?
更新:这篇伟大的文章与格罗托克的一个问题相关联. http://www.sommarskog.se/dynamic_sql.html
我正在尝试使这个Python MYSQL更新语句正确(使用变量):
cursor.execute ("UPDATE tblTableName SET Year=%s" % Year ", Month=%s" % Month ", Day=%s" % Day ", Hour=%s" % Hour ", Minute=%s" Minute "WHERE Server=%s " % ServerID)
Run Code Online (Sandbox Code Playgroud)
我出错的任何想法?
我想允许用户使用一些相当灵活的标准查询数据库.我可以使用以下内容:
String slqCmdTxt = "SELECT * FROM TheTable WHERE " + userExpression;
Run Code Online (Sandbox Code Playgroud)
但是,我知道这对SQL注入是开放的.使用参数是好的,但我没有看到允许非常灵活的查询的方法.
如何在不打开SQL注入的情况下允许灵活的数据库查询?
更多细节:
实际上有两个表,一个主表和一个具有属性的辅助表.一个主记录可能具有许多属性.我们想查询两个表中的值.结果将被处理成一个报告,该报告比简单的表格视图更具可读性.数据由C#程序编写,但当前的方向是从用Java编写的组件查询表.
所以我需要一种方法来提供用户输入然后安全地构建查询.对于一组有限的输入,我编写了代码来构建一个带有给定输入和参数值的查询字符串.然后我查看并添加输入值作为参数.这导致复杂的字符串捕捉,难以改变/扩展.
现在我正在使用Java,一些搜索已经发现了像jOOQ这样的SQL语句构建库......
为什么使用参数化查询将数据插入表中:
string queryString = "insert into product(id, name) values (@id, @name)";
Run Code Online (Sandbox Code Playgroud)
比将值附加到查询字符串更快:
string queryString = "insert into product(id, name) values (" + _id + ", " + _name + ")";
Run Code Online (Sandbox Code Playgroud)
?
当我在循环中使用该命令插入10K行时,参数化查询比另一个快一个数量级.
我知道参数化查询具有安全性和可维护性的好处,并且它是推荐的使用方式,但现在我对解释为什么它更快更快感兴趣?
我正在SQL炼金术中使用利用Text对象的参数化查询,并且得到了不同的结果。
工作示例:
import sqlalchemy as sqlal
from sqlalchemy.sql import text
db_table = 'Cars'
id_cars = 8
query = text("""SELECT *
FROM Cars
WHERE idCars = :p2
""")
self.engine.execute(query, {'p2': id_cars})
Run Code Online (Sandbox Code Playgroud)
例如产生sqlalchemy.exc.ProgrammingError:(pymysql.err.ProgrammingError)(1064,“您的SQL语法错误)
import sqlalchemy as sqlal
from sqlalchemy.sql import text
db_table = 'Cars'
id_cars = 8
query = text("""SELECT *
FROM :p1
WHERE idCars = :p2
""")
self.engine.execute(query, {'p1': db_table, 'p2': id_cars})
Run Code Online (Sandbox Code Playgroud)
关于如何使用动态表名(也可以防止sql注入)运行查询的任何想法?
我有这样的查询:
SELECT imageurl
FROM entries
WHERE thumbdl IS NULL
LIMIT 10;
Run Code Online (Sandbox Code Playgroud)
它与PDO和MySQL Workbench完美配合(它可以根据需要返回10个URL).
但是我尝试LIMIT使用PDO 进行参数化:
$cnt = 10;
$query = $this->link->prepare("
SELECT imageurl
FROM entries
WHERE imgdl is null
LIMIT ?
");
$query->bindValue(1, $cnt);
$query->execute();
$result = $query->fetchAll(PDO::FETCH_ASSOC);
Run Code Online (Sandbox Code Playgroud)
返回空数组.
我已经很好地掌握了SQL注入.这是一个SQL查询应该是什么样的
SELECT FirstName, LastName
FROM Customers
WHERE CustomerId = @valueFromApplication
Run Code Online (Sandbox Code Playgroud)
变成了像这样的查询
SELECT FirstName, LastName
FROM Customers
WHERE CustomerId = '' ; DROP DATABASE Foo --
Run Code Online (Sandbox Code Playgroud)
当用户将恶意值插入您的应用程序,网站,客户端等等时......我也知道,攻击者可以尝试发现表的名称并从中获取信息,而不仅仅是删除数据库.
我也知道一些有助于防止这种情况的事情:
这些事情实际上如何防止SQL注入发生?为什么攻击者不能将相同的恶意值传递给他或她已经使用的任何输入并且具有相同的结果.
c# sql entity-framework sql-injection sql-parametrized-query
我使用以下代码:
string cmd = "INSERT INTO " + Tables.Lux() + " VALUES(NULL, @Position, @Mode, @Timer)";
try
{
using (var MyConnection = new MySqlConnection(ConfigurationManager.ConnectionStrings["DataFormConnection"].ConnectionString))
{
using (MySqlCommand command = new MySqlCommand(cmd, MyConnection))
{
MyConnection.Open();
command.Parameters.Add(new MySqlParameter("Position", Element.Position));
command.Parameters.Add(new MySqlParameter("Mode", Element.Mode));
command.Parameters.Add(new MySqlParameter("Timer", Element.Timer));
command.ExecuteNonQuery();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我使用上面的代码从包含100个项目的元素列表中插入数据.我想只在一个查询中添加100个值,我知道SQL语句如下所示:
INSERT INTO table (a,b) VALUES (1,2), (2,3), (3,4);
Run Code Online (Sandbox Code Playgroud)
但我不知道如何使用这种MySqlCommand.Parameters方法应用该结构.
我的目标是传递此函数List<Element>而不是仅仅传递此函数Element并创建一个INSERT语句,其中列表中的所有项目仅在一个查询中执行.有什么帮助吗?
谢谢.
给定Python中一个大的(~10,000)整数列表,如何有效地SELECT从列表中id的表中的所有项目?
我试过了:
>>> lst2
[{'id': 97600167}, {'id': 97600168}, {'id': 97611194}]
>>> cur.executemany("SELECT id, parent_id FROM my_table WHERE id=%(id)s", lst2)
>>> cur.fetchall()
[(97611194, 10020688), (None, None), (None, None)]
Run Code Online (Sandbox Code Playgroud)
第二个和第三个id(97600168,97611194)确实存在于表中.