PHP登录环节防止sql注入实例详解

分享下PHP登录环节 防止sql注入的方法。

在防止sql注入这些细节出现问题的一般是那些大意的程序员或者是新手程序员,由于没有对用户提交过来的数据进行一些必要的过滤,从而导致了给大家测试的时候一下就攻破了你的数据库。

介绍一个用户登录未进行安全配置可能出现的sql注入方法。

比如,以下登录代码:
if($l = @mysql_connect('localhost', 'root', '123')) or die('数据库连接失败');
mysql_select_db('test');
mysql_set_charset('utf8');
$sql = 'select * from test where username = "$username" and password = "$password"';
$res = mysql_query($sql);
if(mysql_num_rows($res)){
header('Location:./home.php');
}else{
die('输入有误');
}

注意上面的 sql语句,存在很大的安全隐患,如果使用以下万能密码和万能用户名,那么可以轻松进入页面:
$sql = 'select * from test where username = "***" and password = "***" or 1 = "1"';
很明显,针对这条sql语句的万能密码是: ***" or 1 = "1
$sql = 'select * from test where username ="***" union select * from users/* and password = "***"';
正斜线* 表示后面的不执行,mysql支持union联合查询,因此直接查询出所有数据; 所以针对这条sql语句的万能用户名是:***" union select * from users/*
但是,此注入只针对代码中的sql语句,如果
$sql = "select * from test where username = $username and password = $password";
上面的注入至少已经不管用了,不过方法是一样的;
在使用PDO之后,sql注入完全可以被避免,( www.jbxue.com)而且在这个快速开发的时代,框架横行,已然不用过多考虑sql注入问题了。
下面整理了两个防止sql注册函数
/
* 过滤所有GET过来变量 */
foreach ($_GET as $get_key=>$get_var)
{
if (is_numeric($get_var)) {
$get[strtolower($get_key)] = get_int($get_var);
} else {
$get[strtolower($get_key)] = get_str($get_var);
}
}
/* 过滤所有POST过来的变量 */
foreach ($_POST as $post_key=>$post_var)
{
if (is_numeric($post_var)) {
$post[strtolower($post_key)] = get_int($post_var);
} else {
$post[strtolower($post_key)] = get_str($post_var);
} www.jbxue.com
}
/* 过滤函数 */
//整型过滤函数
function get_int($number)
{
return intval($number);
}
//字符串型过滤函数
function get_str($string)
{
if (!get_magic_quotes_gpc()) {
return addslashes($string);
}
return $string;
}

另外还有一些博客会这样写
<?php  
function post_check($post) 
{ 
if (!get_magic_quotes_gpc()) // 判断magic_quotes_gpc是否为打开 
{ 
$post = addslashes($post); // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤 
} 
$post = str_replace("_", "\_", $post); // 把 '_'过滤掉 
$post = str_replace("%", "\%", $post); // 把' % '过滤掉 
$post = nl2br($post); // 回车转换 
$post= htmlspecialchars($post); // html标记转换 
return $post; 
} 
?>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
登录注册页面防止SQL注入的方法有以下几种: 1. 使用参数化查询:参数化查询是一种将用户输入的数据与SQL查询语句分开的方法,可以有效防止SQL注入攻击。通过将用户输入的数据作为参数传递给查询语句,而不是将其直接拼接到查询语句中,可以防止恶意用户在输入中插入恶意的SQL代码。以下是一个使用参数化查询的示例(假设使用Python的SQLite数据库): ```python import sqlite3 # 假设用户输入的用户名和密码分别为username和password username = input("请输入用户名:") password = input("请输入密码:") # 连接数据库 conn = sqlite3.connect("mydatabase.db") cursor = conn.cursor() # 使用参数化查询 cursor.execute("SELECT * FROM users WHERE username=? AND password=?", (username, password)) # 获取查询结果 result = cursor.fetchone() # 关闭数据库连接 cursor.close() conn.close() # 判断查询结果 if result: print("登录成功") else: print("用户名或密码错误") ``` 2. 输入验证和过滤:在接受用户输入之前,对输入进行验证和过滤是一种有效的防止SQL注入的方法。可以使用正则表达式或其他验证方法来确保用户输入的数据符合预期的格式,并且过滤掉可能包含恶意代码的字符。 3. 使用ORM框架:ORM(对象关系映射)框架可以帮助开发人员将对象与数据库表进行映射,从而避免直接操作SQL语句。ORM框架通常会自动处理参数化查询和输入验证,从而提供了更高的安全性。 4. 最小权限原则:在数据库中为应用程序的登录和注册功能创建一个专门的用户,并为该用户分配最小的权限。这样可以限制恶意用户对数据库的访问范围,减少潜在的攻击风险。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值