像一行代码
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不需要它,它只会忽略它.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。