最近很多小伙伴都在问如何防止MySQL的命令行shell接口中的SQL注入?和mysqli防止sql注入这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展addslashes()用途
最近很多小伙伴都在问如何防止MySQL的命令行shell接口中的SQL注入?和mysqli防止sql注入这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展addslashes()用途与php怎样防止mysql注入?、dbutils如何防止sql注入?、Erlang Mysql:如何防止SQL注入、MySQL 及 SQL 注入:防止SQL注入、Like语句中的注入等相关知识,下面开始了哦!
本文目录一览:- 如何防止MySQL的命令行shell接口中的SQL注入?(mysqli防止sql注入)
- addslashes()用途与php怎样防止mysql注入?
- dbutils如何防止sql注入?
- Erlang Mysql:如何防止SQL注入
- MySQL 及 SQL 注入:防止SQL注入、Like语句中的注入
如何防止MySQL的命令行shell接口中的SQL注入?(mysqli防止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注入攻击。 在这个链接上有关于维基百科的文章: http : //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注入,请发表评论。
addslashes()用途与php怎样防止mysql注入?
1.表单数据
显示的是表单的数据
2.php的抓取的表单数据
已经自动加了\
3.
写到mysql中居然没有
4.怀疑是被mysql软件隐藏掉了,进命令行看看:
也没有看到\
按照官方的说法
http://www.php.net/manual/zh/function.addslashes.php
立即学习“PHP免费学习笔记(深入)”;
点击下载“修复打印机驱动工具”;
一个使用 addslashes() 的例子是当你要往数据库中输入数据时。 例如,将名字 O''reilly 插入到数据库中,这就需要对其进行转义。 强烈建议使用 DBMS 指定的转义函数 (比如 MySQL 是 mysqli_real_escape_string(),PostgreSQL 是 pg_escape_string()),但是如果你使用的 DBMS 没有一个转义函数,并且使用 \ 来转义特殊字符,你可以使用这个函数。 仅仅是为了获取插入数据库的数据,额外的 \ 并不会插入。 当 PHP 指令 magic_quotes_sybase 被设置成 on 时,意味着插入 '' 时将使用 '' 进行转义。
问题:
1.addsleshes()函数在起到防止注入的作用时,是怎样一种机制?
2.stripslashes()在什么情况下使用?
3.对表单提交过来的数据直接用htmlspecialchars()转义处理并存入数据库,是不是更好?
4.好是的防止sql注入的方式是怎样的?
.
回复内容:
1.表单数据
显示的是表单的数据
2.php的抓取的表单数据
已经自动加了\
3.mysql数据 (最下面一行)
写到mysql中居然没有
4.怀疑是被mysql软件隐藏掉了,进命令行看看:
也没有看到\
按照官方的说法
http://www.php.net/manual/zh/function.addslashes.php
立即学习“PHP免费学习笔记(深入)”;
点击下载“修复打印机驱动工具”;
一个使用 addslashes() 的例子是当你要往数据库中输入数据时。 例如,将名字 O''reilly 插入到数据库中,这就需要对其进行转义。 强烈建议使用 DBMS 指定的转义函数 (比如 MySQL 是 mysqli_real_escape_string(),PostgreSQL 是 pg_escape_string()),但是如果你使用的 DBMS 没有一个转义函数,并且使用 \ 来转义特殊字符,你可以使用这个函数。 仅仅是为了获取插入数据库的数据,额外的 \ 并不会插入。 当 PHP 指令 magic_quotes_sybase 被设置成 on 时,意味着插入 '' 时将使用 '' 进行转义。
问题:
1.addsleshes()函数在起到防止注入的作用时,是怎样一种机制?
2.stripslashes()在什么情况下使用?
3.对表单提交过来的数据直接用htmlspecialchars()转义处理并存入数据库,是不是更好?
4.好是的防止sql注入的方式是怎样的?
.
如文档上写的呀,addslashes就是为参数的引号前加了个斜杠。
也如你所打印的数据,参数前也有斜杠。
但是数据库里就不应该有斜杠呀!
addslashes是如何防注入的,就是防止在我们写SQL时直接套用输入参数而导致产生可被注入的SQL来防注入的。
例如$sql = "SELECT * FROM user WHERE id = ''$id''";,如果这里的$id参数被人故意操作成了1'' OR ''1 = 1'',那不就成了注入SQL了吗?
而如果用addslashes加上斜杠,$id中的引号就会被转意,也就不会产生错误的SQL。但这些结果都不会影响到数据写入,因为真正插入和更新数据时,这些斜杠又会被转意回来的。
防御SQL注入(输入数据库):
PDO bindParam 或 mysqli_stmt_bind_param: 避免SQL注入.
addslashes: 用反斜杠转义所有的单引号,双引号,反斜杠和NUL''s,一定程度上避免SQL注入.
mysqli_real_escape_string: 转义SQL语句中的特殊字符.
有了bind_param,就不需要使用addslashes,mysqli_real_escape_string,magic_quotes_gpc这些功能了.
比如:
PDO MySQL: //方法1(问号占位符) $stmt = $db->prepare(''UPDATE posts SET post_title = ?, post_content = ? WHERE id = ?''); $stmt->execute(array($title,$content,$id)); //所有值视作PDO::PARAM_STR处理 //方法2(命名占位符) $stmt = $db->prepare(''UPDATE posts SET post_title = :title, post_content = :content WHERE id = :id''); $stmt->execute(array('':title'' => $title,'':content'' => $content,'':id'' => $id)); //所有值视作PDO::PARAM_STR处理 //方法3 $stmt = $db->prepare(''UPDATE posts SET post_title = ?, post_content = ? WHERE id = ?''); $stmt->bindParam(1, $title, PDO::PARAM_STR); $stmt->bindParam(2, $content, PDO::PARAM_STR); $stmt->bindParam(3, $id, PDO::PARAM_INT); $stmt->execute(); //方法4 $stmt = $db->prepare(''UPDATE posts SET post_title = :title, post_content = :content WHERE id = :id''); $stmt->bindParam('':title'', $title, PDO::PARAM_STR); $stmt->bindParam('':content'', $content, PDO::PARAM_STR); $stmt->bindParam('':id'', $id, PDO::PARAM_INT); $stmt->execute(); MySQLi: //MySQLi只需执行一次bind_param,要比PDO简洁一些,MySQLi不支持命名占位符. $stmt->bind_param(''ssi'', $title, $content, $id);
你说的htmlspecialchars是在输出HTML时防御XSS攻击的,区别于上面说的防御SQL注入.
dbutils如何防止sql注入?
rtErlang Mysql:如何防止SQL注入
我是erlang的新手,我需要编写一些代码来在MySQL数据库中插入行。如何使用Erlang防止SQL注入?是否还有其他语言的预备陈述之类的东西,或者我应该怎么做?
多谢您的回覆。
MySQL 及 SQL 注入:防止SQL注入、Like语句中的注入
MySQL 及 SQL 注入
如果您通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题。
本章节将为大家介绍如何防止SQL注入,并通过脚本来过滤SQL中注入的字符。
所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的,我们都需要对用户输入的数据进行过滤处理。
以下实例中,输入的用户名必须为字母、数字及下划线的组合,且用户名长度为 8 到 20 个字符之间:
if (preg_match("/^\w{8,20}$/", $_GET[''username''], $matches))
{
$result = mysqli_query($conn, "SELECT * FROM users
WHERE username=$matches[0]");
}
else
{
echo "username 输入异常";
}
让我们看下在没有过滤特殊字符时,出现的SQL情况:
// 设定$name 中插入了我们不需要的SQL语句
$name = "Qadir''; DELETE FROM users;";
mysqli_query($conn, "SELECT * FROM users WHERE name=''{$name}''");
以上的注入语句中,我们没有对 $name 的变量进行过滤,$name 中插入了我们不需要的SQL语句,将删除 users 表中的所有数据。
在PHP中的 mysqli_query() 是不允许执行多个 SQL 语句的,但是在 SQLite 和 PostgreSQL 是可以同时执行多条SQL语句的,所以我们对这些用户的数据需要进行严格的验证。
防止SQL注入,我们需要注意以下几个要点:
- 1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双"-"进行转换等。
- 2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
- 3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
- 4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
- 5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
- 6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。
防止SQL注入
在脚本语言,如Perl和PHP你可以对用户输入的数据进行转义从而来防止SQL注入。
PHP的MySQL扩展提供了mysqli_real_escape_string()函数来转义特殊的输入字符。
if (get_magic_quotes_gpc())
{
$name = stripslashes($name);
}
$name = mysqli_real_escape_string($conn, $name);
mysqli_query($conn, "SELECT * FROM users WHERE name=''{$name}''");
Like语句中的注入
like查询时,如果用户输入的值有"_"和"%",则会出现这种情况:用户本来只是想查询"abcd_",查询结果中却有"abcd_"、"abcde"、"abcdf"等等;用户要查询"30%"(注:百分之三十)时也会出现问题。
在PHP脚本中我们可以使用addcslashes()函数来处理以上情况,如下实例:
$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_");
// $sub == \%something\_
mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE ''{$sub}%''");
addcslashes() 函数在指定的字符前添加反斜杠。
语法格式:
addcslashes(string,characters)
参数 | 描述 |
---|---|
string | 必需。规定要检查的字符串。 |
characters | 可选。规定受 addcslashes() 影响的字符或字符范围。 |
今天的关于如何防止MySQL的命令行shell接口中的SQL注入?和mysqli防止sql注入的分享已经结束,谢谢您的关注,如果想了解更多关于addslashes()用途与php怎样防止mysql注入?、dbutils如何防止sql注入?、Erlang Mysql:如何防止SQL注入、MySQL 及 SQL 注入:防止SQL注入、Like语句中的注入的相关知识,请在本站进行查询。
本文标签: