GVKun编程网logo

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

17

最近很多小伙伴都在问如何防止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注入)

如何防止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注入?

addslashes()用途与php怎样防止mysql注入?

1.表单数据
addslashes()用途与php怎样防止mysql注入?
显示的是表单的数据

2.php的抓取的表单数据
addslashes()用途与php怎样防止mysql注入?
已经自动加了\

3.mysql数据 (最下面一行)
addslashes()用途与php怎样防止mysql注入?
写到mysql中居然没有

4.怀疑是被mysql软件隐藏掉了,进命令行看看:
addslashes()用途与php怎样防止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.表单数据
addslashes()用途与php怎样防止mysql注入?
显示的是表单的数据

2.php的抓取的表单数据
addslashes()用途与php怎样防止mysql注入?
已经自动加了\

3.mysql数据 (最下面一行)
addslashes()用途与php怎样防止mysql注入?
写到mysql中居然没有

4.怀疑是被mysql软件隐藏掉了,进命令行看看:
addslashes()用途与php怎样防止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-&gt;prepare(''UPDATE posts SET post_title = ?, post_content = ? WHERE id = ?'');
$stmt-&gt;execute(array($title,$content,$id)); //所有值视作PDO::PARAM_STR处理

//方法2(命名占位符)
$stmt = $db-&gt;prepare(''UPDATE posts SET post_title = :title, post_content = :content WHERE id = :id'');
$stmt-&gt;execute(array('':title'' =&gt; $title,'':content'' =&gt; $content,'':id'' =&gt; $id)); //所有值视作PDO::PARAM_STR处理

//方法3
$stmt = $db-&gt;prepare(''UPDATE posts SET post_title = ?, post_content = ? WHERE id = ?'');
$stmt-&gt;bindParam(1, $title,   PDO::PARAM_STR);
$stmt-&gt;bindParam(2, $content, PDO::PARAM_STR);
$stmt-&gt;bindParam(3, $id,      PDO::PARAM_INT);
$stmt-&gt;execute();

//方法4
$stmt = $db-&gt;prepare(''UPDATE posts SET post_title = :title, post_content = :content WHERE id = :id'');
$stmt-&gt;bindParam('':title'',   $title,   PDO::PARAM_STR);
$stmt-&gt;bindParam('':content'', $content, PDO::PARAM_STR);
$stmt-&gt;bindParam('':id'',      $id,      PDO::PARAM_INT);
$stmt-&gt;execute();

MySQLi:
//MySQLi只需执行一次bind_param,要比PDO简洁一些,MySQLi不支持命名占位符.
$stmt-&gt;bind_param(''ssi'', $title, $content, $id);
登录后复制

你说的htmlspecialchars是在输出HTML时防御XSS攻击的,区别于上面说的防御SQL注入.

dbutils如何防止sql注入?

dbutils如何防止sql注入?

rt

Erlang Mysql:如何防止SQL注入

Erlang Mysql:如何防止SQL注入

我是erlang的新手,我需要编写一些代码来在MySQL数据库中插入行。如何使用Erlang防止SQL注入?是否还有其他语言的预备陈述之类的东西,或者我应该怎么做?

多谢您的回覆。

MySQL 及 SQL 注入:防止SQL注入、Like语句中的注入

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语句中的注入的相关知识,请在本站进行查询。

本文标签: