php sql注入教程,SQL注入

如果需要通过网页需要用户输入的数据并将其插入到一个SQL数据库,可能会留下敞开称为SQL注入安全问题。

这一课将教你如何防止这种情况的发生,并帮助您保护服务器端脚本,如Perl脚本中使用的SQL语句。

注入通常当要求一个用户输入,就如他们的名字,但他们给你不是一个名字,会在不知不觉中对数据库运行SQL语句时发生问题。

千万不要信任用户提供的数据,处理这些数据只是验证后;作为一项规则,通过模式匹配进行。

在下面的例子中,该名称被限制为字母数字字符加下划线并以8至20个字符之间的长度(根据需要修改这些规则)。

if(preg_match("/^w{8,20}$/",$_GET['username'],$matches)){$result=mysql_query("SELECT * FROM CUSTOMERS

WHERE name=$matches[0]");}else{echo"user name not accepted";}

为了说明问题,考虑这个片段:

// supposed input$name="Qadir'; DELETE FROM CUSTOMERS;";mysql_query("SELECT * FROM CUSTOMSRS WHERE name='{$name}'");

函数调用应该检索来自CUSTOMERS表,其中name列相匹配用户指定名称的记录。在正常情况下,$name应该只包含字母数字字符和或许空格,如字符串ilia。 但在这里,通过附加一个全新的查询$name,调用数据库变成灾难:注入DELETE查询删除所有记录的客户。

幸运的是,如果你使用MySQL,在mysql_query()函数不允许查询堆叠或一个函数调用执行多个SQL查询。 如果您尝试堆叠查询,调用失败。

然而,其他PHP数据库扩展,如SQLite和PostgreSQL,愉快地进行堆查询,执行都在一个字符串提供的查询,并创建一个严重的安全问题。

防止SQL注入:

您可以在脚本语言,如Perl和PHP巧妙地处理所有转义字符。MySQL扩展为PHP提供的函数mysql_real_escape_string()来转义特殊MySQL的输入字符。

if(get_magic_quotes_gpc()){$name=stripslashes($name);}$name=mysql_real_escape_string($name);mysql_query("SELECT * FROM CUSTOMERS WHERE name='{$name}'");

LIKE困惑:

为了解决LIKE问题,一个自定义的转义机制必须将用户提供的'%'和'_'字符文字。 使用addslashes()函数,可以让你指定一个字符范围转义。

$sub=addcslashes(mysql_real_escape_string("%str"),"%_");// $sub == \%str\_mysql_query("SELECT * FROM messages

WHERE subject LIKE '{$sub}%'");

¥ 我要打赏

纠错/补充

收藏

上一篇:

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值