通过准备和执行避免SQL注入

时间:2019-03-07 19:44:43

标签: perl sql-injection dbi

像这样的一行代码

my $sql_query = "SELECT * FROM Users WHERE user='$user';";

可能在您的程序中引入SQL注入漏洞。为了避免这种情况,可以使用类似的

my $sth = $dbh->prepare("SELECT * FROM Users WHERE user='?';");
$dbh->execute($user);

但是,在我当前正在处理的代码中,使用了

$sql_query = "SELECT * FROM Users WHERE user='" . $user . "';";
$dbh->prepare($sql_query);
$dbh->execute();

这确实有效吗?如果是,我的所作所为有什么区别吗?优点和缺点是什么?

1 个答案:

答案 0 :(得分:6)

my $sth = $dbh->prepare("SELECT * FROM Users WHERE user='?'");

这将不起作用,因为它正在搜索文字'?'字符-而不是参数。如果您尝试为该参数发送一个值,MySQL将会像是“您要我对此做些什么?”。因为查询没有参数占位符。

如果要使用参数,则即使参数将采用字符串或日期时间值,也不得将参数占位符放在SQL查询的字符串定界符内:

my $sth = $dbh->prepare("SELECT * FROM Users WHERE user=?");

下一个示例:

$sql_query = "SELECT * FROM Users WHERE user='" . $user . "'";
$dbh->prepare($sql_query);
$dbh->execute();

这将运行查询,但这并不安全。您可以准备任何没有参数的查询。

使用prepare()不能使查询免受SQL注入的影响。更安全的方法是使用参数来组合动态值,而不是像本例中那样进行字符串连接。

但是使用参数确实需要使用prepare()

PS:以编程方式一次运行一次;时,无需在SQL查询的末尾加上;。仅当您运行多个查询(例如在SQL脚本或存储过程中)时,才需要分隔符。在您的示例中,from mpu6050 import mpu6050 from time import sleep import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation from matplotlib import style style.use("fivethirtyeight") sensor = mpu6050(0x68) print " waiting for the sensor to callibrate..." sleep(2) acc = np.empty((0,3), float) # storage for x, y, z axes values of the accelerometer t = 0 time = np.empty((0,1), int) # time counter(this becomes the x axis of the graph) fig = plt.figure() ax1 = fig.add_subplot(1, 1, 1) axis = 0 # accelerometer x axis. y axis = 1, z axis = 2 def animate(i): ax1.clear() ax1.plot(time, acc[:,axis]) while True: accel_data = sensor.get_accel_data() print("Accelerometer data") print("x: " + str(accel_data['x'])) print("y: " + str(accel_data['y'])) print("z: " + str(accel_data['z'])) acc = np.append(acc, np.array([[accel_data['x'], accel_data['y'], accel_data['z']]]), axis=0) # increment time array time = np.append(time, t) t = t + 1 print("acc[:,0]:" + str(acc[:,0])) print("time:" + str(time)) ani = animation.FuncAnimation(fig, animate, interval = 1000) plt.show() sleep(2) 是无害的,但是MySQL不需要它,它只会忽略它。