像这样的一行代码
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();
这确实有效吗?如果是,我的所作所为有什么区别吗?优点和缺点是什么?
答案 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不需要它,它只会忽略它。