当前位置:首页 » 编程语言 » php防注入

php防注入

发布时间: 2022-01-09 01:12:52

php中如何防止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中再次执行相同的语句,也就不会被再次解析和编译,这样你就获得一些速度上的提升。

② php如何防止sql注入

这个方法比较多,这里简单举个例子:
提交的变量中所有的
'
(单引号),
"
(双引号),
\
(反斜线)
and
空字符会自动转为含有反斜线的转义字符,给SQL注入带来不少的麻烦。
请看清楚:“麻烦”而已~这并不意味着PHP防范SQL注入,书中就讲到了利用改变注入语句的编码来绕过转义的方法,比如将SQL语句转成ASCII编码(类似:char(100,58,92,108,111,99,97,108,104,111,115,116…)这样的格式),或者转成16进制编码,甚至还有其他形式的编码,这样以来,转义过滤便被绕过去了
//
去除转义字符

function stripslashes_array($array) {
if (is_array($array)) {
foreach ($array as $k => $v) {
$array[$k] = stripslashes_array($v);
}
}
else if (is_string($array)) {
$array = stripslashes($array);
} return $array;
}
@set_magic_quotes_runtime(0); // 判断 magic_quotes_gpc 状态
if (@get_magic_quotes_gpc()) {
$_GET = stripslashes_array($_GET);
$_POST = stripslashes_array($_POST);
$_COOKIE = stripslashes_array($_COOKIE);
}PHP防范SQL注入的代码
$keywords = addslashes($keywords); $keywords =
str_replace("_","\_",$keywords);//转义掉”_” $keywords =
str_replace("%","\%",$keywords);//转义掉”%”

③ php如何防范sql注入攻击

数据进行转义,
数据类型要转换判断,如id,要强制转换为整形。
mysql语句中 值要加上单引号

$username=addslashes($_GET['username']);
$id=intval($_GET['id']);

$sql="update member set username='$username' where id='id'";

ps:配置环境不同,有的环境下会对提交的数据自动进行转义,注意不要重复转义

④ php sql防注入

对用户传过来的参数加强验证,不要出现特殊的符号

⑤ php如何防被注入

首先,我个人认为最重要的一点是将magic_quotes_gpc高为ON,它的作用是将单引号,双引号,反斜线,和空字符转换为含有反斜线的字符,如 select * from admin where username='$username' and password='$password'语句,攻击者想用1' or 1='1跳过验证,但是,那些字符串将被转换成这样:select * from admin where username='a' and password='1\' or 1=\'1'从而达到阻止注入的目的,事实也就是自动进行了addslashes()操作.再不行的话,自己定义函数处理吧.现在看来,那些搞PHP注入的人也比较郁闷,因为myslq4以下版本不支持子语句,而新版本的mysql又会将magic_quotes_gpc选项默认为开.
解决包含文件漏洞用的方法就是:要求程序员包含文件里的参数尽量不要使用变量,如果使用变量,就一定要严格检查要包含的文件名,绝对不能由用户任意指定,建议设global_variables为off。

⑥ PHP防SQL注入问题

你说的只是php代码中可能会允许你使用注入语句,但是一般来说,网站防注入都是在链接数据库的类中加入了转换,也就是说把注入语句的关键字都加上了转义字符。比如你遇到的这种情况,就是被防注入了。
关于你这个问题:
问:输入框中的SQL语句应该如何写?
条件:数据库表、字段全已知,输入框长度不限。
我只能跟你说,你可以在输入框中加入;,/这种符号,让语句解析的时候出现问题,让php把sql语句拼合成两个或两个以上。这样你就可以在第二条语句之后加入你想要执行的命令了。
如果这种方法没有效果,你只能使用溢出的方式来注入!
如果帮助到您,请记得采纳为满意答案哈,谢谢!祝您生活愉快!
vae.la

⑦ php如何防止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预处理

⑧ 如何防止代码注入攻击在PHP

