perl – 使用prepare和execute避免SQL注入

perl – 使用prepare和execute避免SQL注入,第1张

概述像一行代码 my $sql_query = "SELECT * FROM Users WHERE user='$user';"; 可能会在您的程序中引入SQL注入漏洞.为了避免这个,可以使用类似的东西 my $sth = $dbh->prepare("SELECT * FROM Users WHERE user='?';");$dbh->execute($user); 但是,在我目前正在处理的代 像一行代码

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();

这实际上有用吗?如果是的话,我会做些什么?有哪些优点和缺点?

解决方法
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查询.只有在运行多个查询(例如sql脚本或存储过程)时才需要分隔符.在你的例子中,;是无害的,但MysqL不需要它,它只会忽略它.

总结

以上是内存溢出为你收集整理的perl – 使用prepare和execute避免SQL注入全部内容,希望文章能够帮你解决perl – 使用prepare和execute避免SQL注入所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1213468.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存