① 如何使用PDO查询Mysql来避免SQL注入风险
过滤一些常见的数据库操作关键字,
select ,insert,update,delete,and,*等或通过系统函数addslashes对内容进行过滤
php配置文件中register_globals=off;设置为关闭状态.(作用将注册全局变量关闭);如接收POST表单的值使用$_POST['user'],假设设置为ON的话$user才接收值
sql语句书写的时候尽量不要省略小引号(tab上面那个)和单引号
提高数据库命名技巧,对于一些重要的字段根据程序的特点命名,使之不易被猜中
对于常的方法加以封装,避免直接暴漏SQL语句
开启PHP安全模式safe_mode=on
打开magic_quotes_gpc来防止SQL注入,默认为关闭,开启后自动把用户提交sql查询语句进行转换把"'"转换成"\'"
控制错误信息输出,关闭错误信息提示,将错误信息写到系统日志
使用MYSQLI或PDO预处理
② 防sql注入为什么要用pdo
防止sql注入的方式有很多,比如禁止输入特殊字符”||“,”'“等,或者将密码等验证字段进行MD5加密后再进行数据校验都可以防止sql注入
③ PHP中该怎样防止SQL注入
这里聊这么大的话题没时间了?建议你用mysqli
防SQL注入(? 占位) ,后期传的值不会当成SQL语句
<?php
$mysqli=new mysqli("localhost", "root", "123456", "xsphpdb");
$stmt=$mysqli->prepare("select id, name, price, num, desn from shops where id>?");
$stmt->bind_param("i", $id);
$stmt->bind_result($id, $name, $price, $num, $desn);
$id=99;
$stmt->execute();
$stmt->store_result(); //一次性将结果都取过来 重要
//字段信息
$result=$stmt->result_metadata();
while($field=$result->fetch_field()){
echo $field->name."--";
}
echo '<br>';
//记录信息
//$stmt->data_seek(2);
while($stmt->fetch()){
echo "$id--$name---$price---$num---$desn <br>";
}
echo "记录总数:".$stmt->num_rows;
$stmt->free_result();
$stmt->close();
?>
④ pdo 能完全防止sql注入吗
pdo query方法有没有防止sql注入的功能
传统的mysql_connect 、mysql_query方法存在很多注入风险,而使用PDO预处理机制可以有效的防止SQL注入风险。
⑤ php中防止SQL注入,该如何解决
php注入,原则上是因为sql拼接引起的。
通常避免sql注入的原则是:
类型校验,比如int类型的字段进行强制转换intval。
避免字符型的sql拼接,使用unhex绕过sql解析截断的字符处理。
举个例子:
select * from pass where username = '$a';
这种情况,当$a="1' or 1 = 1 or '2' = '2"情况时,真个sql变成了
select * from pass where username = '1' or 1 = 1 or '2' = '2' ;
那么这个sql就会改变sql原有语义。
类型校验大家都会,这里就不进行说明了,下面说明下使用unhex来进行字符型字段转码,绕过sql语义解析截断避免sql注入。
使用unhex(bin2hex)后,原有逻辑变成
$a = bin2hex($a);
select * from pass where username = unhex('$a') ;
由于bin2hex,$a转化成16进制数避免了sql注入的风险。
sql执行阶段,优先执行sql语义解析,而后进行unhex('$a') 的运算,所以会把"1' or 1 = 1 or '2' = '2"整个字符串当做一个字段执行,而不会进行解析,避免了sql注入问题~
⑥ php防sql注入
最简单的方法是使用addslashes()函数处理SQL语句,但不推荐这么做。因为这样做也会有一定的风险。
推荐的方法是使用参数式查询。下面是使用PDO扩展查询mysql的示例代码:
<?php
$pdo=newPDO('...');//连接字符串略
$stmt=$pdo->prepare('select*frommytablewherename=:name');
$stmt->execute(array(':name':''namehasquote'));
PDO库可以自动完成引号转义,避免SQL注入。
望采纳,谢谢支持!
⑦ PHP要怎么防止SQL注入
防止注入最简单的办法就是本地生成html文件,然后上传到网站空间内,全站的html是无法被注入攻击的,除非服务器被干掉。如果一定要将php代码放到网站上,那么需要防止的内容就要做的很多了,其中最重要的一条就是书写代码的规范程度,以及对用户提交的验证规范。如果用到专门的cms去做网站的话,一定要定时下载升级,并到相关的官方论坛及一些白客站点查看最新漏洞源码信息,加以改正,可以有效的防止注入攻击。
在注册时防止注入,其实最主要的一条就是在写入、查询数据库之前完成对用户录入数据的验证。具体如何验证可以网络搜索一下
⑧ 如何使用PDO查询mysql避免SQL注入的方法
使用PDO或者MySQLi,有很多封装好的方便的Class。 例如使用PHP-PDO-MySQL-Class · GitHub(这个Class使用上比较类似Python的MySQLdb)的话,这样就是安全的: 直接拼接字符串则是危险的:
⑨ php中防止SQL注入的最好方法是什么
使用预备义语句和参数化查询。对于带有任何参数的sql语句都会被发送到数据库服务器,并被解析!对于攻击者想要恶意注入sql是不可能的! 实现这一目标基本上有两种选择: 1.使用PDO(PHP Data Objects ):$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute(array(':name' => $name)); foreach ($stmt as $row) { // do something with $row }2.使用mysqli:$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?'); $stmt->bind_param('s', $name); $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // do something with $row }PDO(PHP数据对象) 注意当使用PDO访问MySQL数据库真正的预备义语句并不是默认使用的!为了解决这个问题,你必须禁用仿真准备好的语句。使用PDO创建连接的例子如下: $dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass'); $dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);在上面例子中错误模式ERRMODE不是严格必须的,但是建议添加它。当运行出错产生致命错误时,这种方法脚本不会停止。并给开发人员捕捉任何错误的机会(当抛出PDOException异常时)。 setAttribute()那一行是强制性的,它告诉PDO禁用仿真预备义语句,使用真正的预备义语句。这可以确保语句和值在发送给MySQL数据库服务器前不被PHP解析(攻击者没有机会注入恶意的SQL). 当然你可以在构造函数选项中设置字符集参数,特别注意'老'的PHP版本(5.3.6)会在DSN中忽略掉字符集参数。 这里最重要的是,该参数值是和预编译的语句结合的,而不是和一个SQL字符串.SQL注入的工作原理是通过欺骗手段创建的SQL脚本包括恶意字符串发送到数据库.因此,通过发送实际的分开的sql参数,你会降低风险.使用准备好的语句时,你发送的任何参数,将只被视为字符串(虽然数据库引擎可能会做一些参数的优化,当然最终可能会为数字).在上面的例子中,如果变量$name包含'sarah';DELETE * FROM employees,结果只会是一个搜索的字符串"'sarah';DELETE * FROM employees",你不会得到一个空表。 使用准备好的语句的另一个好处是,如果你在同一会话中多次执行相同的语句,这将只被解析和编译一次,给你一些的速度增长。