什么是mysql注入

什么是mysql注入,第1张

MySQL SQL 注入

SQL注入可能是目前互联网上存在的最丰富的编程缺陷。 这是未经授权的人可以访问各种关键和私人数据的漏洞。 SQL注入不是Web或数据库服务器中的缺陷,而是由于编程实践较差且缺乏经验而导致的。 它是从远程位置执行的最致命和最容易的攻击之一。

我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的,我们都需要对用户输入的数据进行过滤处理。

以下实例中,输入的用户名必须为字母、数字及下划线的组合,且用户名长度为 8 到 20 个字符之间:

让我们看下在没有过滤特殊字符时,出现的SQL情况:

以上的注入语句中,我们没有对 $name 的变量进行过滤,$name 中插入了我们不需要的SQL语句,将删除 users 表中的所有数据。

在PHP中的 mysqli_query() 是不允许执行多个 SQL 语句的,但是在 SQLite 和 PostgreSQL 是可以同时执行多条SQL语句的,所以我们对这些用户的数据需要进行严格的验证。

防止SQL注入,我们需要注意以下几个要点:

永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双”-“进行转换等。

永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。

.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装

sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

教程来源:树懒学堂_一站式数据知识学习平台_MySQK 防止SQL注入

//POST过滤安全

$_POST=check_input($_POST)

function check_input($value)

{

if(get_magic_quotes_gpc()){

$value = htmlspecialchars(trim($value))

} else {

$value = addslashes(htmlspecialchars(trim($value)))

}

return $value

}

另一种如下:PHP整站防注入程序,需要在公共文件中require_once本文件

<?PHP

//判断magic_quotes_gpc状态

if (@get_magic_quotes_gpc ()) {

$_GET = sec ( $_GET )

$_POST = sec ( $_POST )

$_COOKIE = sec ( $_COOKIE )

$_FILES = sec ( $_FILES )

}

$_SERVER = sec ( $_SERVER )

function sec(&$array) {

//如果是数组,遍历数组,递归调用

if (is_array ( $array )) {

foreach ( $array as $k =>$v ) {

$array [$k] = sec ( $v )

}

} else if (is_string ( $array )) {

//使用addslashes函数来处理

$array = addslashes ( $array )

} else if (is_numeric ( $array )) {

$array = intval ( $array )

}

return $array

}

//整型过滤函数

function num_check($id) {

if (! $id) {

die ( '参数不能为空!' )

} //是否为空的判断

else if (inject_check ( $id )) {

die ( '非法参数' )

} //注入判断

else if (! is_numetic ( $id )) {

die ( '非法参数' )

}

//数字判断

$id = intval ( $id )

//整型化

return $id

}

//字符过滤函数

function str_check($str) {

if (inject_check ( $str )) {

die ( '非法参数' )

}

//注入判断

$str = htmlspecialchars ( $str )

//转换html

return $str

}

function search_check($str) {

$str = str_replace ( "_", "\_", $str )

//把"_"过滤掉

$str = str_replace ( "%", "\%", $str )

//把"%"过滤掉

$str = htmlspecialchars ( $str )

//转换html

return $str

}

//表单过滤函数

function post_check($str, $min, $max) {

if (isset ( $min ) &&strlen ( $str ) <$min) {

die ( '最少$min字节' )

} else if (isset ( $max ) &&strlen ( $str ) >$max) {

die ( '最多$max字节' )

}

return stripslashes_array ( $str )

}

//防注入函数

function inject_check($sql_str) {

return eregi ( 'select|inert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|UNION|into|load_file|outfile', $sql_str )

}

function stripslashes_array(&$array) {

if (is_array ( $array )) {

foreach ( $array as $k =>$v ) {

$array [$k] = stripslashes_array ( $v )

}

} else if (is_string ( $array )) {

$array = stripslashes ( $array )

}

return $array

}

?>

array_merge($HTTP_POST_VARS,$HTTP_GET_VARS)

这个方法里面的第一个参数不是数组,这很明显的说了啊。

$HTTP_POST_VARS是一个全局变量用于接受post过来的值

检查一下这里应该能找到问题所在


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

原文地址: http://outofmemory.cn/zaji/5903103.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-07
下一篇 2023-03-07

发表评论

登录后才能评论

评论列表(0条)

保存