像一行代码
my $ sql_query =“SELECT * FROM Users WHERE user =‘$ user’;”;可能会在您的程序中引入SQL注入漏洞。为了避免这个,可以使用类似的东西
我的$ sth = …
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()
但是使用参数确实需要使用 prepare() 。
PS:你不需要放 ; 在SQL查询结束时,以编程方式一次运行一个SQL查询。只有在运行多个查询(例如SQL脚本或存储过程)时才需要分隔符。在你的例子中, ; 是无害的,但MySQL不需要它,它只会忽略它。
;