2015-11-14 102 views
-1

我让PHP网站 使用用户/密码登录 但用户可以跳过这个页面使用
“=”“或”
'或1 = 1 喜欢这个 下面的代码文件Login_Check.php如何避免“=”“或”

`

include("includeszzz/host_conf.php"); 
include("includeszzz/mysql.lib.php"); 
$obj=new connect; 
$obj1=new connect; 
$username=$_GET["username"]; 
$password=$_GET["password"]; 
//echo $username; 
//echo $password; 
$sql="select username from admin where username='$username'"; 
$obj->query($sql); 
$U_num=$obj->num_rows(); 
//echo $U_num; 
if($U_num!=0) { 
$sql1="select password from admin where username='$username' and password='$password'"; 
$obj1->query($sql1); 
$P_num=$obj1->num_rows(); 
    if($P_num!=0) { 
     session_start(); 
     $_SESSION["zizo"]="$username"; 
    //header("location: welcome.php"); 
    echo "1"; 
} else { 
    echo "Invalid Password Please Try Again"; 
} 
} else { 
echo "Invalid Username Please Try Again"; 
} 

`

+1

你所经历称为[** SQL注入**](https://www.owasp.org/index .PHP/SQL_Injection)。阅读我刚才发布的链接和一个在@ NathanTuggy的评论。 –

回答

2

你要避免使用querie用户数据•不用任何类型的卫生设施。 http://php.net/manual/en/security.database.sql-injection.php

“实施例#5所述的组成的查询更安全的方式......”

<?php 

settype($offset, 'integer'); 
$query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;"; 

// please note %d in the format string, using %s would be meaningless 
$query = sprintf("SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET %d;", 
       $offset); 

?> 
  • 如果数据库层不支持绑定变量然后引用 的非数字用户提供的值传递给数据库 与特定数据库字符串逃逸的功能(例如 mysql_escape_string()和sqlite_escape_string(),等等)。如addslashes()通用 功能只有在非常特殊的 环境(例如MySQL的一个单字节字符与残疾人 NO_BACKSLASH_ESCAPES设置)是有用的,最好是避开他们。
  • 不要打印出任何数据库的具体信息,特别是有关 架构,通过不择手段。另请参见错误报告和错误处理 和日志功能。
  • 您可以使用存储过程和先前定义的光标 抽象数据访问,以便用户不直接访问表或 视图,但此解决方案具有另一个影响。

此外,您可以绑定参数的使用: http://php.net/manual/en/pdo.prepared-statements.php

<?php 
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); 
$stmt->bindParam(':name', $name); 
$stmt->bindParam(':value', $value); 

// insert one row 
$name = 'one'; 
$value = 1; 
$stmt->execute(); 

// insert another row with different values 
$name = 'two'; 
$value = 2; 
$stmt->execute(); 
?>