如何防止MySQL的命令行shell接口中的SQL注入?

如何防止MySQL的命令行shell接口中的SQL注入?,第1张

概述如何防止MySQL的命令行shell接口中的SQL注入

我使用shell脚本来与MysqL数据库进行通信。 MysqL支持将查询指定为shell参数,如下所示:

MysqL my_db -B -N -e "select ID from table"

但是,如果我有一个参数,我想在查询中使用,我怎样才能防止注入攻击?

一个天真的方法是只需将variables值粘贴到请求中,但不是很安全:

MysqL my_db -B -N -e "select ID from table where name='$ParaM'"

是否有任何技巧或logging的接口,从命令行进行注入安全的查询?

在linux for linux上交叉编译Qt5

为什么函数在x86 linux的alignment地址加载elf可执行文件?

从terminal调用时使用默认Python而不是Anaconda安装

Git拉和推不工作(使用gitg客户端)

如何使用mono gtk制作一个类似 *** 的边栏#

Wayland合成者不能像X那样做窗饰吗?

DMA引擎和DMA控制器有什么区别?

在vim中插入文本会导致每行被右移

Bash:如何远程运行脚本

你能把一个C ++ linux针对性的应用程序链接到一个Objective-C静态库吗?

你可以用base64对这个值进行编码,然后base64在MysqL中进行解码。 MysqL中有用于将Base64数据转换为常用数据的UDF。 此外,大多数系统都有uuencode,或base64编码数据的“base64”命令。

每当您通过连接参数(如您的示例)构建sql时,您的应用程序可以承受sql注入攻击。 在这个链接上有关于维基百科的文章: @R_419_6822@ : //en.wikipedia.org/wiki/sql_injection

我怀疑你会想编写一个unix过滤器来使用文章中提到的MysqL_real_escape_string函数来构造你的SQL查询。

考虑将sql作为第一个参数,将变量作为后续参数传递,然后让它返回构造的sql。 如果您将过滤器命名为“blobbo”,则类似于您的示例的命令可能如下所示:

blobbo“从表中选择ID where name =%s”$ ParaM

你不仅需要防止sql注入,而且还要防止shell注入。 您可能希望将查询(在清理任何动态部分之后)写入文件,然后将该文件重定向到MysqL,而不是希望查询不会破坏shell。 考虑:

ParaM="name'"; rm -rf / ; echo 'pwn3d U"

变得

MysqL my_db -B -N -e "select ID from table where name='name'"; rm -rf / ; echo 'pwn3d U'

要么:

command 1: MysqL my_db -B -N -e "select ID from table where name='name'" command 2: rm -rf / command 3: echo 'pwn3d U'

相反,请执行以下 *** 作:

cat <<EOT > query.sql select .... blah blaah blah .... sanitized query here EOT MysqL my_db -B -N < query.sql

这将防止任何用户指定的数据出现在shell命令本身内,防止至少一个级别的注入漏洞。 但是,那么您仍然需要处理sql注入问题。

Sargun Dhillon的回答指出了我的正确方向。 不幸的是,在MysqL 5.6之前没有提供FROM_BASE64,所以我去了UNHEX。

下面的脚本是一个从shell中查询Redmine用户的详细信息的例子。 如果不信任的用户可以访问这个脚本,我还是不会睡得很好,但是对我来说这是足够安全的。 (它也限于字符串值,你不应该在你的查询中有问号,但这些限制对我来说是好的。)

#!/bin/bash MysqL_OPTS='--defaults-file=/etc/redmine/MysqL.cnf' MysqL_query() { local db=$1 local sql=$2 shift 2 || return 1 declare -a args=("$@") sql=${sql//[%]/%%} sql=${sql//[?]/UNHEX('%s')} for ((i=0; i<${#args[@]}; i++)); do args[$i]=$(echo -n "${args[$i]}" | hexdump -v -e '/1 "%02X"') done sql=$(printf "$sql" "${args[@]}") MysqL $MysqL_OPTS "$db" -e "$sql" || return $? } for u in "$@"; do MysqL_query redmine 'select * from users where login=?G' "$u" done

如果您发现我错过了任何sql或Shell注入,请发表评论。

总结

以上是内存溢出为你收集整理的如何防止MySQL的命令行shell接口中的SQL注入?全部内容,希望文章能够帮你解决如何防止MySQL的命令行shell接口中的SQL注入?所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存