一,HTML防注入。
一般的html注入都是在字符串中加入了html标签,用下JAVA代码可以去掉这部分代码。
代码如下,自己封装成方法即可。
String msge = "asdasdasdasd <div id=\"f\">asdfsdf";
System.out.println(msge);
msge = msge.replace("&", "&");
msge = msge.replace("<", "<");
msge = msge.replace(" ", " ");
msge = msge.replace(">", ">");
msge = msge.replace("\"", """);
msge = msge.replace("'", "&qpos;");
System.out.println(msge);
二、防SQL注入
最简单最容易的是限制用户输入。
简单点的就是不允许用户输入单引号 和 --,因为单引号号--在SQL中都是影响执行的。
但SQL注入是多方面的,防止的方法也有很多种。
1、地址栏禁止特殊字符防SQL注入

把特殊字符(如and、or、'、")都禁止提交就可以防止注入了。

2、php过滤html字符串,防止SQL注入
批量过滤post,get敏感数据
$_GET = stripslashes_array($_GET);
$_POST = stripslashes_array($_POST);
数据过滤函数
function stripslashes_array(&$array) {
while(list($key,$var) = each($array)) {
if ($key != 'argc' && $key != 'argv' && (strtoupper($key) != $key || ''.intval($key) == "$key")) {
if (is_string($var)) {
$array[$key] = stripslashes($var);
}
if (is_array($var)) {
$array[$key] = stripslashes_array($var);
}
}
}
return $array;
}
3、替换HTML尾标签
function lib_replace_end_tag($str)
{
if (empty($str)) return false;
$str = htmlspecialchars($str);
$str = str_replace( '/', "", $str);
$str = str_replace("\\", "", $str);
$str = str_replace(">", "", $str);
$str = str_replace("<", "", $str);
$str = str_replace("<SCRIPT>", "", $str);
$str = str_replace("</SCRIPT>", "", $str);
$str = str_replace("<script>", "", $str);
$str = str_replace("</script>", "", $str);
$str=str_replace("select","select",$str);
$str=str_replace("join","join",$str);
$str=str_replace("union","union",$str);
$str=str_replace("where","where",$str);
$str=str_replace("insert","insert",$str);
$str=str_replace("delete","delete",$str);
$str=str_replace("update","update",$str);
$str=str_replace("like","like",$str);
$str=str_replace("drop","drop",$str);
$str=str_replace("create","create",$str);
$str=str_replace("modify","modify",$str);
$str=str_replace("rename","rename",$str);
$str=str_replace("alter","alter",$str);
$str=str_replace("cas","cast",$str);
$str=str_replace("&","&",$str);
$str=str_replace(">",">",$str);
$str=str_replace("<","<",$str);
$str=str_replace(" ",chr(32),$str);
$str=str_replace(" ",chr(9),$str);
$str=str_replace(" ",chr(9),$str);
$str=str_replace("&",chr(34),$str);
$str=str_replace("'",chr(39),$str);
$str=str_replace("<br />",chr(13),$str);
$str=str_replace("''","'",$str);
$str=str_replace("css","'",$str);
$str=str_replace("CSS","'",$str);
return $str;
}
三、专业的事情交给专业的工具去做。
安装安全软件。例如,在服务器中安装“服务器安全狗”,可以设置防注入,防攻击的设置,只要设置好安全规则,就可以屏蔽大多数攻击入侵。

⑨ PHP中该怎样防止SQL注入

比较有效的方式,放入到公共的配置文件中。360safe.php

<?php
//CodeBySafe3
functioncustomError($errno,$errstr,$errfile,$errline)
{
echo"<b>Errornumber:</b>[$errno],erroronline$errlinein$errfile<br/>";
die();
}
set_error_handler("customError",E_ERROR);
$getfilter="'|(and|or)\b.+?(>|<|=|in|like)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";
$postfilter="\b(and|or)\b.{1,6}?(=|>|<|\bin\b|\blike\b)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";
$cookiefilter="\b(and|or)\b.{1,6}?(=|>|<|\bin\b|\blike\b)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";
functionStopAttack($StrFiltKey,$StrFiltValue,$ArrFiltReq){

if(is_array($StrFiltValue))
{
$StrFiltValue=implode($StrFiltValue);
}
if(preg_match("/".$ArrFiltReq."/is",$StrFiltValue)==1){
//slog("<br><br>操作IP:".$_SERVER["REMOTE_ADDR"]."<br>操作时间:".strftime("%Y-%m-%d%H:%M:%S")."<br>操作页面:".$_SERVER["PHP_SELF"]."<br>提交方式:".$_SERVER["REQUEST_METHOD"]."<br>提交参数:".$StrFiltKey."<br>提交数据:".$StrFiltValue);
print"360websecnotice:Illegaloperation!";
exit();
}
}
//$ArrPGC=array_merge($_GET,$_POST,$_COOKIE);
foreach($_GETas$key=>$value){
StopAttack($key,$value,$getfilter);
}
foreach($_POSTas$key=>$value){
StopAttack($key,$value,$postfilter);
}
foreach($_COOKIEas$key=>$value){
StopAttack($key,$value,$cookiefilter);
}
if(file_exists('update360.php')){
echo"请重命名文件update360.php,防止黑客利用<br/>";
die();
}
functionslog($logs)
{
$toppath=$_SERVER["DOCUMENT_ROOT"]."/log.htm";
$Ts=fopen($toppath,"a+");
fputs($Ts,$logs." ");
fclose($Ts);
}
?>

⑩ php 如何防止链接注入

可以使用strip_tags函数,去除html标签,就包括去除<a>标签了
给你个例子,php官方手册上的,你也可以自己查一下这个函数的用法
<?php
$text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other text</a>';
echo strip_tags($text);
echo "\n";
echo strip_tags($text, '<p><a>'); //允许<p>、<a>标签

?>
输出结果:
Test paragraph. Other text
<p>Test paragraph.</p> <a href="#fragment">Other text</a>
希望对你有点帮助

热点内容
单片机android 发布:2024-09-20 09:07:24 浏览:760
如何提高三星a7安卓版本 发布:2024-09-20 08:42:35 浏览:660
如何更换服务器网站 发布:2024-09-20 08:42:34 浏览:306
子弹算法 发布:2024-09-20 08:41:55 浏览:284
手机版网易我的世界服务器推荐 发布:2024-09-20 08:41:52 浏览:813
安卓x7怎么边打游戏边看视频 发布:2024-09-20 08:41:52 浏览:158
sql数据库安全 发布:2024-09-20 08:31:32 浏览:90
苹果连接id服务器出错是怎么回事 发布:2024-09-20 08:01:07 浏览:503
编程键是什么 发布:2024-09-20 07:52:47 浏览:655
学考密码重置要求的证件是什么 发布:2024-09-20 07:19:46 浏览:479