PHP中如何防止sql注入网络安全
下面是OMG的小编辑器,用于收集和整理文章,希望对你有所帮助。如果用户输入一个直接插入SQL语句的查询,应用程序将很容易地注入SQL,如下面的示例:
unsafe_variable美元美元'user_input_post { } =;
mysql_query(插入表格(列)的值('),unsafe_variable美元。);
这是因为用户可以输入一个类似的value);滴表;-使查询:
插入表格(列)的值(币值的下降);表;
我们应该做些什么来防止这种情况呢
使用准备声明与任何参数的query.sql报表参数发送到数据库服务器和解析!攻击者不可能向数据库中注入恶意SQL!
基本上有两种选择来实现这个目标:
1。使用PDO(PHP数据对象):
美元美元支撑= PDO ->准备('select *从员工那里姓名:名字);
支撑美元->执行(阵列($名称:名称= >));
foreach($为达行){
有$行/做某事
}
2。使用mysqli:
美元美元支撑=类->准备('select *从员工那里名称=);
支撑美元-> bind_param(是的,$的名字);
支撑美元->执行();
$result = $stmt->get_result ();
而($行= $结果-> fetch_assoc()){
有$行/做某事
}
PDO(PHP数据对象)
注意,当使用PDO访问MySQL数据库,真正准备的句子不使用默认值。为了解决这个问题,必须禁用已准备好进行模拟的语句。
创建连接使用PDO的例子如下:
美元类=新PDO('mysql:北京测试;主机= 127.0.0.1;字符集= UTF8,用户,往);
美元类-> setAttribute(PDO::attr_emulate_prepares,假);
美元类-> setAttribute(PDO::::attr_errmode,PDO errmode_exception);
在上面的例子中,这个错误模式errmode不是必要的,但建议添加它。这种方法脚本时不停止运行误差产生一个致命的错误,捕捉任何错误的机会(当开发商抛出PDOException例外)。
setAttribute()线是强制性的,它讲述了PDO禁用模拟预备声明和使用一个真正的借口声明。这确保报表和值不解析PHP之前发送到MySQL数据库服务器(攻击者没有机会注入恶意SQL)。
当然,你可以设置字符集参数的构造函数选项,特别要注意'老'的PHP版本(5.3.6)将忽略字符在DSN设置参数。
解释(解释)
在SQL语句中,准备传递数据库服务器的含义解析并编译指定字符所发生的事情(如上例中的A或类似名称),告诉您要过滤数据库引擎的内容。然后用正义和指定参数值调用执行语句。
这里最重要的是,参数值组合和预编译的语句,而不是SQL的工作原理和string.sql注射是通过欺骗SQL脚本包括恶意字符串发送到数据库的创建。因此,通过发送实际的独立SQL参数,您可以使用减少风险。好的语句,任何你发送的参数,只会被视为一个字符串(虽然优化,数据库引擎可能会做一些参数,当然可能最终是数字)。在上面的例子中,如果变量$name contains'sarah;删除员工,结果只会是搜索string'sarah;删除员工
使用就绪句的另一个优点是,如果在同一个会话中多次执行同一语句,它将只进行一次解析和编译,从而使您获得一些速度增长。
好吧,既然你问如何插入,这里有一个例子(使用PDO):
美元美元->准备PreparedStatement =分贝('insert为表(列)的值(:柱));
$ PreparedStatement ->执行(阵列($ unsafevalue:柱= >));