pdo防止xss-pdo防注入

第三方分享代码
hacker 3年前 (2022-07-15) 黑客业务 94 3

目录介绍:

pdo 能完全防止sql注入吗

pdo query方法有没有防止sql注入的功能

传统的mysql_connect 、mysql_query方法存在很多注入风险,而使用PDO预处理机制可以有效的防止SQL注入风险。

请教php中关于使用pdo进行SQL语句的预处理防止注入的问题

$pdo = new PDO("mysql:host=192.168.0.1;dbname=test;charset=utf8","root");

$st = $pdo-prepare("select * from info where id =? and name = ?");

$id = 21;

$name = 'zhangsan';

$st-bindParam(1,$id);

$st-bindParam(2,$name);

$st-execute();

$st-fetchAll();

基本示例,我想你一看就明白了,望采纳。

请教关于php中使用pdo进行mysql语句的预处理来防止注入的问题

$pdo = new PDO(//配置);

$sql = 'SELECT field FROM table WHERE field=:condition';

$r = $pdo-prepare($sql);    

$r-execute(array(':condition'=$param)); 

//这里把参数直接以数组的形式传进去,其余工作prepare会自动帮你完成

//prepare的工作就是预先处理sql语句预防可能出现的注入,不然怎么会叫预处理呢

如何使用PDO查询Mysql来避免SQL注入风险

我把问题和赞同最多的答题翻译了下来。提问:如果用户的输入能直接插入到SQL语句中,那么这个应用就易收到SQL注入的攻击,举个例子:$unsafe_variable = $_POST['user_input']; mysqli_query("INSERT INTO table (column) VALUES ('" . $unsafe_variable . "')");用户可以输入诸如 : value'); DROP TABLE table;-- ,SQL语句就变成这样了:INSERT INTO table (column) VALUES('value'); DROP TABLE table;--')(译者注:这样做的结果就是把table表给删掉了) 我们可以做什么去阻止这种情况呢?回答:使用prepared statements(预处理语句)和参数化的查询。这些SQL语句被发送到数据库服务器,它的参数全都会被单独解析。使用这种方式,攻击者想注入恶意的SQL是不可能的。要实现这个主要有两种方式:1. 使用 PDO:$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需要注意的是使用PDO去访问MySQL数据库时,真正的prepared statements默认情况下是不使用的。为了解决这个问题,你需要禁用模拟的prepared statements。下面是使用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);上面的例子中,错误报告模式并不是强制和必须的,但建议你还是添加它。通过这种方式,脚本在出问题的时候不会被一个致命错误终止,而是抛出PDO Exceptions,这就给了开发者机会去捕获这个错误。然而第一行的 setAttribute() 是强制性的,它使得PDO禁用模拟的prepared statements并使用真正的prepared statements。这可以确保这些语句和值在被发送到MySQL服务器之前不会被PHP解析(这使得攻击者没有注入恶意SQL的机会)。尽管你可以使用可选的构造函数参数去设置 charset ,但重点需要注意的是小于5.3.6的PHP版本,DSN(Data Source Name)是默认忽略 charset 参数的。说明当你传一个SQL语句做预处理时会发生什么?它被数据库服务器解析和编译了。通过指定参数(通过之前例子中的 ? 或者像 :name 这样的命名式参数)你告诉数据库引擎你是想过滤它。接着当你调用 execute() 函数时,prepared statements会和你刚才指定的参数的值结合。在此重要的是,参数的值是和编译过的语句结合,而非一个SQL字符串。SQL注入就是当创建被发送到数据库的SQL语句时,通过欺骗的手段让脚本去引入恶意的字符串。因此当你使用单独的参数发送真实正确的SQL时,你就限制了被某些不是你真实意图的事情而搞挂掉的风险。使用prepared statements 传递的任何参数都会被当做字符串对待(不过数据库引擎可能会做一些优化,这些参数最终也可能变成numbers)(译者注:意思就是把参数当做一个字符串而不会去做额外的行为)。比如在上面的例子中,如果 $name 变量的值是 'Sarah'; DELETE * FROM employees ,产生的结果是会去搜索"'Sarah'; DELETE * FROM employees"这一整个字符串,最终的结果你也就不会面对的是一张空表了。使用prepared statements的另一个好处是,如果你在同一session中再次执行相同的语句,也就不会被再次解析和编译,这样你就获得一些速度上的提升。

PDO连接数据库和mysql_connect有什么具体区别? - 技术问答

PDO是PHP5新出来的东东,它是连接数据库的组件,听说以后php版本以PDO为默认连接,它可以适配多种数据库,mysql,mssql,oracle等,不像以前一种数据库有自己的连接方式和固定函数,它采取统一方式。那个快,现在我可以告诉你,mysql没测试过,但在mssql,oracle上测试过,PDO比传统要快将近10倍,特别是当web服务器与数据库不在同一计算机时,PDO显示的更快。这是我在单位老爷机上测试的。

用PHP做服务器接口客户端用http协议POST访问安全性一般怎么做

1.请求头里带用户username和password,到服务器端做验证,通过才继续下边业务逻辑。

优点:防止了服务器端api被随意调用。

缺点:每次都交互用户名和密码,交互量大,且密码明文传输不安全。

2.第一次请求,要求username和password,验证通过,种cookie到客户端,app保存cookie值。

每次请求带上cookie。

点评:和pc上浏览器认证的原理一样了。

以上两点,只有注册用户,才能有权访问业务逻辑,而app有大量的不需要注册数据api。

相关推荐

网友评论

  • (*)

最新评论

  • 访客 2022-07-15 19:56:38 回复

    法存在很多注入风险,而使用PDO预处理机制可以有效的防止SQL注入风险。请教php中关于使用pdo进行SQL语句的预处理防止注入的问题$pdo = new PDO("mysq

    1
  • 访客 2022-07-15 15:26:33 回复

    ;dbname=test;charset=utf8","root");$st = $pdo-prepare("select * from info where id =? and name = ?");$id = 21;$name = 'zha

    2
  • 访客 2022-07-15 18:22:50 回复

    t_result(); while ($row = $result-fetch_assoc()) { // do something with $row }PDO需要注意的是使用PDO去访问MySQL数据库时,真正的prepared statements默认情况下是不使用的

    3